如何在cuda和c++代码中进行可比较的时间度量
How to make comparable timemeasurement in cuda and c++ code
我有一个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部分。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 标准::可选枚举的比较运算符
- 用于比较基元类型的std::可选的有趣程序集
- 可作为常量调用的比较对象
- VC142 和 2019 可再发行组件包与 VC141 的比较
- 可视化如何插入单词并使用它在C 中进行IF进行比较
- 可比较的类和二叉搜索树
- 可与Python中的array[++i]和array[i++]进行比较的代码
- 可视化C++编译器与其他C++编译器的比较
- 可视化比较双重错误C++
- 比较 (<)、输出 (<<) 和赋值 (=) 用于提升::可选
- 比较从相同源代码生成的两个可执行文件的校验和
- 如何在cuda和c++代码中进行可比较的时间度量
- 比较两个 C 样式字符串的 C++ For 循环的效率和可重复性
- c++ std::sort():仅使用一个比较函数的任何可比较成员的对象向量
- linux/freebsd中的套接字描述符是否保证具有几乎连续的或可比较的数字?
- Std::string not nothrow move可赋值或可比较
- 如何为映射编写可选比较函函数
- C++中的可比较项数组