xref: /petsc/src/sys/time/cputime.c (revision e8e8640d1cb9a3a2f50c0c0d7b26e5c4d521e2e4)
1e5c89e4eSSatish Balay /*
2e5c89e4eSSatish Balay   This is to allow one to measure CPU time usage of their job,
3e5c89e4eSSatish Balay   NOT real time usage. Do not use this for reported timings, speedup etc.
4e5c89e4eSSatish Balay */
5e5c89e4eSSatish Balay 
6c6db04a5SJed Brown #include <petscsys.h>  /*I "petscsys.h" I*/
78563dfccSBarry Smith #include <petsctime.h> /*I "petsctime.h" I*/
8e5c89e4eSSatish Balay #include <ctype.h>
9e5c89e4eSSatish Balay #include <sys/stat.h>
10e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_UTSNAME_H)
11e5c89e4eSSatish Balay   #include <sys/utsname.h>
12e5c89e4eSSatish Balay #endif
13e5c89e4eSSatish Balay #if defined(PETSC_HAVE_TIME_H)
14e5c89e4eSSatish Balay   #include <time.h>
15e5c89e4eSSatish Balay #endif
16e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
17e5c89e4eSSatish Balay   #include <sys/systeminfo.h>
18e5c89e4eSSatish Balay #endif
19e5c89e4eSSatish Balay 
20e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_TIMES_H)
21e5c89e4eSSatish Balay 
22e5c89e4eSSatish Balay   #include <sys/times.h>
PetscGetCPUTime(PetscLogDouble * t)23d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
24d71ae5a4SJacob Faibussowitsch {
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);
30*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
31e5c89e4eSSatish Balay }
32e5c89e4eSSatish Balay 
33e5c89e4eSSatish Balay #elif defined(PETSC_HAVE_CLOCK)
34e5c89e4eSSatish Balay 
35e5c89e4eSSatish Balay   #include <time.h>
36e5c89e4eSSatish Balay 
PetscGetCPUTime(PetscLogDouble * t)37d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
38d71ae5a4SJacob Faibussowitsch {
39e5c89e4eSSatish Balay   PetscFunctionBegin;
40e5c89e4eSSatish Balay   *t = ((double)clock()) / ((double)CLOCKS_PER_SEC);
41*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
42e5c89e4eSSatish Balay }
43e5c89e4eSSatish Balay 
44e5c89e4eSSatish Balay #else
45e5c89e4eSSatish Balay 
46e5c89e4eSSatish Balay   #include <sys/time.h>
47e5c89e4eSSatish Balay   #include <sys/resource.h>
48e5c89e4eSSatish Balay 
49e30d2299SSatish Balay /*@
50e5c89e4eSSatish Balay     PetscGetCPUTime - Returns the CPU time in seconds used by the process.
51e5c89e4eSSatish Balay 
52e5c89e4eSSatish Balay     Not Collective
53e5c89e4eSSatish Balay 
54e5c89e4eSSatish Balay     Output Parameter:
55e5c89e4eSSatish Balay .   t - Time in seconds charged to the process.
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay     Example:
58e5c89e4eSSatish Balay .vb
59c6db04a5SJed Brown     #include <petscsys.h>
60e5c89e4eSSatish Balay     ...
61e5c89e4eSSatish Balay     PetscLogDouble t1, t2;
62e5c89e4eSSatish Balay 
639566063dSJacob Faibussowitsch     PetscCall(PetscGetCPUTime(&t1));
64e5c89e4eSSatish Balay     ... code to time ...
659566063dSJacob Faibussowitsch     PetscCall(PetscGetCPUTime(&t2));
66e5c89e4eSSatish Balay     printf("Code took %f CPU seconds\n", t2-t1);
67e5c89e4eSSatish Balay .ve
68e5c89e4eSSatish Balay 
69e5c89e4eSSatish Balay     Level: intermediate
70e5c89e4eSSatish Balay 
71811af0c4SBarry Smith     Note:
72811af0c4SBarry Smith     One should use the -log_view option of
73e5c89e4eSSatish Balay     PETSc for profiling. The CPU time is NOT a realistic number to
74e5c89e4eSSatish Balay     use since it does not include the time for message passing etc.
75e5c89e4eSSatish Balay     Also on many systems the accuracy is only on the order of microseconds.
76811af0c4SBarry Smith 
77811af0c4SBarry Smith .seealso: `PetscTime()`, `PetscLogView()`
78e5c89e4eSSatish Balay @*/
PetscGetCPUTime(PetscLogDouble * t)79d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
80d71ae5a4SJacob Faibussowitsch {
81e5c89e4eSSatish Balay   static struct rusage temp;
82e5c89e4eSSatish Balay   PetscLogDouble       foo, foo1;
83e5c89e4eSSatish Balay 
84e5c89e4eSSatish Balay   PetscFunctionBegin;
85e5c89e4eSSatish Balay   getrusage(RUSAGE_SELF, &temp);
86e5c89e4eSSatish Balay   foo  = temp.ru_utime.tv_sec;  /* seconds */
87e5c89e4eSSatish Balay   foo1 = temp.ru_utime.tv_usec; /* uSecs */
88e5c89e4eSSatish Balay   *t   = foo + foo1 * 1.0e-6;
89*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
90e5c89e4eSSatish Balay }
91e5c89e4eSSatish Balay 
92e5c89e4eSSatish Balay #endif
93