Actual source code: cputime.c

      1: /*
      2:   This is to allow one to measure CPU time usage of their job,
      3:   NOT real time usage. Do not use this for reported timings, speedup etc.
      4: */

      6: #include <petscsys.h>
      7: #include <petsctime.h>
      8: #include <ctype.h>
      9: #include <sys/stat.h>
     10: #if defined(PETSC_HAVE_SYS_UTSNAME_H)
     11:   #include <sys/utsname.h>
     12: #endif
     13: #if defined(PETSC_HAVE_TIME_H)
     14:   #include <time.h>
     15: #endif
     16: #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
     17:   #include <sys/systeminfo.h>
     18: #endif

     20: #if defined(PETSC_HAVE_SYS_TIMES_H)

     22:   #include <sys/times.h>
     23: PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
     24: {
     25:   struct tms temp;

     27:   PetscFunctionBegin;
     28:   times(&temp);
     29:   *t = ((double)temp.tms_utime) / ((double)CLOCKS_PER_SEC);
     30:   PetscFunctionReturn(PETSC_SUCCESS);
     31: }

     33: #elif defined(PETSC_HAVE_CLOCK)

     35:   #include <time.h>

     37: PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
     38: {
     39:   PetscFunctionBegin;
     40:   *t = ((double)clock()) / ((double)CLOCKS_PER_SEC);
     41:   PetscFunctionReturn(PETSC_SUCCESS);
     42: }

     44: #else

     46:   #include <sys/time.h>
     47:   #include <sys/resource.h>

     49: /*@
     50:     PetscGetCPUTime - Returns the CPU time in seconds used by the process.

     52:     Not Collective

     54:     Output Parameter:
     55: .   t - Time in seconds charged to the process.

     57:     Example:
     58: .vb
     59: #include <petscsys.h>
     60:     ...
     61:     PetscLogDouble t1, t2;

     63:     PetscCall(PetscGetCPUTime(&t1));
     64:     ... code to time ...
     65:     PetscCall(PetscGetCPUTime(&t2));
     66:     printf("Code took %f CPU seconds\n", t2-t1);
     67: .ve

     69:     Level: intermediate

     71:     Note:
     72:     One should use the -log_view option of
     73:     PETSc for profiling. The CPU time is NOT a realistic number to
     74:     use since it does not include the time for message passing etc.
     75:     Also on many systems the accuracy is only on the order of microseconds.

     77: .seealso: `PetscTime()`, `PetscLogView()`
     78: @*/
     79: PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
     80: {
     81:   static struct rusage temp;
     82:   PetscLogDouble       foo, foo1;

     84:   PetscFunctionBegin;
     85:   getrusage(RUSAGE_SELF, &temp);
     86:   foo  = temp.ru_utime.tv_sec;  /* seconds */
     87:   foo1 = temp.ru_utime.tv_usec; /* uSecs */
     88:   *t   = foo + foo1 * 1.0e-6;
     89:   PetscFunctionReturn(PETSC_SUCCESS);
     90: }

     92: #endif