【问题标题】:CUDA timers - CPU vs. GPU?CUDA 计时器 - CPU 与 GPU?
【发布时间】:2013-12-21 22:58:04
【问题描述】:

我试图了解使用 CUDA 计时器(事件)和常规 CPU 计时方法(Linux 上的gettimeofday 等)计时内核执行之间的区别。

通过阅读http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/ 8.1 节,在我看来,唯一真正的区别是,在使用 CPU 计时器时,需要记住同步 GPU,因为调用是异步的。大概 CUDA 事件 API 会为您执行此操作。

所以这真的是一个问题:

  1. 对于 GPU 事件,您无需显式调用 cudaDeviceSynchronize
  2. 借助 GPU 事件,您可以获得与平台无关的固有计时 API,而对于 CPU,您需要为每个操作系统使用单独的 API

?

提前致谢

【问题讨论】:

    标签: cuda


    【解决方案1】:

    你已经搞定了。因为 GPU 与 CPU 异步运行,所以当您启动 GPU 内核时,CPU 可以继续其愉快的方式。计时时,这意味着您可以在 GPU 从其内核返回之前到达计时代码的末尾(即记录持续时间)。这就是我们同步的原因......以确保在我们继续处理 CPU 代码之前内核已经完成。当我们需要来自 GPU 内核的结果进行后续操作(即算法中的步骤)时,这一点尤其重要。

    如果有帮助,您可以将cudaEventSynchronize 视为来自 CPU-GPU 的同步点,因为 CPU 计时器取决于 CPU 和 GPU 代码,而 cuda 计时器事件仅取决于 GPU 代码。而且因为这些 cuda 计时事件是由 nvcc 专门为 CUDA 平台编译的,所以它们独立于 CPU 平台,但依赖于 GPU 平台。

    【讨论】:

    • 总的来说,我同意您的回答,并且我同意 OP 的概念基本正确。但是我不确定我是否同意这种说法:“而 cuda 计时器事件仅取决于 GPU 代码”。至少在 linux 上,我可以将 cuda 计时器事件包装在纯主机代码的代码周围(我的程序中甚至不需要任何 CUDA,除了 cudaEvents 计时机制),它似乎可以准确地计时主机代码的持续时间,据我所知。因此,在我看来,cudaEvents 出于经过时间的目的,将对 CPU 和 GPU 代码之间发生的超集进行计时。
    • 好点。似乎你不是唯一一个发现这是真的的人。请参阅相关的 SO 问题 here
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2013-09-19
    • 2014-08-23
    • 1970-01-01
    • 2012-03-22
    • 2013-05-02
    相关资源
    最近更新 更多