【问题标题】:In CUDA, do non-coalesced memory accesses cause branch divergence?在 CUDA 中,非合并内存访问会导致分支分歧吗?
【发布时间】:2013-09-30 09:22:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能链接到原始参考吗?
  • +1 我真的很想知道内存访问策略如何负责发散分支。请添加参考。
  • 这篇论文应该是参考。这两个段落分别来自 p80 和 p107。 mistic.heig-vd.ch/luong/thesis.pdf
  • 很抱歉没有提供参考。非常感谢 Eric 为我做这件事。

标签: cuda branch


【解决方案1】:

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

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

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

【讨论】:

  • 另一个没有分支分歧的序列化例子是对常量内存的非统一访问。
  • 感谢您澄清这两个概念。所以算法/代码的非合并内存访问模式与分支分歧完全无关,更具体地说,与从 NVIDIA Profiler 得到的“分支效率”结果无关?
  • @Ben:没错。 CUDA Profiler 文档说:Branch Efficiency = ({Branches} - {Diverged Branches}) / {Branches}Diverged Branches = branches that were evaluated differently across a warpBranches = branch instructions executed。换句话说,Branch Efficiency 专门与 warp 中的分支指令相关,并计算它们分歧的实例(一些被采用,一些未被采用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2012-11-26
  • 2014-01-25
  • 2018-12-13
  • 2015-04-28
  • 2012-05-06
  • 1970-01-01
相关资源
最近更新 更多