我有一个这样的函数:
int doSomething() {
<C++ host code>
<CUDA device code>
<C++ host code>
<...>
}
我想在 Linux 和 Windows 上以高精度(至少毫秒)测量此函数的运行时间。
我知道如何测量带有事件的 CUDA 程序的运行时间,并且我找到了非常准确的库来测量我的进程使用的 CPU 时间,但我想测量整体运行时间。我无法以不同方式测量这两个时间并将它们加在一起,因为设备代码和主机代码可以并行运行。
我想使用尽可能少的外部库,但我对任何好的解决方案都很感兴趣。
最佳答案
根据您显示的顺序,我建议您执行以下操作:
int doSomething() {
<C++ host code>
<CUDA device code>
<C++ host code>
<...>
cudaDeviceSynchronize(); // add this
}
和:
<use your preferred CPU high precision measurement start function>
doSomething();
<use your preferred CPU high precision measurement stop function>
添加的cudaDeviceSynchronize()
如果您之前有一些隐式同步,例如 cudaMemcpy()
,则不需要调用在 <CUDA device code>
中的最后一个内核之后调用部分。
在回答下面评论中的一个问题时,@JackOLantern 似乎在建议一种高精度的 CPU 计时方法,其开始 (tic) 和停止 (toc) 点在 the answer here 中。 . talonmies 也指出了这一点。如果您不喜欢使用 CLOCK_MONOTONIC
返回的结果您也可以尝试指定 CLOCK_REALTIME_HR
反而。在 linux 机器上做 man clock_gettime
了解更多信息。
关于c++ - 测量 C++ 和 CUDA 代码的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16304632/