假设我有几个线程,它们访问地址 A+0、A+4、A+8、A+12 的内存(每个访问 = 下一个线程)。这种访问是合并的,对吧?
但是,如果我可以访问相同的内存但顺序相反,则意味着:
thread 0 -> A+12
thread 1 -> A+8
thread 2 -> A+4
thread 3 -> A+0
这里是否也触发了合并?
是的,对于 cc 2.0 和更新的 GPU,只要所有请求的 32 位数据元素来自(请求)相同的 128 字节(和 128 字节),任何随机排列的 32 位数据元素到线程都会发生合并对齐)全局内存中的区域。
GPU 在内存控制器中有一个类似于“交叉开关”的东西,它将根据需要分配元素。您可能对此 GPU 网络研讨会感兴趣,该研讨会讨论了合并,并将以图形方式说明这一特殊情况(在幻灯片 12 上)。
NVIDIA 网络研讨会页面还有其他您可能感兴趣的有用网络研讨会。
对于 cc2.0 之前的设备 ,具体情况因计算能力而异,但支持计算 1.0 和 1.1 的设备没有这种能力来合并“逆序”或随机顺序的读取。
还值得注意的是,Nvidia GPU 中 L2 缓存的主要目的是折叠读取和合并写入。因此,如果一个经线正在访问
thread 0 -> A+0
thread 1 -> A+8
thread 2 -> A+16
thread 3 -> A+24
...
另一个经线正在访问
thread 0 -> A+4
thread 1 -> A+12
thread 2 -> A+20
thread 3 -> A+28
...
这两个访问不会在 SM 内部合并,但通常会在 L2 缓存中合并,因此 GPU 内存只会被触及一次。