Actual source code: mem.c
1: #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for getpagesize() with c89 */
2: #include <petscsys.h>
3: #if defined(PETSC_HAVE_PWD_H)
4: #include <pwd.h>
5: #endif
6: #include <ctype.h>
7: #include <sys/stat.h>
8: #if defined(PETSC_HAVE_UNISTD_H)
9: #include <unistd.h>
10: #endif
11: #if defined(PETSC_HAVE_SYS_UTSNAME_H)
12: #include <sys/utsname.h>
13: #endif
14: #include <fcntl.h>
15: #include <time.h>
16: #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
17: #include <sys/systeminfo.h>
18: #endif
20: #if defined(PETSC_HAVE_SYS_RESOURCE_H)
21: #include <sys/resource.h>
22: #endif
23: #if defined(PETSC_HAVE_SYS_PROCFS_H)
24: /* #include <sys/int_types.h> Required if using gcc on solaris 2.6 */
25: #include <sys/procfs.h>
26: #endif
27: #if defined(PETSC_HAVE_FCNTL_H)
28: #include <fcntl.h>
29: #endif
31: /*@
32: PetscMemoryGetCurrentUsage - Returns the current resident set size (memory used)
33: for the program.
35: Not Collective
37: Output Parameter:
38: . mem - memory usage in bytes
40: Options Database Key:
41: + -memory_view - Print memory usage at end of run
42: . -log_view_memory - Display memory information for each logged event
43: - -malloc_log - Activate logging of memory usage
45: Level: intermediate
47: Notes:
48: The memory usage reported here includes all Fortran arrays
49: (that may be used in application-defined sections of code).
50: This routine thus provides a more complete picture of memory
51: usage than `PetscMallocGetCurrentUsage()` for codes that employ Fortran with
52: hardwired arrays.
54: This value generally never decreases during a run even if the application has freed much of its memory that it allocated
56: .seealso: `PetscMallocGetMaximumUsage()`, `PetscMemoryGetMaximumUsage()`, `PetscMallocGetCurrentUsage()`, `PetscMemorySetGetMaximumUsage()`, `PetscMemoryView()`
57: @*/
58: PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *mem)
59: {
60: #if defined(PETSC_USE_PROCFS_FOR_SIZE)
61: FILE *file;
62: int fd;
63: char proc[PETSC_MAX_PATH_LEN];
64: prpsinfo_t prusage;
65: #elif defined(PETSC_USE_SBREAK_FOR_SIZE)
66: long *ii = sbreak(0);
67: int fd = ii - (long *)0;
68: #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE)
69: FILE *file;
70: char proc[PETSC_MAX_PATH_LEN];
71: int mm, rss, err;
72: #elif defined(PETSC_HAVE_GETRUSAGE)
73: static struct rusage temp;
74: #endif
76: #if defined(PETSC_USE_PROCFS_FOR_SIZE)
78: sprintf(proc, "/proc/%d", (int)getpid());
81: *mem = (PetscLogDouble)prusage.pr_byrssize;
82: close(fd);
84: #elif defined(PETSC_USE_SBREAK_FOR_SIZE)
86: *mem = (PetscLogDouble)(8 * fd - 4294967296); /* 2^32 - upper bits */
88: #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE)
89: sprintf(proc, "/proc/%d/statm", (int)getpid());
92: *mem = ((PetscLogDouble)rss) * ((PetscLogDouble)getpagesize());
93: err = fclose(file);
96: #elif defined(PETSC_HAVE_GETRUSAGE)
97: getrusage(RUSAGE_SELF, &temp);
98: #if defined(PETSC_USE_KBYTES_FOR_SIZE)
99: *mem = 1024.0 * ((PetscLogDouble)temp.ru_maxrss);
100: #elif defined(PETSC_USE_PAGES_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE)
101: *mem = ((PetscLogDouble)getpagesize()) * ((PetscLogDouble)temp.ru_maxrss);
102: #else
103: *mem = temp.ru_maxrss;
104: #endif
106: #else
107: *mem = 0.0;
108: #endif
109: return 0;
110: }
112: PETSC_INTERN PetscBool PetscMemoryCollectMaximumUsage;
113: PETSC_INTERN PetscLogDouble PetscMemoryMaximumUsage;
115: PetscBool PetscMemoryCollectMaximumUsage = PETSC_FALSE;
116: PetscLogDouble PetscMemoryMaximumUsage = 0;
118: /*@
119: PetscMemoryGetMaximumUsage - Returns the maximum resident set size (memory used)
120: for the program since it started (the high water mark).
122: Not Collective
124: Output Parameter:
125: . mem - memory usage in bytes
127: Options Database Key:
128: + -memory_view - Print memory usage at end of run
129: . -log_view_memory - Print memory information per event
130: - -malloc_log - Activate logging of memory usage
132: Level: intermediate
134: Note:
135: The memory usage reported here includes all Fortran arrays
136: (that may be used in application-defined sections of code).
137: This routine thus provides a more complete picture of memory
138: usage than `PetscMallocGetCurrentUsage()` for codes that employ Fortran with
139: hardwired arrays.
141: .seealso: `PetscMallocGetMaximumUsage()`, `PetscMemoryGetCurrentUsage()`, `PetscMallocGetCurrentUsage()`,
142: `PetscMemorySetGetMaximumUsage()`
143: @*/
144: PetscErrorCode PetscMemoryGetMaximumUsage(PetscLogDouble *mem)
145: {
147: *mem = PetscMemoryMaximumUsage;
148: return 0;
149: }
151: /*@
152: PetscMemorySetGetMaximumUsage - Tells PETSc to monitor the maximum memory usage so that
153: `PetscMemoryGetMaximumUsage()` will work.
155: Not Collective
157: Options Database Key:
158: + -memory_view - Print memory usage at end of run
159: . -log_view_memory - Print memory information per event
160: - -malloc_log - Activate logging of memory usage
162: Level: intermediate
164: .seealso: `PetscMallocGetMaximumUsage()`, `PetscMemoryGetCurrentUsage()`, `PetscMallocGetCurrentUsage()`,
165: `PetscMemoryGetMaximumUsage()`
166: @*/
167: PetscErrorCode PetscMemorySetGetMaximumUsage(void)
168: {
169: PetscMemoryCollectMaximumUsage = PETSC_TRUE;
170: return 0;
171: }