xref: /petsc/src/sys/time/cputime.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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>
24d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
25d71ae5a4SJacob Faibussowitsch {
26e5c89e4eSSatish Balay   struct tms temp;
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay   PetscFunctionBegin;
29e5c89e4eSSatish Balay   times(&temp);
30e5c89e4eSSatish Balay   *t = ((double)temp.tms_utime) / ((double)CLOCKS_PER_SEC);
31*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
32e5c89e4eSSatish Balay }
33e5c89e4eSSatish Balay 
34e5c89e4eSSatish Balay #elif defined(PETSC_HAVE_CLOCK)
35e5c89e4eSSatish Balay 
36e5c89e4eSSatish Balay   #include <time.h>
37e5c89e4eSSatish Balay 
38d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
39d71ae5a4SJacob Faibussowitsch {
40e5c89e4eSSatish Balay   PetscFunctionBegin;
41e5c89e4eSSatish Balay   *t = ((double)clock()) / ((double)CLOCKS_PER_SEC);
42*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
43e5c89e4eSSatish Balay }
44e5c89e4eSSatish Balay 
45e5c89e4eSSatish Balay #else
46e5c89e4eSSatish Balay 
47e5c89e4eSSatish Balay   #include <sys/time.h>
48e5c89e4eSSatish Balay   #include <sys/resource.h>
49e5c89e4eSSatish Balay 
50e30d2299SSatish Balay /*@
51e5c89e4eSSatish Balay     PetscGetCPUTime - Returns the CPU time in seconds used by the process.
52e5c89e4eSSatish Balay 
53e5c89e4eSSatish Balay     Not Collective
54e5c89e4eSSatish Balay 
55e5c89e4eSSatish Balay     Output Parameter:
56e5c89e4eSSatish Balay .   t - Time in seconds charged to the process.
57e5c89e4eSSatish Balay 
58e5c89e4eSSatish Balay     Example:
59e5c89e4eSSatish Balay .vb
60c6db04a5SJed Brown     #include <petscsys.h>
61e5c89e4eSSatish Balay     ...
62e5c89e4eSSatish Balay     PetscLogDouble t1, t2;
63e5c89e4eSSatish Balay 
649566063dSJacob Faibussowitsch     PetscCall(PetscGetCPUTime(&t1));
65e5c89e4eSSatish Balay     ... code to time ...
669566063dSJacob Faibussowitsch     PetscCall(PetscGetCPUTime(&t2));
67e5c89e4eSSatish Balay     printf("Code took %f CPU seconds\n", t2-t1);
68e5c89e4eSSatish Balay .ve
69e5c89e4eSSatish Balay 
70e5c89e4eSSatish Balay     Level: intermediate
71e5c89e4eSSatish Balay 
72811af0c4SBarry Smith     Note:
73811af0c4SBarry Smith     One should use the -log_view option of
74e5c89e4eSSatish Balay     PETSc for profiling. The CPU time is NOT a realistic number to
75e5c89e4eSSatish Balay     use since it does not include the time for message passing etc.
76e5c89e4eSSatish Balay     Also on many systems the accuracy is only on the order of microseconds.
77811af0c4SBarry Smith 
78811af0c4SBarry Smith .seealso: `PetscTime()`, `PetscLogView()`
79e5c89e4eSSatish Balay @*/
80d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetCPUTime(PetscLogDouble *t)
81d71ae5a4SJacob Faibussowitsch {
82e5c89e4eSSatish Balay   static struct rusage temp;
83e5c89e4eSSatish Balay   PetscLogDouble       foo, foo1;
84e5c89e4eSSatish Balay 
85e5c89e4eSSatish Balay   PetscFunctionBegin;
86e5c89e4eSSatish Balay   getrusage(RUSAGE_SELF, &temp);
87e5c89e4eSSatish Balay   foo  = temp.ru_utime.tv_sec;  /* seconds */
88e5c89e4eSSatish Balay   foo1 = temp.ru_utime.tv_usec; /* uSecs */
89e5c89e4eSSatish Balay   *t   = foo + foo1 * 1.0e-6;
90*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
91e5c89e4eSSatish Balay }
92e5c89e4eSSatish Balay 
93e5c89e4eSSatish Balay #endif
94