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 @*/
PetscMemoryGetCurrentUsage(PetscLogDouble * mem)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
79*835f2295SStefano Zampini PetscCall(PetscSNPrintf(proc, PETSC_STATIC_ARRAY_LENGTH(proc), "/proc/%d", 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)
90*835f2295SStefano Zampini PetscCall(PetscSNPrintf(proc, PETSC_STATIC_ARRAY_LENGTH(proc), "/proc/%d/statm", getpid()));
9157508eceSPierre 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 @*/
PetscMemoryGetMaximumUsage(PetscLogDouble * mem)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 @*/
PetscMemorySetGetMaximumUsage(void)169d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMemorySetGetMaximumUsage(void)
170d71ae5a4SJacob Faibussowitsch {
171e5c89e4eSSatish Balay PetscFunctionBegin;
172e5c89e4eSSatish Balay PetscMemoryCollectMaximumUsage = PETSC_TRUE;
1733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
174e5c89e4eSSatish Balay }
175