【问题标题】:Are cuda kernel calls synchronous or asynchronouscuda内核调用是同步的还是异步的
【发布时间】:2012-01-18 09:44:15
【问题描述】:

我读到可以使用内核启动来同步不同的块,即,如果我希望所有块在进行操作 2 之前完成操作 1,我应该将操作 1 放在一个内核中,将操作 2 放在另一个内核中。这样,我可以实现块之间的全局同步。但是,cuda c 编程指南提到内核调用是异步的,即。 CPU 不会等待第一个内核调用完成,因此 CPU 也可以在第一个内核完成之前调用第二个内核。但是,如果这是真的,那么我们就不能使用内核启动来同步块。请让我知道我哪里出错了

【问题讨论】:

    标签: nvidia cuda


    【解决方案1】:

    从 CPU 的角度来看,内核调用是异步的,因此如果您连续调用 2 个内核,则将调用第二个内核,而无需等待第一个内核完成。这只是意味着控制权立即返回给CPU。

    在 GPU 方面,如果您没有指定不同的流来执行内核,它们将按照它们被调用的顺序执行(如果您没有指定流,它们都会转到默认流并串行执行)。只有在第一个内核完成后,第二个内核才会执行。

    此行为对于具有支持并发内核执行的计算能力 2.x 的设备有效。在其他设备上,即使内核调用仍然是异步的,内核执行始终是顺序的。

    查看第 3.2.5 节中的 CUDA C 编程指南,每个 CUDA 程序员都应该阅读。

    【讨论】:

      【解决方案2】:

      接受的答案并不总是正确的。

      在大多数情况下,内核启动是异步的。但在以下情况下,它是同步的。而且很容易被人们忽视。

      • 环境变量CUDA_LAUNCH_BLOCKING等于1。
      • 使用分析器 (nvprof),但未启用并发内核分析
      • memcpy 涉及未页面锁定的主机内存。

      程序员可以通过将 CUDA_LAUNCH_BLOCKING 环境变量设置为 1 来为系统上运行的所有 CUDA 应用程序全局禁用内核启动的异步性。此功能仅用于调试目的,不应用作使生产软件可靠运行的方法.

      如果硬件计数器是通过分析器(Nsight、Visual Profiler)收集的,则内核启动是同步的,除非启用了并发内核分析。如果异步内存副本涉及未页面锁定的主机内存,它们也将是同步的。

      来自 NVIDIA CUDA 编程指南 (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#concurrent-execution-host-device)。

      【讨论】:

        【解决方案3】:

        从 2.0 CUDA 功能版本开始支持并发内核执行。

        此外,可以在所有 warp 内核工作之前返回 CPU 代码。

        在这种情况下,您可以自己提供同步。

        【讨论】:

        • 并发内核执行与异步内核执行完全不同。不,您不能自己提供同步。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 2020-05-15
        • 2020-02-21
        • 2013-02-25
        • 2012-12-30
        • 2014-04-25
        相关资源
        最近更新 更多