cuda内核调用是同步还是异步

时间:2011-12-12 11:31:03

标签: nvidia cuda

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

3 个答案:

答案 0 :(得分:31)

内核调用从CPU的角度来看是异步的,所以如果你连续调用2个内核,第二个内核将被调用而不等待第一个完成。它只表示控件立即返回CPU。

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

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

检查每个CUDA程序员应阅读的3.2.5节中的CUDA C编程指南。

答案 1 :(得分:5)

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

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

  • 环境变量sonata-project/intl-bundle等于1.
  • 使用分析器(CUDA_LAUNCH_BLOCKING),而不启用并发内核分析
  • 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)。

答案 2 :(得分:0)

自2.0 CUDA功能版本起支持并发内核执行。

此外,可以比所有warp内核更早地返回CPU代码。

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

相关问题