Write the current memory status into the memfile.
The file will be opened and closed, so this might be slow. Only the root process writes to this file, but the data is gathered from all processes. The output will be prepended by the current date. We will track the VmHWM: from /proc/self/status, MemFree:, Buffers: and Cached: from /proc/meminfo and pgmajfault from /proc/vmstat The min, max and average across all processes will be recorded.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=*), | intent(in) | :: | memfile | |||
integer, | intent(in) | :: | iteration |
subroutine tem_trackmem(memfile, iteration) character(len=*), intent(in) :: memfile integer, intent(in) :: iteration integer :: myMem(5), minMem(5), maxMem(5) integer :: nProcs integer :: iError integer :: funit integer :: myRank logical :: fexists character(len=8) :: fstat character(len=8) :: today character(len=10) :: now real :: myScale(5) real :: sumMem(5) real :: avgMem(5) if (trim(memfile) /= '') then call MPI_Comm_Size(MPI_COMM_WORLD, nProcs, iError) myMem(1) = my_status_int('VmHWM:') myMem(2:4) = my_status_int_vec( key = ['MemFree:', 'Buffers:', & & 'Cached: '], & & info = '/proc/meminfo' ) myMem(5) = my_status_int(key = 'pgmajfault', info = '/proc/vmstat') call MPI_Reduce(myMem, minMem, 5, MPI_INTEGER, MPI_MIN, 0, & & MPI_COMM_WORLD, iError) call MPI_Reduce( myMem, maxMem, 5, MPI_INTEGER, MPI_MAX, 0, & & MPI_COMM_WORLD, iError ) myScale(1:4) = real(myMem(1:4))/1024.0 myScale(5) = real(myMem(5)) call MPI_Reduce( myScale, sumMem, 5, MPI_REAL, MPI_SUM, 0, & & MPI_COMM_WORLD, iError ) avgMem = sumMem / real(nProcs) inquire(file = trim(memfile), exist = fexists) if (fexists) then fstat = 'old' else fstat = 'new' end if call MPI_Comm_rank(MPI_COMM_WORLD, myRank, iError) if (myRank == 0) then call tem_open( file = trim(memfile), & & newunit = funit, & & status = trim(fstat), & & action = 'write', & & position = 'append', & & form = 'formatted' ) call date_and_time(date = today, time = now) write(funit,'(a)') today // ': ' // now write(funit, '(a,I5)') ' iteration ', iteration write(funit,'(a,3(1x,f11.3))') ' VmHWM (min/max/avg):', & & minMem(1)/1024.0, & & maxMem(1)/1024.0, avgMem(1) write(funit,'(a,3(1x,f11.3))') ' MemFree (min/max/avg):', & & minMem(2)/1024.0, & & maxMem(2)/1024.0, avgMem(2) write(funit,'(a,3(1x,f11.3))') ' Buffers (min/max/avg):', & & minMem(3)/1024.0, & & maxMem(3)/1024.0, avgMem(3) write(funit,'(a,3(1x,f11.3))') ' Cached (min/max/avg):', & & minMem(4)/1024.0, & & maxMem(4)/1024.0, avgMem(4) write(funit,'(a,i0,1x,i0,1x,f11.3)') ' pgmajflt(min/max/avg):', & & minMem(5), maxMem(5), avgMem(5) write(funit,'(a)') '' close(funit) end if end if end subroutine tem_trackmem