xref: /petsc/src/sys/time/cputime.c (revision 8563dfcc547dae59d5e1dc6b8e602db41cb72b14)
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*/
8*8563dfccSBarry 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>
24e5c89e4eSSatish Balay #undef __FUNCT__
25e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetCPUTime"
267087cfbeSBarry Smith PetscErrorCode  PetscGetCPUTime(PetscLogDouble *t)
27e5c89e4eSSatish Balay {
28e5c89e4eSSatish Balay   struct tms temp;
29e5c89e4eSSatish Balay 
30e5c89e4eSSatish Balay   PetscFunctionBegin;
31e5c89e4eSSatish Balay   times(&temp);
32e5c89e4eSSatish Balay   *t = ((double)temp.tms_utime)/((double)CLOCKS_PER_SEC);
33e5c89e4eSSatish Balay   PetscFunctionReturn(0);
34e5c89e4eSSatish Balay }
35e5c89e4eSSatish Balay 
36e5c89e4eSSatish Balay #elif defined(PETSC_HAVE_CLOCK)
37e5c89e4eSSatish Balay 
38e5c89e4eSSatish Balay #include <time.h>
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay #undef __FUNCT__
41e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetCPUTime"
427087cfbeSBarry Smith PetscErrorCode  PetscGetCPUTime(PetscLogDouble *t)
43e5c89e4eSSatish Balay {
44e5c89e4eSSatish Balay   PetscFunctionBegin;
45e5c89e4eSSatish Balay   *t = ((double)clock()) / ((double)CLOCKS_PER_SEC);
46e5c89e4eSSatish Balay   PetscFunctionReturn(0);
47e5c89e4eSSatish Balay }
48e5c89e4eSSatish Balay 
49e5c89e4eSSatish Balay #else
50e5c89e4eSSatish Balay 
51e5c89e4eSSatish Balay #include <sys/time.h>
52e5c89e4eSSatish Balay #include <sys/resource.h>
53e5c89e4eSSatish Balay 
54e5c89e4eSSatish Balay #undef __FUNCT__
55e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetCPUTime"
56e30d2299SSatish Balay /*@
57e5c89e4eSSatish Balay     PetscGetCPUTime - Returns the CPU time in seconds used by the process.
58e5c89e4eSSatish Balay 
59e5c89e4eSSatish Balay     Not Collective
60e5c89e4eSSatish Balay 
61e5c89e4eSSatish Balay     Output Parameter:
62e5c89e4eSSatish Balay .   t - Time in seconds charged to the process.
63e5c89e4eSSatish Balay 
64e5c89e4eSSatish Balay     Example:
65e5c89e4eSSatish Balay .vb
66c6db04a5SJed Brown     #include <petscsys.h>
67e5c89e4eSSatish Balay     ...
68e5c89e4eSSatish Balay     PetscLogDouble t1, t2;
69e5c89e4eSSatish Balay 
70e5c89e4eSSatish Balay     ierr = PetscGetCPUTime(&t1);CHKERRQ(ierr);
71e5c89e4eSSatish Balay     ... code to time ...
72e5c89e4eSSatish Balay     ierr = PetscGetCPUTime(&t2);CHKERRQ(ierr);
73e5c89e4eSSatish Balay     printf("Code took %f CPU seconds\n", t2-t1);
74e5c89e4eSSatish Balay .ve
75e5c89e4eSSatish Balay 
76e5c89e4eSSatish Balay     Level: intermediate
77e5c89e4eSSatish Balay 
78e5c89e4eSSatish Balay     Notes:
79*8563dfccSBarry Smith     One should use PetscTime() or the -log_summary option of
80e5c89e4eSSatish Balay     PETSc for profiling. The CPU time is NOT a realistic number to
81e5c89e4eSSatish Balay     use since it does not include the time for message passing etc.
82e5c89e4eSSatish Balay     Also on many systems the accuracy is only on the order of microseconds.
83e5c89e4eSSatish Balay @*/
847087cfbeSBarry Smith PetscErrorCode  PetscGetCPUTime(PetscLogDouble *t)
85e5c89e4eSSatish Balay {
86e5c89e4eSSatish Balay   static struct rusage temp;
87e5c89e4eSSatish Balay   PetscLogDouble       foo,foo1;
88e5c89e4eSSatish Balay 
89e5c89e4eSSatish Balay   PetscFunctionBegin;
90e5c89e4eSSatish Balay   getrusage(RUSAGE_SELF,&temp);
91e5c89e4eSSatish Balay   foo  = temp.ru_utime.tv_sec;        /* seconds */
92e5c89e4eSSatish Balay   foo1 = temp.ru_utime.tv_usec;       /* uSecs */
93e5c89e4eSSatish Balay   *t   = foo + foo1 * 1.0e-6;
94e5c89e4eSSatish Balay   PetscFunctionReturn(0);
95e5c89e4eSSatish Balay }
96e5c89e4eSSatish Balay 
97e5c89e4eSSatish Balay #endif
98