对于CUDA共享内存原子,哪一个更快-扭曲局部性还是反局部性?

时间:2018-08-01 21:28:35

标签: cuda gpu-shared-memory gpu-atomics

假定(CUDA内核网格)块中的许多扭曲正在重复更新相当数量的共享内存位置。

在哪些情况下可以更快地完成此类工作? :

  1. 对于经线内访问区域,例如每个经线访问的内存位置总数很小,并且大多数确实是由多个通道访问的。
  2. 在进行反本地访问的情况下,通常所有车道都访问不同的位置(也许是为了避免银行冲突)?

同样重要的是-这种微体系结构是依赖的,还是在所有最近的NVIDIA微体系结构上都是相同的?

3 个答案:

答案 0 :(得分:1)

反本地化访问将更快。

在SM5.0(Maxwell)和更高版本的GPU上,共享存储原子(假设添加)将由于地址冲突(两个具有相同地址的通道)而重播指令。正常的银行冲突重播也适用。在Maxwell / Pascal上,共享存储单元在两个SM分区(每个分区中有2个调度程序)之间具有固定的循环访问。对于每个分区,共享存储单元将在移至下一条指令之前完成该指令的所有重播。 Volta SM将在任何其他共享内存指令之前完成指令。

  1. 避免银行冲突
  2. 避免地址冲突

在Fermi和Kepler体系结构上,必须在读取修改写入操作之前执行共享内存锁定操作。这阻止了所有其他变形指令。

感谢Fermi / Kepler,Maxwell和更新的GPU具有显着更快的共享内存原子性能。

可以编写一个非常简单的内核来对两种不同情况进行微基准测试。 CUDA探查器为共享内存访问提供指令执行计数和重播计数,但由于原子/加载冲突或向量访问而无法区分原子和原子重播。

答案 1 :(得分:0)

这是一个推测性的部分答案。

考虑以下相关问题:Performance of atomic operations on shared memory及其accepted answer

如果接受的答案是正确的(并且直到今天仍然是正确的),那么局部化访问中的扭曲线程将互相干扰,从而使许多通道的原子操作速度变慢,即产生反局部性扭曲原子更好。

但是,老实说-我不确定我是否完全赞同这一论点,也不知道自从写出答案以来情况是否有所改变。

答案 2 :(得分:0)

即使不需要了解有关如何在CUDA硬件中实现共享内存原子的任何信息,也可以做一个非常简单的论点:归根结底,原子操作必须以某种方式在< em>某点。一般来说,这是正确的,无论您在哪个平台或硬件上运行都没有关系。原子性有点本质上要求。如果您有多个并行执行的原子操作,则必须以确保原子性的方式以某种方式执行它们。这意味着,无论我们使用的是GPU还是CPU,随着竞争的增加,原子操作总是会变慢。唯一的问题是:多少钱。这取决于具体的实现。

因此,通常,您希望保持争用级别,即试图在同一内存位置上并行执行原子操作的线程数尽可能少……