在 CUDA 中,非合并内存访问是否会导致分支分歧



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

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

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

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

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

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

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

最新更新