SpikeGPU  1.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
timer.h
Go to the documentation of this file.
1 
5 #ifndef TIMER_H
6 #define TIMER_H
7 
8 #include <cuda.h>
9 #include <cuda_runtime.h>
10 
11 #ifdef WIN32
12 #include <Windows.h>
13 #else
14 #include <sys/time.h>
15 #endif
16 
17 
18 namespace spike {
19 
20 
22 class Timer {
23 public:
24  virtual ~Timer() {}
25  virtual void Start()=0;
26  virtual void Stop()=0;
27  virtual double getElapsed()=0;
28 };
29 
30 
32 
35 class GPUTimer : public Timer {
36 protected:
37  int gpu_idx;
38  cudaEvent_t timeStart;
39  cudaEvent_t timeEnd;
40 public:
41  GPUTimer(int g_idx = 0) {
42  gpu_idx = g_idx;
43 
44  cudaEventCreate(&timeStart);
45  cudaEventCreate(&timeEnd);
46  }
47 
48  virtual ~GPUTimer() {
49  cudaEventDestroy(timeStart);
50  cudaEventDestroy(timeEnd);
51  }
52 
53  virtual void Start() {
54  cudaEventRecord(timeStart, 0);
55  }
56 
57  virtual void Stop() {
58  cudaEventRecord(timeEnd, 0);
59  cudaEventSynchronize(timeEnd);
60  }
61 
62  virtual double getElapsed() {
63  float elapsed;
64  cudaEventElapsedTime(&elapsed, timeStart, timeEnd);
65  return elapsed;
66  }
67 };
68 
69 
71 
75 #ifdef WIN32
76 
77 class CPUTimer : public Timer
78 {
79 public:
80  CPUTimer()
81  {
82  QueryPerformanceFrequency(&m_frequency);
83  }
84  ~CPUTimer() {}
85 
86  virtual void Start() {QueryPerformanceCounter(&m_start);}
87  virtual void Stop() {QueryPerformanceCounter(&m_stop);}
88 
89  virtual double getElapsed() {
90  return (m_stop.QuadPart - m_start.QuadPart) * 1000.0 / m_frequency.QuadPart;
91  }
92 
93 private:
94  LARGE_INTEGER m_frequency;
95  LARGE_INTEGER m_start;
96  LARGE_INTEGER m_stop;
97 };
98 
99 #else // WIN32
100 
101 class CPUTimer : public Timer {
102 protected:
103  timeval timeStart;
104  timeval timeEnd;
105 public:
106  virtual ~CPUTimer() {}
107 
108  virtual void Start() {
109  gettimeofday(&timeStart, 0);
110  }
111 
112  virtual void Stop() {
113  gettimeofday(&timeEnd, 0);
114  }
115 
116  virtual double getElapsed() {
117  return 1000.0 * (timeEnd.tv_sec - timeStart.tv_sec) + (timeEnd.tv_usec - timeStart.tv_usec) / 1000.0;
118  }
119 };
120 
121 #endif // WIN32
122 
123 } // namespace spike
124 
125 
126 #endif
virtual double getElapsed()
Definition: timer.h:62
Base timer class.
Definition: timer.h:22
virtual ~GPUTimer()
Definition: timer.h:48
cudaEvent_t timeEnd
Definition: timer.h:39
timeval timeEnd
Definition: timer.h:104
virtual ~CPUTimer()
Definition: timer.h:106
virtual void Start()
Definition: timer.h:108
GPU timer.
Definition: timer.h:35
GPUTimer(int g_idx=0)
Definition: timer.h:41
virtual void Stop()
Definition: timer.h:112
virtual void Start()
Definition: timer.h:53
virtual void Stop()=0
cudaEvent_t timeStart
Definition: timer.h:38
virtual void Start()=0
int gpu_idx
Definition: timer.h:37
virtual double getElapsed()=0
timeval timeStart
Definition: timer.h:103
virtual double getElapsed()
Definition: timer.h:116
virtual void Stop()
Definition: timer.h:57
virtual ~Timer()
Definition: timer.h:24
CPU timer.
Definition: timer.h:101