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) && defined(PETSC_HAVE_GETPAGESIZE) 84 FILE *file; 85 char proc[PETSC_MAX_PATH_LEN]; 86 int mm,rss,err; 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 err = fclose(file); 126 if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file"); 127 128 #elif defined(PETSC_HAVE_TASK_INFO) 129 *mem = 0; 130 /* 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); 131 *mem = (PetscLogDouble) ti.resident_size; */ 132 133 #elif defined(PETSC_HAVE_GETRUSAGE) 134 getrusage(RUSAGE_SELF,&temp); 135 #if defined(PETSC_USE_KBYTES_FOR_SIZE) 136 *mem = 1024.0 * ((PetscLogDouble)temp.ru_maxrss); 137 #elif defined(PETSC_HAVE_GETPAGESIZE) 138 *mem = ((PetscLogDouble)getpagesize())*((PetscLogDouble)temp.ru_maxrss); 139 #else 140 *mem = 0.0; 141 #endif 142 143 #else 144 *mem = 0.0; 145 #endif 146 PetscFunctionReturn(0); 147 } 148 149 PetscTruth PetscMemoryCollectMaximumUsage = PETSC_FALSE; 150 PetscLogDouble PetscMemoryMaximumUsage = 0; 151 152 #undef __FUNCT__ 153 #define __FUNCT__ "PetscMemoryGetMaximumUsage" 154 /*@ 155 PetscMemoryGetMaximumUsage - Returns the maximum resident set size (memory used) 156 for the program. 157 158 Not Collective 159 160 Output Parameter: 161 . mem - memory usage in bytes 162 163 Options Database Key: 164 . -memory_info - Print memory usage at end of run 165 . -malloc_log - Activate logging of memory usage 166 167 Level: intermediate 168 169 Notes: 170 The memory usage reported here includes all Fortran arrays 171 (that may be used in application-defined sections of code). 172 This routine thus provides a more complete picture of memory 173 usage than PetscMallocGetCurrentUsage() for codes that employ Fortran with 174 hardwired arrays. 175 176 .seealso: PetscMallocGetMaximumUsage(), PetscMemoryGetCurrentUsage(), PetscMallocGetCurrentUsage(), 177 PetscMemorySetGetMaximumUsage() 178 179 Concepts: resident set size 180 Concepts: memory usage 181 182 @*/ 183 PetscErrorCode PETSC_DLLEXPORT PetscMemoryGetMaximumUsage(PetscLogDouble *mem) 184 { 185 PetscFunctionBegin; 186 if (!PetscMemoryCollectMaximumUsage) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"To use this function you must first call PetscMemorySetGetMaximumUsage()"); 187 *mem = PetscMemoryMaximumUsage; 188 PetscFunctionReturn(0); 189 } 190 191 #undef __FUNCT__ 192 #define __FUNCT__ "PetscMemorySetGetMaximumUsage" 193 /*@C 194 PetscMemorySetGetMaximumUsage - Tells PETSc to monitor the maximum memory usage so that 195 PetscMemoryGetMaximumUsage() will work. 196 197 Not Collective 198 199 Options Database Key: 200 . -memory_info - Print memory usage at end of run 201 . -malloc_log - Activate logging of memory usage 202 203 Level: intermediate 204 205 .seealso: PetscMallocGetMaximumUsage(), PetscMemoryGetCurrentUsage(), PetscMallocGetCurrentUsage(), 206 PetscMemoryGetMaximumUsage() 207 208 Concepts: resident set size 209 Concepts: memory usage 210 211 @*/ 212 PetscErrorCode PETSC_DLLEXPORT PetscMemorySetGetMaximumUsage(void) 213 { 214 PetscFunctionBegin; 215 PetscMemoryCollectMaximumUsage = PETSC_TRUE; 216 PetscFunctionReturn(0); 217 } 218