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

Pro*_*mer 24 cuda nvidia

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

jms*_*msu 34

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

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

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

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


pgp*_*628 8

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

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

  • 环境变量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)。