我正在尝试测量我的代码性能(这是OpenCL内核的执行),我真的需要了解加速。我试着使用clock()和clock_gettime()函数。
在第一种情况下,我的代码简单明了,并且测量正确:
struct timespec start_r, start_m, stop_r, stop_m;
double realtime, monotonic;
time_t start2 = clock();
if(clock_gettime(CLOCK_REALTIME, &start_r) == -1) {
cout << "clock realtime error!" << endl;
}
if(clock_gettime(CLOCK_MONOTONIC, &start_m) == -1) {
cout << "clock realtime error!" << endl;
}
double res = 0.0;
for(unsigned long i = 0; i < total; i++) {
res += data[i];
}
cout << "res = " << res << endl;
time_t end2 = clock();
if(clock_gettime(CLOCK_REALTIME, &stop_r) == -1) {
cout << "clock realtime error!" << endl;
}
if(clock_gettime(CLOCK_MONOTONIC, &stop_m) == -1) {
cout << "clock realtime error!" << endl;
}
cout << "Time clock() = " << (end2 - start2)/(double)CLOCKS_PER_SEC << endl;
realtime = (stop_r.tv_sec - start_r.tv_sec) + (double)(stop_r.tv_nsec - start_r.tv_nsec) / (double)BILLION;
monotonic = (stop_m.tv_sec - start_m.tv_sec) + (double)(stop_m.tv_nsec - start_m.tv_nsec) / (double)BILLION;
cout << "Realtime = " << realtime << endl << "Monotonic = " << monotonic << endl;
它给出了可以理解的结果 - 所有三个结果几乎相同。
当谈到测量OpenCL内核的执行时间时,我做的完全一样,但我得到的结果很糟糕:
Time = 0.04
Realtime = 0.26113
Monotonic = 0.26113
你能告诉我它有什么问题吗? 如果这是测量OpenCL内核性能的常见问题,您能否提出测量它的最佳方法?谢谢!
答案 0 :(得分:2)
如果您有权访问C ++ 11编译器,请考虑使用std :: chrono:http://en.cppreference.com/w/cpp/chrono
新的C ++标准中内置了三种时钟类型:
此外,无论您需要微秒精度还是其他内容,该库都经过精心设计,可以处理不同级别的粒度。对于我过去编写的软件(大型工业工程类型模拟),我依靠std :: steady_clock来完成所有时间而没有任何抱怨: - )。
答案 1 :(得分:2)
在某些系统中,函数clock
将测量应用程序使用的CPU时间。如果您的应用程序使用OpenCL,它可能会花费大部分时间等待图形卡执行实际计算,因此clock
不会给您&#34;获取结果所花费的实际时间& #34 ;.例如,从文件读取数据时使用clock
类似 - 从文件读取100MB所需的时间可能是2秒。但是,只需0.01秒的CPU时间就可以将命令发送到硬盘,并在硬盘控制器将数据存储到内存中时收回数据。所以clock
给出&#34; 0.01s&#34;而不是&#34; 2s&#34;。