c++ - 测量 C++ 和 CUDA 代码的运行时间

标签 c++ time cuda cross-platform

我有一个这样的函数:

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/

相关文章:

c++ - 你能从第三方预编译的 LIB 文件中提取或生成 PDB 文件吗

c++ - 无法将 '<brace-enclosed initializer list>' 转换为 'double' 作为返回

c++ - C++中的打印相反三角形函数

java - 对根据输入大小平均不同排序算法的持续时间感到困惑吗?

image - 使用 GPU (CUDA) 时 opencv 中的像素访问

c++ - ONVIF: 'GetSnapshotUri' 直接从网络摄像机保存到 FTP

ruby - 在 Ruby 中将两位数年份转换为四位数年份

cuda - 如何选择带有 CUDA 的 GPU?

在 Cuda 内核中调用 Opencv 函数

java - 如何对分钟值进行舍入?