如何在cuda和c++代码中进行可比较的时间度量



我有一个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 msn", 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 msn", mseconds);

这是获得良好可比结果的正确方法吗?

提前感谢!

是的,这是获得cpu vs gpu时间比较的好方法。

当然,有多种方法可以获得CPU计时,从高分辨率系统计时器到__rdtsc intrinsic。但是对于这种粗略的比较,两者都可以。

如果你想更深入地研究你的GPU性能并寻找潜在的改进领域,你可能想看看命令行CUDA分析器nvprof,或者在Visual profiler,它做同样的事情,但也有一个GUI。

如果你只是想比较你的cuda相关的东西的整个执行时间,你可以保留你的c++时间测量。在检查运行时间之前,请确保您的设备已完成所有任务:

gettimeofday(&start, NULL);
// some work to do
cudaDeviceSynchronize();
gettimeofday(&end, NULL);

这是一个简单的方法来计算你的任务在设备端与CPU端相比花费了多少时间。

根据ApoorvaJ的建议,如果你需要深入研究CUDA性能来检查设备瓶颈在哪里,你可以使用Visual Profiler。如果您正在使用Visual Studio,请检查我为另一个想要检查PTX代码的SO用户编写的这些步骤。您只需要探索Visual Profiler可以提供的其他数据,而且有很多!查看Nvidia官方CUDA文档中的Profiler部分。

最新更新