6

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

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

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

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

4

1 回答 1

3

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

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

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

于 2013-09-30T14:59:37.120 回答