我有一个相同算法的cuda和cpp实现。在CUDA中,我使用事件进行时间测量:
cudaEvent_t start, stop;
float time;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0); // start time measurement
// some cuda stuff
cudaEventRecord(stop, 0); // stop time measurement
cudaEventSynchronize(stop); // sync results
cudaEventElapsedTime(&time, start, stop);
printf ("Elapsed time : %f ms\n", time);
在c ++中,我用timeofday测量:
struct timeval start, end;
long seconds, useconds;
float mseconds;
gettimeofday(&start, NULL);
// some work to do
gettimeofday(&end, NULL);
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
mseconds = (seconds * 1000 + useconds/1000.0) + 0.5;
printf ("Elapsed time : %f ms\n", mseconds);
这是获得良好可比结果的正确方法吗?
提前致谢!
答案 0 :(得分:0)
是的,这是获得CPU与GPU时间比较的好方法。
当然,有多种方法可以获得CPU时序,从高分辨率系统定时器到__rdtsc内在函数。但是对于这种粗略的比较,要么应该都能正常工作。
如果您想深入了解GPU性能并寻找潜在的改进领域,您可能需要查看命令行CUDA分析器nvprof或Visual Profiler,同样的事情,但也有一个GUI。
答案 1 :(得分:0)
如果您只想比较CUDA相关内容的整个执行时间,可以保留C ++时间测量值。只需确保您的设备在检查已用时间之前完成了每项任务:
gettimeofday(&start, NULL);
// some work to do
cudaDeviceSynchronize();
gettimeofday(&end, NULL);
这是一种计算CUDA在设备端与CPU端相比花费了多少时间的简单方法。
正如ApoorvaJ所建议的,如果您需要深入了解CUDA性能以检查设备瓶颈在哪里,您可以使用Visual Profiler。如果您使用的是Visual Studio,请检查我为另一个想要检查PTX代码的SO用户写的these steps。您只需要探索Visual Profiler可以提供的其他数据,并且有很多! 查看Nvidia官方CUDA文档中的Profiler section。