如何初始化 CUDA 以便我可以进行有效的执行时间测量?

How to initialize CUDA so I can make valid execution time measurements?

在我的应用程序中,我使用 CUDA 为 CPU 和 GPU 实现了相同的算法,我必须测量在 CPU 和 GPU 上执行算法所需的时间。我注意到在 GPU 版本的算法中 CUDA 初始化花费了一些时间,并在程序代码的开头添加了 cudaFree(0);,因为它建议 here 用于 CUDA 初始化,但它仍然需要更多时间第一个 GPU CUDA 算法执行,比第二个。

是否有任何其他 CUDA 相关的东西必须在开始时初始化才能正确测量实际算法执行时间?

CUDA 运行time API 中惰性上下文初始化的试探法发生了微妙的变化,因为您链接到的答案是用我知道的两种方式编写的:

  1. cudaSetDevice() 现在启动一个上下文,而早些时候它没有(因此需要 cudaFree() 在该答案中讨论的调用)
  2. 一些与设备代码相关的初始化,运行time API 用于在上下文初始化时执行的初始化现在在第一次调用内核时完成

我知道的第二项的唯一解决方案是 运行 您想要计时一次的 CUDA 内核代码 "warm up" 以吸收设置延迟,并且 然后 对代码进行计时以进行基准测试。

或者,您可以使用驱动程序 API 并且可以更精细地控制应用程序启动期间何时出现延迟。