17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay This is to allow one to measure CPU time usage of their job, 4e5c89e4eSSatish Balay NOT real time usage. Do not use this for reported timings, speedup etc. 5e5c89e4eSSatish Balay */ 6e5c89e4eSSatish Balay 7c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 88563dfccSBarry Smith #include <petsctime.h> /*I "petsctime.h" I*/ 9e5c89e4eSSatish Balay #include <ctype.h> 10e5c89e4eSSatish Balay #include <sys/stat.h> 11e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_UTSNAME_H) 12e5c89e4eSSatish Balay #include <sys/utsname.h> 13e5c89e4eSSatish Balay #endif 14e5c89e4eSSatish Balay #if defined(PETSC_HAVE_TIME_H) 15e5c89e4eSSatish Balay #include <time.h> 16e5c89e4eSSatish Balay #endif 17e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H) 18e5c89e4eSSatish Balay #include <sys/systeminfo.h> 19e5c89e4eSSatish Balay #endif 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_TIMES_H) 22e5c89e4eSSatish Balay 23e5c89e4eSSatish Balay #include <sys/times.h> 24*9371c9d4SSatish Balay PetscErrorCode PetscGetCPUTime(PetscLogDouble *t) { 25e5c89e4eSSatish Balay struct tms temp; 26e5c89e4eSSatish Balay 27e5c89e4eSSatish Balay PetscFunctionBegin; 28e5c89e4eSSatish Balay times(&temp); 29e5c89e4eSSatish Balay *t = ((double)temp.tms_utime) / ((double)CLOCKS_PER_SEC); 30e5c89e4eSSatish Balay PetscFunctionReturn(0); 31e5c89e4eSSatish Balay } 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay #elif defined(PETSC_HAVE_CLOCK) 34e5c89e4eSSatish Balay 35e5c89e4eSSatish Balay #include <time.h> 36e5c89e4eSSatish Balay 37*9371c9d4SSatish Balay PetscErrorCode PetscGetCPUTime(PetscLogDouble *t) { 38e5c89e4eSSatish Balay PetscFunctionBegin; 39e5c89e4eSSatish Balay *t = ((double)clock()) / ((double)CLOCKS_PER_SEC); 40e5c89e4eSSatish Balay PetscFunctionReturn(0); 41e5c89e4eSSatish Balay } 42e5c89e4eSSatish Balay 43e5c89e4eSSatish Balay #else 44e5c89e4eSSatish Balay 45e5c89e4eSSatish Balay #include <sys/time.h> 46e5c89e4eSSatish Balay #include <sys/resource.h> 47e5c89e4eSSatish Balay 48e30d2299SSatish Balay /*@ 49e5c89e4eSSatish Balay PetscGetCPUTime - Returns the CPU time in seconds used by the process. 50e5c89e4eSSatish Balay 51e5c89e4eSSatish Balay Not Collective 52e5c89e4eSSatish Balay 53e5c89e4eSSatish Balay Output Parameter: 54e5c89e4eSSatish Balay . t - Time in seconds charged to the process. 55e5c89e4eSSatish Balay 56e5c89e4eSSatish Balay Example: 57e5c89e4eSSatish Balay .vb 58c6db04a5SJed Brown #include <petscsys.h> 59e5c89e4eSSatish Balay ... 60e5c89e4eSSatish Balay PetscLogDouble t1, t2; 61e5c89e4eSSatish Balay 629566063dSJacob Faibussowitsch PetscCall(PetscGetCPUTime(&t1)); 63e5c89e4eSSatish Balay ... code to time ... 649566063dSJacob Faibussowitsch PetscCall(PetscGetCPUTime(&t2)); 65e5c89e4eSSatish Balay printf("Code took %f CPU seconds\n", t2-t1); 66e5c89e4eSSatish Balay .ve 67e5c89e4eSSatish Balay 68e5c89e4eSSatish Balay Level: intermediate 69e5c89e4eSSatish Balay 70e5c89e4eSSatish Balay Notes: 71609bdbeeSBarry Smith One should use PetscTime() or the -log_view option of 72e5c89e4eSSatish Balay PETSc for profiling. The CPU time is NOT a realistic number to 73e5c89e4eSSatish Balay use since it does not include the time for message passing etc. 74e5c89e4eSSatish Balay Also on many systems the accuracy is only on the order of microseconds. 75e5c89e4eSSatish Balay @*/ 76*9371c9d4SSatish Balay PetscErrorCode PetscGetCPUTime(PetscLogDouble *t) { 77e5c89e4eSSatish Balay static struct rusage temp; 78e5c89e4eSSatish Balay PetscLogDouble foo, foo1; 79e5c89e4eSSatish Balay 80e5c89e4eSSatish Balay PetscFunctionBegin; 81e5c89e4eSSatish Balay getrusage(RUSAGE_SELF, &temp); 82e5c89e4eSSatish Balay foo = temp.ru_utime.tv_sec; /* seconds */ 83e5c89e4eSSatish Balay foo1 = temp.ru_utime.tv_usec; /* uSecs */ 84e5c89e4eSSatish Balay *t = foo + foo1 * 1.0e-6; 85e5c89e4eSSatish Balay PetscFunctionReturn(0); 86e5c89e4eSSatish Balay } 87e5c89e4eSSatish Balay 88e5c89e4eSSatish Balay #endif 89