diff --git a/f90/UTILS/ModEM_getrusage.c b/f90/UTILS/ModEM_getrusage.c index edd61e0a..5056c49e 100644 --- a/f90/UTILS/ModEM_getrusage.c +++ b/f90/UTILS/ModEM_getrusage.c @@ -12,27 +12,28 @@ * To call this C function from Fortran, use this interface: * * interface -* subroutine get_maxrss() result(maxrss) bind(c) +* subroutine get_maxrss(maxrss_bytes) bind(c) * use iso_c_binding, only : c_long -* integer (c_long), intent(out) :: maxrss +* integer (c_long), intent(out) :: maxrss_bytes * end subroutine get_maxrss * end interface */ void get_maxrss(long *maxrss_bytes) { - int conversion; + long conversion; struct rusage usage; -#if defined(__APPLE_) || defined(__MACH__) - // BSD's ru_maxrss (used by Apple) is in bytes - conversion = 1.0; -#elif __linux__ - // Linux's ru_maxrss is in KiB - conversion = 1000.0; +#if defined(__APPLE__) && defined(__MACH__) + // On macOS, ru_maxrss is already in bytes. + conversion = 1L; +#elif defined(__linux__) + // On Linux, ru_maxrss is reported in KiB. + conversion = 1024L; #else - conversion = 1.0; + // Other BSDs (FreeBSD, OpenBSD, NetBSD) also report KiB. + conversion = 1024L; #endif getrusage(RUSAGE_SELF, &usage); - *maxrss_bytes = usage.ru_maxrss / conversion; + *maxrss_bytes = usage.ru_maxrss * conversion; } diff --git a/f90/UTILS/ModEM_memory.f90 b/f90/UTILS/ModEM_memory.f90 index 158cbdb1..c1dec646 100644 --- a/f90/UTILS/ModEM_memory.f90 +++ b/f90/UTILS/ModEM_memory.f90 @@ -15,6 +15,7 @@ module ModEM_memory use utilities use iso_c_binding, only : c_long + use iso_fortran_env, only : int64, real64 #ifdef MPI use mpi #endif @@ -24,8 +25,6 @@ module ModEM_memory private - integer :: task_id - public ModEM_memory_print_report public ModEM_memory_log_report #ifdef MPI @@ -38,7 +37,7 @@ subroutine ModEM_memory_get_maxrss(maxrss_bytes) implicit none - integer, intent(out) :: maxrss_bytes + integer (int64), intent(out) :: maxrss_bytes integer (c_long) :: maxrss_bytes_c #ifdef MODEM_MEMORY @@ -50,7 +49,7 @@ end subroutine get_maxrss end interface call get_maxrss(maxrss_bytes_c) - maxrss_bytes = maxrss_bytes_c + maxrss_bytes = int(maxrss_bytes_c, int64) #else write(0,*) "ERROR: ModEM was not built with the ModEM_getrusage.c file!" write(0,*) "ERROR: In order to use ModEM_memory routines you must" @@ -64,16 +63,16 @@ subroutine ModEM_memory_print_report(message) implicit none - integer :: maxrss + integer (int64) :: maxrss character (len=*), intent(in) :: message - real :: maxrss_bytes, maxrss_kb, maxrss_mb, maxrss_gb - character (len=*), parameter :: LOG_MSG_FMT = "(I4.4, A, A, A, F18.1, A, F18.1, A, F18.1, A)" + real (real64) :: maxrss_kb, maxrss_mb, maxrss_gb + character (len=*), parameter :: LOG_MSG_FMT = "(A, A, F18.1, A, F18.1, A, F18.1, A)" character (len=512) :: log_message call ModEM_memory_get_maxrss(maxrss) call ModEM_memory_convert_maxrss(maxrss, maxrss_kb, maxrss_mb, maxrss_gb) - write(log_message, LOG_MSG_FMT) task_id, ' - ', trim(message), ", ", maxrss_kb, ' kb ', maxrss_mb, ' mb ', maxrss_gb, ' gb' + write(log_message, LOG_MSG_FMT) trim(message), ", ", maxrss_kb, ' kb ', maxrss_mb, ' mb ', maxrss_gb, ' gb' write(6,*) trim(log_message) end subroutine ModEM_memory_print_report @@ -82,14 +81,14 @@ subroutine ModEM_memory_convert_maxrss(maxrss_bytes, maxrss_kb, maxrss_mb, maxrs implicit none - integer :: maxrss_bytes - real, intent(out) :: maxrss_kb - real, intent(out) :: maxrss_mb - real, intent(out) :: maxrss_gb + integer (int64), intent(in) :: maxrss_bytes + real (real64), intent(out) :: maxrss_kb + real (real64), intent(out) :: maxrss_mb + real (real64), intent(out) :: maxrss_gb - maxrss_kb = maxrss_bytes / 1.0 - maxrss_mb = maxrss_kb / 1000.0 - maxrss_gb = maxrss_mb / 1000.1 + maxrss_kb = real(maxrss_bytes, real64) / 1024.0_real64 + maxrss_mb = maxrss_kb / 1024.0_real64 + maxrss_gb = maxrss_mb / 1024.0_real64 end subroutine ModEM_memory_convert_maxrss @@ -99,8 +98,8 @@ subroutine ModEM_memory_log_report(message) character (len=*), intent(in) :: message character (len=*), parameter :: LOG_MSG_FMT = "(A, A, F18.1, A, F18.1, A, F18.1, A)" - integer :: maxrss - real :: maxrss_kb, maxrss_mb, maxrss_gb + integer (int64) :: maxrss + real (real64) :: maxrss_kb, maxrss_mb, maxrss_gb character (len=512) :: log_message call ModEM_memory_get_maxrss(maxrss) @@ -120,12 +119,12 @@ subroutine ModEM_memory_get_all(message) character (len=*), parameter :: LOG_MSG_FMT = "(A, A, F18.1, A, F18.1, A, F18.1, A)" character (len=512) :: log_message - integer :: maxrss, global_maxrss - real :: maxrss_kb, maxrss_mb, maxrss_gb + integer (int64) :: maxrss, global_maxrss + real (real64) :: maxrss_kb, maxrss_mb, maxrss_gb call ModEM_memory_get_maxrss(maxrss) - call MPI_reduce(maxrss, global_maxrss, 1, MPI_INTEGER, MPI_SUM, 0, MPI_COMM_WORLD, ierr) + call MPI_reduce(maxrss, global_maxrss, 1, MPI_INTEGER8, MPI_SUM, 0, MPI_COMM_WORLD, ierr) if (taskid == 0) then call ModEM_memory_convert_maxrss(global_maxrss, maxrss_kb, maxrss_mb, maxrss_gb)