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

时间:2013-09-30 09:22:49

标签: cuda branch

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

可以清楚地看到,每个第一次基于探索的算法中线程所采用的不同分支的数量至少比完整探索策略重要两倍。 这通常是对全局内存的额外非合并访问的结果。因此,这样的线程分歧导致许多内存访问必须被序列化,增加了执行的指令总数。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

导致序列化(但不是分歧)的其他因素是银行冲突和原子操作。