sponce
sponce

Reputation: 1399

Large VIRT memory in Fortran

I have a large Fortran/MPI code that when running uses a very large amount of VIRT memory (~20G) although the actual memory used (500 mb) is quite modest.

How can I profile the code to understand which part produces this huge VIRT memory?

At this stage, I'm even happy to use a brute force approach. What I have tried is to put sleep statements in the code and recorded the memory usage through "top" to try to pin-point by bisection where the big allocation are. However, this does not work as the sleep call puts the memory usage to 0. Is there a way to freeze the code while keeping current memory usage?

PS: I have tried VALGRIND but the code being so large, VALGRIND never finished. Is there an alternative to VALGRIND that is "easy" to used?

Thank you,

Sam

Upvotes: 0

Views: 102

Answers (1)

sponce
sponce

Reputation: 1399

A solution for this is this modified (to get VIRT memory) subroutine from Track memory usage in 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

Upvotes: 1

Related Questions