Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions f90/UTILS/ModEM_getrusage.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
39 changes: 19 additions & 20 deletions f90/UTILS/ModEM_memory.f90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,8 +25,6 @@ module ModEM_memory

private

integer :: task_id

public ModEM_memory_print_report
public ModEM_memory_log_report
#ifdef MPI
Expand All @@ -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
Expand All @@ -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"
Expand All @@ -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
Expand All @@ -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

Expand All @@ -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)
Expand All @@ -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)
Expand Down
Loading