我正在尝试比较GPU与CPU的性能。对于NVIDIA GPU,我一直在使用cudaEvent_t
类型来获得非常精确的时间。
对于CPU,我一直在使用以下代码:
// Timers
clock_t start, stop;
float elapsedTime = 0;
// Capture the start time
start = clock();
// Do something here
.......
// Capture the stop time
stop = clock();
// Retrieve time elapsed in milliseconds
elapsedTime = (float)(stop - start) / (float)CLOCKS_PER_SEC * 1000.0f;
显然,只有当您数秒时,这段代码才是好的。而且,结果有时出来很奇怪。
有人知道在Linux中创建高分辨率计时器的某些方法吗?
最佳答案
checkout clock_gettime
,这是高分辨率计时器的POSIX接口(interface)。
如果在阅读了联机帮助页后,还想知道CLOCK_REALTIME
和CLOCK_MONOTONIC
之间的区别,请参阅Difference between CLOCK_REALTIME and CLOCK_MONOTONIC?
有关完整的示例,请参见以下页面:http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/
#include <iostream>
#include <time.h>
using namespace std;
timespec diff(timespec start, timespec end);
int main()
{
timespec time1, time2;
int temp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for (int i = 0; i< 242000000; i++)
temp+=temp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
return 0;
}
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;
}