假定(CUDA内核网格)块中的许多扭曲正在重复更新相当数量的共享内存位置。
在哪些情况下可以更快地完成此类工作? :
同样重要的是-这种微体系结构是依赖的,还是在所有最近的NVIDIA微体系结构上都是相同的?
答案 0 :(得分:1)
在SM5.0(Maxwell)和更高版本的GPU上,共享存储原子(假设添加)将由于地址冲突(两个具有相同地址的通道)而重播指令。正常的银行冲突重播也适用。在Maxwell / Pascal上,共享存储单元在两个SM分区(每个分区中有2个调度程序)之间具有固定的循环访问。对于每个分区,共享存储单元将在移至下一条指令之前完成该指令的所有重播。 Volta SM将在任何其他共享内存指令之前完成指令。
在Fermi和Kepler体系结构上,必须在读取修改写入操作之前执行共享内存锁定操作。这阻止了所有其他变形指令。
感谢Fermi / Kepler,Maxwell和更新的GPU具有显着更快的共享内存原子性能。
可以编写一个非常简单的内核来对两种不同情况进行微基准测试。 CUDA探查器为共享内存访问提供指令执行计数和重播计数,但由于原子/加载冲突或向量访问而无法区分原子和原子重播。
答案 1 :(得分:0)
这是一个推测性的部分答案。
考虑以下相关问题:Performance of atomic operations on shared memory及其accepted answer。
如果接受的答案是正确的(并且直到今天仍然是正确的),那么局部化访问中的扭曲线程将互相干扰,从而使许多通道的原子操作速度变慢,即产生反局部性扭曲原子更好。
但是,老实说-我不确定我是否完全赞同这一论点,也不知道自从写出答案以来情况是否有所改变。
答案 2 :(得分:0)
即使不需要了解有关如何在CUDA硬件中实现共享内存原子的任何信息,也可以做一个非常简单的论点:归根结底,原子操作必须以某种方式在< em>某点。一般来说,这是正确的,无论您在哪个平台或硬件上运行都没有关系。原子性有点本质上要求。如果您有多个并行执行的原子操作,则必须以确保原子性的方式以某种方式执行它们。这意味着,无论我们使用的是GPU还是CPU,随着竞争的增加,原子操作总是会变慢。唯一的问题是:多少钱。这取决于具体的实现。
因此,通常,您希望保持争用级别,即试图在同一内存位置上并行执行原子操作的线程数尽可能少……