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

时间:2016-11-14 22:23:44

标签: c++ cuda

我有一个相同算法的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);

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

是的,这是获得CPU与GPU时间比较的好方法。

当然,有多种方法可以获得CPU时序,从高分辨率系统定时器到__rdtsc内在函数。但是对于这种粗略的比较,要么应该都能正常工作。

如果您想深入了解GPU性能并寻找潜在的改进领域,您可能需要查看命令行CUDA分析器nvprofVisual 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