Skip to content

Instantly share code, notes, and snippets.

@srvm
Last active March 17, 2017 22:10
Show Gist options
  • Select an option

  • Save srvm/5811f7d6a01040b2b0c2 to your computer and use it in GitHub Desktop.

Select an option

Save srvm/5811f7d6a01040b2b0c2 to your computer and use it in GitHub Desktop.
CPU and GPU timing code
#pragma once
namespace util {
struct gpu_timer {
#ifdef __CUDACC__
gpu_timer() {
cudaEventCreate(&m_start);
cudaEventCreate(&m_end);
cudaEventRecord(m_start, 0);
}
float milliseconds_elapsed() {
float elapsed_time;
cudaEventRecord(m_end, 0);
cudaEventSynchronize(m_end);
cudaEventElapsedTime(&elapsed_time, m_start, m_end);
return elapsed_time;
}
float seconds_elapsed() {
return milliseconds_elapsed() / 1000.0;
}
protected:
cudaEvent_t m_start, m_end;
#endif // __CUDACC__
};
struct cpu_timer {
public:
cpu_timer() {
t1 = ClockGetTime();
}
double nanoseconds_elapsed() {
t2 = ClockGetTime();
return diff(t1, t2).tv_sec * 1000000000LL + diff(t1, t2).tv_nsec;
}
double microseconds_elapsed() {
return nanoseconds_elapsed() / 1000.0;
}
double milliseconds_elapsed() {
return microseconds_elapsed() / 1000.0;
}
double seconds_elapsed() {
return milliseconds_elapsed() / 1000.0;
}
protected:
timespec diff(timespec start, timespec end) {
timespec temp;
if ((end.tv_nsec-start.tv_nsec)<0) {
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
} else {
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
}
return temp;
}
// Nano second precision CPU clock
timespec ClockGetTime() {
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
return ts; //(uint64_t)ts.tv_sec * 1000000000LL + (uint64_t)ts.tv_nsec;
}
protected:
timespec t1, t2;
};
} // namespace util
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment