xref: /petsc/src/sys/time/cputime.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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>
249371c9d4SSatish 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 
379371c9d4SSatish 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 
70*811af0c4SBarry Smith     Note:
71*811af0c4SBarry Smith     One should use 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.
75*811af0c4SBarry Smith 
76*811af0c4SBarry Smith .seealso: `PetscTime()`, `PetscLogView()`
77e5c89e4eSSatish Balay @*/
789371c9d4SSatish Balay PetscErrorCode PetscGetCPUTime(PetscLogDouble *t) {
79e5c89e4eSSatish Balay   static struct rusage temp;
80e5c89e4eSSatish Balay   PetscLogDouble       foo, foo1;
81e5c89e4eSSatish Balay 
82e5c89e4eSSatish Balay   PetscFunctionBegin;
83e5c89e4eSSatish Balay   getrusage(RUSAGE_SELF, &temp);
84e5c89e4eSSatish Balay   foo  = temp.ru_utime.tv_sec;  /* seconds */
85e5c89e4eSSatish Balay   foo1 = temp.ru_utime.tv_usec; /* uSecs */
86e5c89e4eSSatish Balay   *t   = foo + foo1 * 1.0e-6;
87e5c89e4eSSatish Balay   PetscFunctionReturn(0);
88e5c89e4eSSatish Balay }
89e5c89e4eSSatish Balay 
90e5c89e4eSSatish Balay #endif
91