2017-06-29 1 views
0

J'ai un grand code Fortran/MPI qui, lors de l'exécution, utilise une très grande quantité de mémoire VIRT (~ 20G) bien que la mémoire utilisée (500 mb) soit assez modeste.Grande mémoire VIRT en Fortran

Comment puis-je profiler le code pour comprendre quelle partie produit cette énorme mémoire VIRT? À ce stade, je suis même heureux d'utiliser une approche de force brute. Ce que j'ai essayé est de mettre des instructions de sommeil dans le code et enregistré l'utilisation de la mémoire à travers "top" pour essayer de localiser par bissection où la grande allocation sont. Toutefois, cela ne fonctionne pas car l'appel de mise en veille met l'utilisation de la mémoire à 0. Existe-t-il un moyen de geler le code tout en conservant l'utilisation actuelle de la mémoire? PS: J'ai essayé VALGRIND mais le code étant si grand, VALGRIND n'a jamais fini. Existe-t-il une alternative à VALGRIND qui soit "facile" à utiliser?

Merci,

Sam

+1

Avez-vous essayé [ce] (https://stackoverflow.com/questions/22028571/track-memory-usage-in-fortran-90)? – A4L

+0

Ça aide. Merci ! – sponce

Répondre

0

Une solution pour cela est cette modification (pour obtenir la mémoire VIRT) sous-programme d'utilisation de la mémoire piste en 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