1f72e1d79SBarry Smith #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for getpagesize() with c89 */ 2c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 3e5c89e4eSSatish Balay #if defined(PETSC_HAVE_PWD_H) 4e5c89e4eSSatish Balay #include <pwd.h> 5e5c89e4eSSatish Balay #endif 6e5c89e4eSSatish Balay #include <ctype.h> 7e5c89e4eSSatish Balay #include <sys/stat.h> 8e5c89e4eSSatish Balay #if defined(PETSC_HAVE_UNISTD_H) 9e5c89e4eSSatish Balay #include <unistd.h> 10e5c89e4eSSatish Balay #endif 11e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_UTSNAME_H) 12e5c89e4eSSatish Balay #include <sys/utsname.h> 13e5c89e4eSSatish Balay #endif 14e5c89e4eSSatish Balay #include <fcntl.h> 15e5c89e4eSSatish Balay #include <time.h> 16e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H) 17e5c89e4eSSatish Balay #include <sys/systeminfo.h> 18e5c89e4eSSatish Balay #endif 19e5c89e4eSSatish Balay 20e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_RESOURCE_H) 21e5c89e4eSSatish Balay #include <sys/resource.h> 22e5c89e4eSSatish Balay #endif 23e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_PROCFS_H) 24e5c89e4eSSatish Balay /* #include <sys/int_types.h> Required if using gcc on solaris 2.6 */ 25e5c89e4eSSatish Balay #include <sys/procfs.h> 26e5c89e4eSSatish Balay #endif 27e5c89e4eSSatish Balay #if defined(PETSC_HAVE_FCNTL_H) 28e5c89e4eSSatish Balay #include <fcntl.h> 29e5c89e4eSSatish Balay #endif 30e5c89e4eSSatish Balay 31e30d2299SSatish Balay /*@ 32e5c89e4eSSatish Balay PetscMemoryGetCurrentUsage - Returns the current resident set size (memory used) 33e5c89e4eSSatish Balay for the program. 34e5c89e4eSSatish Balay 35e5c89e4eSSatish Balay Not Collective 36e5c89e4eSSatish Balay 37e5c89e4eSSatish Balay Output Parameter: 38e5c89e4eSSatish Balay . mem - memory usage in bytes 39e5c89e4eSSatish Balay 40e5c89e4eSSatish Balay Options Database Key: 41a2b725a8SWilliam Gropp + -memory_view - Print memory usage at end of run 42811af0c4SBarry Smith . -log_view_memory - Display memory information for each logged event 432d853995SBarry Smith - -malloc_view - Print usage of `PetscMalloc()` in `PetscFinalize()` 44e5c89e4eSSatish Balay 45e5c89e4eSSatish Balay Level: intermediate 46e5c89e4eSSatish Balay 47e5c89e4eSSatish Balay Notes: 48e5c89e4eSSatish Balay The memory usage reported here includes all Fortran arrays 49e5c89e4eSSatish Balay (that may be used in application-defined sections of code). 50e5c89e4eSSatish Balay This routine thus provides a more complete picture of memory 51811af0c4SBarry Smith usage than `PetscMallocGetCurrentUsage()` for codes that employ Fortran with 52e5c89e4eSSatish Balay hardwired arrays. 53e5c89e4eSSatish Balay 54811af0c4SBarry Smith This value generally never decreases during a run even if the application has freed much of its memory that it allocated 55e5c89e4eSSatish Balay 56811af0c4SBarry Smith .seealso: `PetscMallocGetMaximumUsage()`, `PetscMemoryGetMaximumUsage()`, `PetscMallocGetCurrentUsage()`, `PetscMemorySetGetMaximumUsage()`, `PetscMemoryView()` 57e5c89e4eSSatish Balay @*/ 58d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *mem) 59d71ae5a4SJacob Faibussowitsch { 60e5c89e4eSSatish Balay #if defined(PETSC_USE_PROCFS_FOR_SIZE) 61e5c89e4eSSatish Balay FILE *file; 62e5c89e4eSSatish Balay int fd; 63e5c89e4eSSatish Balay char proc[PETSC_MAX_PATH_LEN]; 64e5c89e4eSSatish Balay prpsinfo_t prusage; 65e5c89e4eSSatish Balay #elif defined(PETSC_USE_SBREAK_FOR_SIZE) 66e5c89e4eSSatish Balay long *ii = sbreak(0); 67e5c89e4eSSatish Balay int fd = ii - (long *)0; 68cb31d0b8SSatish Balay #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) 69e5c89e4eSSatish Balay FILE *file; 70e5c89e4eSSatish Balay char proc[PETSC_MAX_PATH_LEN]; 71ed9cf6e9SBarry Smith int mm, rss, err; 72e5c89e4eSSatish Balay #elif defined(PETSC_HAVE_GETRUSAGE) 73e5c89e4eSSatish Balay static struct rusage temp; 74e5c89e4eSSatish Balay #endif 75e5c89e4eSSatish Balay 76e5c89e4eSSatish Balay PetscFunctionBegin; 77e5c89e4eSSatish Balay #if defined(PETSC_USE_PROCFS_FOR_SIZE) 78e5c89e4eSSatish Balay 79a364092eSJacob Faibussowitsch PetscCall(PetscSNPrintf(proc, PETSC_STATIC_ARRAY_LENGTH(proc), "/proc/%d", (int)getpid())); 80cc73adaaSBarry Smith PetscCheck((fd = open(proc, O_RDONLY)) != -1, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Unable to access system file %s to get memory usage data", file); 8108401ef6SPierre Jolivet PetscCheck(ioctl(fd, PIOCPSINFO, &prusage) != -1, PETSC_COMM_SELF, PETSC_ERR_FILE_READ, "Unable to access system file %s to get memory usage data", file); 824097fa8bSSatish Balay *mem = (PetscLogDouble)prusage.pr_byrssize; 83e5c89e4eSSatish Balay close(fd); 84e5c89e4eSSatish Balay 85e5c89e4eSSatish Balay #elif defined(PETSC_USE_SBREAK_FOR_SIZE) 86e5c89e4eSSatish Balay 87e5c89e4eSSatish Balay *mem = (PetscLogDouble)(8 * fd - 4294967296); /* 2^32 - upper bits */ 88e5c89e4eSSatish Balay 89e5c89e4eSSatish Balay #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) 90a364092eSJacob Faibussowitsch PetscCall(PetscSNPrintf(proc, PETSC_STATIC_ARRAY_LENGTH(proc), "/proc/%d/statm", (int)getpid())); 91*57508eceSPierre Jolivet PetscCheck(file = fopen(proc, "r"), PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Unable to access system file %s to get memory usage data", proc); 9208401ef6SPierre Jolivet PetscCheck(fscanf(file, "%d %d", &mm, &rss) == 2, PETSC_COMM_SELF, PETSC_ERR_SYS, "Failed to read two integers (mm and rss) from %s", proc); 934097fa8bSSatish Balay *mem = ((PetscLogDouble)rss) * ((PetscLogDouble)getpagesize()); 94ed9cf6e9SBarry Smith err = fclose(file); 9528b400f6SJacob Faibussowitsch PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fclose() failed on file"); 96e5c89e4eSSatish Balay 97e5c89e4eSSatish Balay #elif defined(PETSC_HAVE_GETRUSAGE) 98e5c89e4eSSatish Balay getrusage(RUSAGE_SELF, &temp); 99e5c89e4eSSatish Balay #if defined(PETSC_USE_KBYTES_FOR_SIZE) 1004097fa8bSSatish Balay *mem = 1024.0 * ((PetscLogDouble)temp.ru_maxrss); 10151c90db5SBarry Smith #elif defined(PETSC_USE_PAGES_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) 1024097fa8bSSatish Balay *mem = ((PetscLogDouble)getpagesize()) * ((PetscLogDouble)temp.ru_maxrss); 103cb31d0b8SSatish Balay #else 10451c90db5SBarry Smith *mem = temp.ru_maxrss; 105e5c89e4eSSatish Balay #endif 106e5c89e4eSSatish Balay 107e5c89e4eSSatish Balay #else 108e5c89e4eSSatish Balay *mem = 0.0; 109e5c89e4eSSatish Balay #endif 1103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 111e5c89e4eSSatish Balay } 112e5c89e4eSSatish Balay 11395c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscMemoryCollectMaximumUsage; 11495c0884eSLisandro Dalcin PETSC_INTERN PetscLogDouble PetscMemoryMaximumUsage; 11595c0884eSLisandro Dalcin 116ace3abfcSBarry Smith PetscBool PetscMemoryCollectMaximumUsage = PETSC_FALSE; 117e5c89e4eSSatish Balay PetscLogDouble PetscMemoryMaximumUsage = 0; 118e5c89e4eSSatish Balay 119e30d2299SSatish Balay /*@ 120e5c89e4eSSatish Balay PetscMemoryGetMaximumUsage - Returns the maximum resident set size (memory used) 121811af0c4SBarry Smith for the program since it started (the high water mark). 122e5c89e4eSSatish Balay 123e5c89e4eSSatish Balay Not Collective 124e5c89e4eSSatish Balay 125e5c89e4eSSatish Balay Output Parameter: 126e5c89e4eSSatish Balay . mem - memory usage in bytes 127e5c89e4eSSatish Balay 128e5c89e4eSSatish Balay Options Database Key: 129a2b725a8SWilliam Gropp + -memory_view - Print memory usage at end of run 130811af0c4SBarry Smith . -log_view_memory - Print memory information per event 1312d853995SBarry Smith - -malloc_view - Print usage of `PetscMalloc()` in `PetscFinalize()` 132e5c89e4eSSatish Balay 133e5c89e4eSSatish Balay Level: intermediate 134e5c89e4eSSatish Balay 135811af0c4SBarry Smith Note: 136e5c89e4eSSatish Balay The memory usage reported here includes all Fortran arrays 137e5c89e4eSSatish Balay (that may be used in application-defined sections of code). 138e5c89e4eSSatish Balay This routine thus provides a more complete picture of memory 139811af0c4SBarry Smith usage than `PetscMallocGetCurrentUsage()` for codes that employ Fortran with 140e5c89e4eSSatish Balay hardwired arrays. 141e5c89e4eSSatish Balay 142db781477SPatrick Sanan .seealso: `PetscMallocGetMaximumUsage()`, `PetscMemoryGetCurrentUsage()`, `PetscMallocGetCurrentUsage()`, 143db781477SPatrick Sanan `PetscMemorySetGetMaximumUsage()` 144e5c89e4eSSatish Balay @*/ 145d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMemoryGetMaximumUsage(PetscLogDouble *mem) 146d71ae5a4SJacob Faibussowitsch { 147e5c89e4eSSatish Balay PetscFunctionBegin; 14828b400f6SJacob Faibussowitsch PetscCheck(PetscMemoryCollectMaximumUsage, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "To use this function you must first call PetscMemorySetGetMaximumUsage()"); 149e5c89e4eSSatish Balay *mem = PetscMemoryMaximumUsage; 1503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 151e5c89e4eSSatish Balay } 152e5c89e4eSSatish Balay 153dc37d89fSBarry Smith /*@ 154e5c89e4eSSatish Balay PetscMemorySetGetMaximumUsage - Tells PETSc to monitor the maximum memory usage so that 155811af0c4SBarry Smith `PetscMemoryGetMaximumUsage()` will work. 156e5c89e4eSSatish Balay 157e5c89e4eSSatish Balay Not Collective 158e5c89e4eSSatish Balay 159e5c89e4eSSatish Balay Options Database Key: 160a2b725a8SWilliam Gropp + -memory_view - Print memory usage at end of run 161811af0c4SBarry Smith . -log_view_memory - Print memory information per event 1622d853995SBarry Smith - -malloc_view - Print usage of `PetscMalloc()` in `PetscFinalize()` 163e5c89e4eSSatish Balay 164e5c89e4eSSatish Balay Level: intermediate 165e5c89e4eSSatish Balay 166db781477SPatrick Sanan .seealso: `PetscMallocGetMaximumUsage()`, `PetscMemoryGetCurrentUsage()`, `PetscMallocGetCurrentUsage()`, 167db781477SPatrick Sanan `PetscMemoryGetMaximumUsage()` 168e5c89e4eSSatish Balay @*/ 169d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMemorySetGetMaximumUsage(void) 170d71ae5a4SJacob Faibussowitsch { 171e5c89e4eSSatish Balay PetscFunctionBegin; 172e5c89e4eSSatish Balay PetscMemoryCollectMaximumUsage = PETSC_TRUE; 1733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 174e5c89e4eSSatish Balay } 175