Fortran

时间:2017-06-29 11:29:50

标签: memory memory-leaks fortran virtual-memory

我有一个很大的Fortran / MPI代码,在运行时使用了大量的VIRT内存(~20G),尽管使用的实际内存(500 mb)非常适中。

如何分析代码以了解哪个部分产生了这个巨大的VIRT内存?

在这个阶段,我甚至乐意使用蛮力方法。 我试过的是将sleep语句放入代码中并通过" top"记录内存使用情况。试图通过二分法来确定大分配的位置。 但是,这不起作用,因为睡眠调用将内存使用量设置为0.有没有办法在保持当前内存使用的同时冻结代码?

PS:我已经尝试过VALGRIND,但是代码太大了,VALGRIND从未完成。是否还有一种替代VALGRIND的方法是" easy"用过?

谢谢,

萨姆

1 个答案:

答案 0 :(得分:1)

对此的一个解决方案是修改(获取VIRT内存)子程序来自Fortran 90中的跟踪内存使用

subroutine system_mem_usage(valueRSS)
use ifport !if on intel compiler
implicit none
integer, intent(out) :: valueRSS

character(len=200):: filename=' '
character(len=80) :: line
character(len=8)  :: pid_char=' '
integer :: pid
logical :: ifxst

valueRSS=-1    ! return negative number if not found

!--- get process ID

pid=getpid()
write(pid_char,'(I8)') pid
filename='/proc/'//trim(adjustl(pid_char))//'/status'

!--- read system file

inquire (file=filename,exist=ifxst)
if (.not.ifxst) then
  write (*,*) 'system file does not exist'
  return
endif

open(unit=100, file=filename, action='read')
do
  read (100,'(a)',end=120) line
  if (line(1:7).eq.'VmSize:') then
     read (line(8:),*) valueRSS
     exit
  endif
enddo
120 continue
close(100)

return
end subroutine system_mem_usage