在CUDA中,非合并内存访问会导致分支差异吗?

Ben*_*Ben 6 branch cuda

我一直认为分支差异只是由分支代码引起的,比如"if","else","for","switch"等.但是我最近读过一篇论文,其中说:

" 人们可以清楚地看到,通过线程中的每个第一次探索基于算法采取的不同分支的数量至少比全勘探战略两次更重要.这是典型的额外的未合并的结果访问全局存储器.因此,这样的线程分歧导致许多必须序列化的存储器访问,增加了执行的指令总数.

可以观察到,使用非合并访问的版本的warp序列化数量比其对应版本重要7到16倍.实际上,由非合并访问引起的线程分歧导致许多必须被序列化的存储器访问,增加了要执行的指令. "

根据作者的说法,似乎非合并访问会导致不同的分支.真的吗?我的问题是,分支差异究竟有多少原因?提前致谢.

Rog*_*ahl 3

我认为作者对概念和/或术语不清楚。

发散和序列化这两个概念密切相关。发散会导致序列化,因为 warp 中不同的线程组必须串行执行。但序列化不会导致发散,因为发散特指 Warp 中运行不同代码路径的线程。

其他导致序列化(但不是发散)的因素是存储体冲突和原子操作。