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