1 #define PETSC_DLL 2 3 #include "petsc.h" /*I "petsc.h" I*/ 4 #include "petscsys.h" 5 #include "petscfix.h" 6 #if defined(PETSC_HAVE_PWD_H) 7 #include <pwd.h> 8 #endif 9 #include <ctype.h> 10 #include <sys/types.h> 11 #include <sys/stat.h> 12 #if defined(PETSC_HAVE_UNISTD_H) 13 #include <unistd.h> 14 #endif 15 #if defined(PETSC_HAVE_STDLIB_H) 16 #include <stdlib.h> 17 #endif 18 #if defined(PETSC_HAVE_SYS_UTSNAME_H) 19 #include <sys/utsname.h> 20 #endif 21 #include <fcntl.h> 22 #include <time.h> 23 #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H) 24 #include <sys/systeminfo.h> 25 #endif 26 #include "petscfix.h" 27 28 #if defined(PETSC_HAVE_TASK_INFO) 29 #include <mach/mach.h> 30 #endif 31 32 #if defined(PETSC_HAVE_SYS_RESOURCE_H) 33 #include <sys/resource.h> 34 #endif 35 #if defined(PETSC_HAVE_SYS_PROCFS_H) 36 /* #include <sys/int_types.h> Required if using gcc on solaris 2.6 */ 37 #include <sys/procfs.h> 38 #endif 39 #if defined(PETSC_HAVE_FCNTL_H) 40 #include <fcntl.h> 41 #endif 42 43 #undef __FUNCT__ 44 #define __FUNCT__ "PetscMemoryGetCurrentUsage" 45 /*@ 46 PetscMemoryGetCurrentUsage - Returns the current resident set size (memory used) 47 for the program. 48 49 Not Collective 50 51 Output Parameter: 52 . mem - memory usage in bytes 53 54 Options Database Key: 55 . -memory_info - Print memory usage at end of run 56 . -malloc_log - Activate logging of memory usage 57 58 Level: intermediate 59 60 Notes: 61 The memory usage reported here includes all Fortran arrays 62 (that may be used in application-defined sections of code). 63 This routine thus provides a more complete picture of memory 64 usage than PetscMallocGetCurrentUsage() for codes that employ Fortran with 65 hardwired arrays. 66 67 .seealso: PetscMallocGetMaximumUsage(), PetscMemoryGetMaximumUsage(), PetscMallocGetCurrentUsage() 68 69 Concepts: resident set size 70 Concepts: memory usage 71 72 @*/ 73 PetscErrorCode PETSC_DLLEXPORT PetscMemoryGetCurrentUsage(PetscLogDouble *mem) 74 { 75 #if defined(PETSC_USE_PROCFS_FOR_SIZE) 76 FILE *file; 77 int fd; 78 char proc[PETSC_MAX_PATH_LEN]; 79 prpsinfo_t prusage; 80 #elif defined(PETSC_USE_SBREAK_FOR_SIZE) 81 long *ii = sbreak(0); 82 int fd = ii - (long*)0; 83 #elif defined(PETSC_USE_PROC_FOR_SIZE) 84 FILE *file; 85 char proc[PETSC_MAX_PATH_LEN]; 86 int mm,rss; 87 #elif defined(PETSC_HAVE_TASK_INFO) 88 task_basic_info_data_t ti; 89 unsigned int count; 90 /* 91 The next line defined variables that are not used; but if they 92 are not included the code crashes. Something must be wrong 93 with either the task_info() command or compiler corrupting the 94 stack. 95 */ 96 kern_return_t kerr; 97 #elif defined(PETSC_HAVE_GETRUSAGE) 98 static struct rusage temp; 99 #endif 100 101 PetscFunctionBegin; 102 #if defined(PETSC_USE_PROCFS_FOR_SIZE) 103 104 sprintf(proc,"/proc/%d",(int)getpid()); 105 if ((fd = open(proc,O_RDONLY)) == -1) { 106 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to access system file %s to get memory usage data",file); 107 } 108 if (ioctl(fd,PIOCPSINFO,&prusage) == -1) { 109 SETERRQ1(PETSC_ERR_FILE_READ,"Unable to access system file %s to get memory usage data",file); 110 } 111 *mem = (PetscLogDouble)prusage.pr_byrssize; 112 close(fd); 113 114 #elif defined(PETSC_USE_SBREAK_FOR_SIZE) 115 116 *mem = (PetscLogDouble)(8*fd - 4294967296); /* 2^32 - upper bits */ 117 118 #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) 119 sprintf(proc,"/proc/%d/statm",(int)getpid()); 120 if (!(file = fopen(proc,"r"))) { 121 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to access system file %s to get memory usage data",proc); 122 } 123 fscanf(file,"%d %d",&mm,&rss); 124 *mem = ((PetscLogDouble)rss) * ((PetscLogDouble)getpagesize()); 125 fclose(file); 126 127 #elif defined(PETSC_HAVE_TASK_INFO) 128 if ((kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&ti,&count)) != KERN_SUCCESS) SETERRQ1(PETSC_ERR_LIB,"Mach system call failed: kern_return_t ",kerr); 129 *mem = (PetscLogDouble) ti.resident_size; 130 131 #elif defined(PETSC_HAVE_GETRUSAGE) 132 133 getrusage(RUSAGE_SELF,&temp); 134 #if defined(PETSC_USE_KBYTES_FOR_SIZE) 135 *mem = 1024.0 * ((PetscLogDouble)temp.ru_maxrss); 136 #else 137 *mem = ((PetscLogDouble)getpagesize())*((PetscLogDouble)temp.ru_maxrss); 138 #endif 139 140 #else 141 *mem = 0.0; 142 #endif 143 PetscFunctionReturn(0); 144 } 145 146 PetscTruth PetscMemoryCollectMaximumUsage = PETSC_FALSE; 147 PetscLogDouble PetscMemoryMaximumUsage = 0; 148 149 #undef __FUNCT__ 150 #define __FUNCT__ "PetscMemoryGetMaximumUsage" 151 /*@ 152 PetscMemoryGetMaximumUsage - Returns the maximum resident set size (memory used) 153 for the program. 154 155 Not Collective 156 157 Output Parameter: 158 . mem - memory usage in bytes 159 160 Options Database Key: 161 . -memory_info - Print memory usage at end of run 162 . -malloc_log - Activate logging of memory usage 163 164 Level: intermediate 165 166 Notes: 167 The memory usage reported here includes all Fortran arrays 168 (that may be used in application-defined sections of code). 169 This routine thus provides a more complete picture of memory 170 usage than PetscMallocGetCurrentUsage() for codes that employ Fortran with 171 hardwired arrays. 172 173 .seealso: PetscMallocGetMaximumUsage(), PetscMemoryGetCurrentUsage(), PetscMallocGetCurrentUsage(), 174 PetscMemorySetGetMaximumUsage() 175 176 Concepts: resident set size 177 Concepts: memory usage 178 179 @*/ 180 PetscErrorCode PETSC_DLLEXPORT PetscMemoryGetMaximumUsage(PetscLogDouble *mem) 181 { 182 PetscFunctionBegin; 183 if (!PetscMemoryCollectMaximumUsage) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"To use this function you must first call PetscMemorySetGetMaximumUsage()"); 184 *mem = PetscMemoryMaximumUsage; 185 PetscFunctionReturn(0); 186 } 187 188 #undef __FUNCT__ 189 #define __FUNCT__ "PetscMemorySetGetMaximumUsage" 190 /*@C 191 PetscMemorySetGetMaximumUsage - Tells PETSc to monitor the maximum memory usage so that 192 PetscMemoryGetMaximumUsage() will work. 193 194 Not Collective 195 196 Options Database Key: 197 . -memory_info - Print memory usage at end of run 198 . -malloc_log - Activate logging of memory usage 199 200 Level: intermediate 201 202 .seealso: PetscMallocGetMaximumUsage(), PetscMemoryGetCurrentUsage(), PetscMallocGetCurrentUsage(), 203 PetscMemoryGetMaximumUsage() 204 205 Concepts: resident set size 206 Concepts: memory usage 207 208 @*/ 209 PetscErrorCode PETSC_DLLEXPORT PetscMemorySetGetMaximumUsage(void) 210 { 211 PetscFunctionBegin; 212 PetscMemoryCollectMaximumUsage = PETSC_TRUE; 213 PetscFunctionReturn(0); 214 } 215