xref: /petsc/src/sys/time/cputime.c (revision 7d0a6c19129e7069c8a40e210b34ed62989173db)
1*7d0a6c19SBarry 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 
7d382aafbSBarry Smith #include "petscsys.h"                       /*I "petscsys.h" I*/
8e5c89e4eSSatish Balay #include <ctype.h>
9e5c89e4eSSatish Balay #include <sys/types.h>
10e5c89e4eSSatish Balay #include <sys/stat.h>
11e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H)
12e5c89e4eSSatish Balay #include <stdlib.h>
13e5c89e4eSSatish Balay #endif
14e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_UTSNAME_H)
15e5c89e4eSSatish Balay #include <sys/utsname.h>
16e5c89e4eSSatish Balay #endif
17e5c89e4eSSatish Balay #if defined(PETSC_HAVE_TIME_H)
18e5c89e4eSSatish Balay #include <time.h>
19e5c89e4eSSatish Balay #endif
20e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
21e5c89e4eSSatish Balay #include <sys/systeminfo.h>
22e5c89e4eSSatish Balay #endif
23e5c89e4eSSatish Balay 
24e5c89e4eSSatish Balay #if defined (PETSC_HAVE_SYS_TIMES_H)
25e5c89e4eSSatish Balay 
26e5c89e4eSSatish Balay #include <sys/times.h>
27e5c89e4eSSatish Balay #include <limits.h>
28e5c89e4eSSatish Balay #undef __FUNCT__
29e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetCPUTime"
307087cfbeSBarry Smith PetscErrorCode  PetscGetCPUTime(PetscLogDouble *t)
31e5c89e4eSSatish Balay {
32e5c89e4eSSatish Balay   struct tms temp;
33e5c89e4eSSatish Balay 
34e5c89e4eSSatish Balay   PetscFunctionBegin;
35e5c89e4eSSatish Balay   times(&temp);
36e5c89e4eSSatish Balay   *t = ((double)temp.tms_utime)/((double)CLOCKS_PER_SEC);
37e5c89e4eSSatish Balay   PetscFunctionReturn(0);
38e5c89e4eSSatish Balay }
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay #elif defined(PETSC_HAVE_CLOCK)
41e5c89e4eSSatish Balay 
42e5c89e4eSSatish Balay #include <time.h>
43e5c89e4eSSatish Balay #include <sys/types.h>
44e5c89e4eSSatish Balay 
45e5c89e4eSSatish Balay #undef __FUNCT__
46e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetCPUTime"
477087cfbeSBarry Smith PetscErrorCode  PetscGetCPUTime(PetscLogDouble *t)
48e5c89e4eSSatish Balay {
49e5c89e4eSSatish Balay   PetscFunctionBegin;
50e5c89e4eSSatish Balay   *t = ((double)clock()) / ((double)CLOCKS_PER_SEC);
51e5c89e4eSSatish Balay   PetscFunctionReturn(0);
52e5c89e4eSSatish Balay }
53e5c89e4eSSatish Balay 
54e5c89e4eSSatish Balay #else
55e5c89e4eSSatish Balay 
56e5c89e4eSSatish Balay #include <sys/types.h>
57e5c89e4eSSatish Balay #include <sys/time.h>
58e5c89e4eSSatish Balay #include <sys/resource.h>
59e5c89e4eSSatish Balay 
60e5c89e4eSSatish Balay #undef __FUNCT__
61e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetCPUTime"
62e30d2299SSatish Balay /*@
63e5c89e4eSSatish Balay     PetscGetCPUTime - Returns the CPU time in seconds used by the process.
64e5c89e4eSSatish Balay 
65e5c89e4eSSatish Balay     Not Collective
66e5c89e4eSSatish Balay 
67e5c89e4eSSatish Balay     Output Parameter:
68e5c89e4eSSatish Balay .   t - Time in seconds charged to the process.
69e5c89e4eSSatish Balay 
70e5c89e4eSSatish Balay     Example:
71e5c89e4eSSatish Balay .vb
72d382aafbSBarry Smith     #include "petscsys.h"
73e5c89e4eSSatish Balay     ...
74e5c89e4eSSatish Balay     PetscLogDouble t1, t2;
75e5c89e4eSSatish Balay 
76e5c89e4eSSatish Balay     ierr = PetscGetCPUTime(&t1);CHKERRQ(ierr);
77e5c89e4eSSatish Balay     ... code to time ...
78e5c89e4eSSatish Balay     ierr = PetscGetCPUTime(&t2);CHKERRQ(ierr);
79e5c89e4eSSatish Balay     printf("Code took %f CPU seconds\n", t2-t1);
80e5c89e4eSSatish Balay .ve
81e5c89e4eSSatish Balay 
82e5c89e4eSSatish Balay     Level: intermediate
83e5c89e4eSSatish Balay 
84e5c89e4eSSatish Balay     Notes:
85e5c89e4eSSatish Balay     One should use PetscGetTime() or the -log_summary option of
86e5c89e4eSSatish Balay     PETSc for profiling. The CPU time is NOT a realistic number to
87e5c89e4eSSatish Balay     use since it does not include the time for message passing etc.
88e5c89e4eSSatish Balay     Also on many systems the accuracy is only on the order of microseconds.
89e5c89e4eSSatish Balay @*/
907087cfbeSBarry Smith PetscErrorCode  PetscGetCPUTime(PetscLogDouble *t)
91e5c89e4eSSatish Balay {
92e5c89e4eSSatish Balay   static struct rusage temp;
93e5c89e4eSSatish Balay   PetscLogDouble       foo,foo1;
94e5c89e4eSSatish Balay 
95e5c89e4eSSatish Balay   PetscFunctionBegin;
96e5c89e4eSSatish Balay   getrusage(RUSAGE_SELF,&temp);
97e5c89e4eSSatish Balay   foo     = temp.ru_utime.tv_sec;     /* seconds */
98e5c89e4eSSatish Balay   foo1    = temp.ru_utime.tv_usec;    /* uSecs */
99e5c89e4eSSatish Balay   *t      = foo + foo1 * 1.0e-6;
100e5c89e4eSSatish Balay   PetscFunctionReturn(0);
101e5c89e4eSSatish Balay }
102e5c89e4eSSatish Balay 
103e5c89e4eSSatish Balay #endif
104