在内核中使用cudaDeviceSynchronize()进行全局同步

Mic*_*ael 0 cuda

我刚刚阅读了有关动态并行性的文档.我想知道:我可以cudaDeviceSynchronize()在内核中使用同步当前在该设备上运行的所有块吗?

文件说:

来自任何线程的CUDA运行时操作(包括内核启动)在线程块中都是可见的.这意味着父网格中的调用线程可以对由该线程启动的网格,线程块中的其他线程或在同一线程块内创建的流执行同步.

此外:

在网格中创建的流和事件存在于线程块范围内,但在创建它们的线程块之外使用时具有未定义的行为.

这对我的问题基本上是不对的.但是因为cudaDeviceSynchronize()整个设备使用全局流,我不确定该流是否可见,并且设备上的所有线程都是相同的,无论它们属于哪个块或启动.这样我就可以cudaDeviceSynchronize()在内核中实际进行全局同步.

Jez*_*Jez 5

不可以.无法安全地进行设备范围的同步.

编程指南(链接)的C.3.1.4节:

cudaDeviceSynchronize()函数将同步线程块中任何线程启动的所有工作,直到调用cudaDeviceSynchronize()为止.

它没有说明与其他线程块交互.

一般而言,CUDA中的全局同步会导致问题,因为最常用于填充GPU工作的超额预订方法.要同步的块数通常比设备上的块大得多,因此每个块的上下文必须交换进出全局内存,从而破坏性能.

如果您知道自己有特殊情况,可以使用黑客来解决此问题,但通常情况下,同步块的最简单,最有效的方法是退出内核并启动新内核.