1//
2// Timer.h
3//
4//
5
6#ifndef TIMER_HPP
7#define TIMER_HPP
8
9#include <time.h>
10#include <sys/time.h>
11
12#ifdef __MACH__
13#include <mach/clock.h>
14#include <mach/mach.h>
15#endif
16
17/*! \brief Class for cpu time benchmarking
18 *
19 * Usage:
20 *
21 * \snippet timer_util_test.hpp timer usage and behavior
22 *
23 */
24
25class timer
26{
27 //! Flag that indicate if the timer is running or not
28 bool running;
29
30 //! starting time
31 struct timespec tsstart;
32
33 //! start time from epoch
34 clock_t cstart;
35
36 // stop time
37 struct timespec tsstop;
38
39 //! stop time from epoch
40 clock_t cstop;
41
42 // Fill the stop point
43 void check()
44 {
45#if defined(SYNC_BEFORE_TAKE_TIME) && defined(__NVCC__)
46 cudaDeviceSynchronize();
47#endif
48
49#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
50 clock_serv_t cclock;
51 mach_timespec_t mts;
52 host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
53 clock_get_time(cclock, &mts);
54 mach_port_deallocate(mach_task_self(), cclock);
55 tsstop.tv_sec = mts.tv_sec;
56 tsstop.tv_nsec = mts.tv_nsec;
57#else
58 clock_gettime(CLOCK_REALTIME, &tsstop);
59#endif
60 cstop = clock();
61 }
62
63public:
64
65 //! Default constructor
66 timer()
67 :running(false),cstart(0),cstop(0)
68 {
69 tsstart = timespec();
70 tsstop = timespec();
71 }
72
73 /*! \brief Start the timer
74 *
75 */
76 void start()
77 {
78 // time is running
79 running = true;
80
81#if defined(SYNC_BEFORE_TAKE_TIME) && defined(__NVCC__)
82 cudaDeviceSynchronize();
83#endif
84
85#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
86 clock_serv_t cclock;
87 mach_timespec_t mts;
88 host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
89 clock_get_time(cclock, &mts);
90 mach_port_deallocate(mach_task_self(), cclock);
91 tsstart.tv_sec = mts.tv_sec;
92 tsstart.tv_nsec = mts.tv_nsec;
93#else
94 clock_gettime(CLOCK_REALTIME, &tsstart);
95#endif
96
97 cstart = clock();
98
99 }
100
101 /*! \brief Stop the timer
102 *
103 *
104 */
105 void stop()
106 {
107 if (running == false) return;
108 running = false;
109 check();
110 }
111
112 /*! \brief Return the elapsed real time
113 *
114 *
115 */
116 double getwct()
117 {
118 if (running == true)
119 check();
120
121 return ((double)(tsstop.tv_sec - tsstart.tv_sec)) + ((1e-9) * ((double)(tsstop.tv_nsec - tsstart.tv_nsec)));
122 }
123
124 /*! \brief Return the cpu time
125 *
126 *
127 */
128 double getcputime()
129 {
130 if (running == true)
131 check();
132
133 return (((double)(cstop - cstart)) / CLOCKS_PER_SEC);
134 }
135
136 /*! \brief Reset the timer
137 *
138 *
139 */
140 void reset()
141 {
142 tsstart = tsstop;
143 cstart = cstop;
144 }
145};
146
147#endif
148
149
150