一些以 _sync() 命名的内部函数附加在 CUDA 9 中;语义相同?

Some intrinsics named with `_sync()` appended in CUDA 9; semantics same?

在CUDA 9中,nVIDIA似乎有了这个新概念"cooperative groups";由于某些我不完全清楚的原因,__ballot() 现在(= CUDA 9)已弃用,取而代之的是 __ballot_sync()。那是别名还是语义改变了?

...其他内置函数的类似问题现在已将 __sync() 添加到它们的名称中。

不,语义不一样。函数调用本身是不同的,一个不是另一个的别名,新的功能已经暴露,现在 Volta 架构和以前的架构之间的实现行为是不同的。

首先,要设置基础工作,有必要认识到 Volta introduced the possibility for independent thread scheduling 通过引入每线程程序计数器和其他更改这一事实。因此,Volta 可能会在很长一段时间内表现出非扭曲同步行为,并且在执行期间,以前的架构可能仍然是扭曲同步的。

大多数 warp 内在函数仅通过为实际参与的线程提供预期结果来工作(即在该周期中对于该指令的发出实际上是活跃的)。程序员现在可以通过新的 mask 参数明确指定哪些线程应该参与。然而,有一些要求,特别是在 Pascal 和以前的体系结构上。来自 the programming guide:

Note, however, that for Pascal and earlier architectures, all threads in mask must execute the same warp intrinsic instruction in convergence, and the union of all values in mask must be equal to the warp's active mask.

然而,在 Volta 上,warp 执行引擎将在掩码中指示的线程中产生必要的 synchronization/participation,以使 desired/indicated 操作有效(假设适当的 _sync 使用内在的版本)。需要明确的是,warp 执行引擎将重新聚合在 volta 上发散的线程以匹配掩码,但是它不会克服程序员引起的错误,例如阻止线程通过条件语句参与 _sync() 内在函数。

相关问题讨论mask参数。此答案并非旨在解决独立线程调度可能产生的所有可能问题以及对 warp 级内在函数的影响。为此,我鼓励阅读编程指南。