【问题标题】:Which is faster for CUDA shared-mem atomics - warp locality or anti-locality?对于 CUDA 共享内存原子——扭曲局部性或反局部性,哪个更快?
【发布时间】:2023-03-13 16:14:02
【问题描述】:

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

在哪些情况下这样的工作会更快完成? :

  1. intra-warp 访问locality的情况,例如每个warp访问的内存位置总数很少,并且大多数确实是由多个lane访问的
  2. 访问anti-locality的情况,所有车道通常都访问不同的位置(可能是为了避免银行冲突)?

同样重要的是 - 此微架构是否依赖于所有最近的 NVIDIA 微架构?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    但老实说 - 我不确定我是否完全接受这种论点,也不知道自从写出答案后情况是否发生了变化。

    【讨论】:

      【解决方案2】:

      反本地化访问会更快。

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

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

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

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

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

      【讨论】:

      • 所以,你的意思是,来自不同 warp 中的线程的共享内存操作永远不会在同一个时钟周期内同时执行,即使它们涉及共享内存中的不相交值,在不同的银行?因此,反地方行动总是优越的?
      • 每个共享内存单元(每个 SM 1 个)每个周期可以执行 1 次操作(读取或写入)。所有地址和数据都来自一个warp指令(不合并来自不同warp的指令)。由于访问大小(>32 位)、银行冲突、地址冲突(原子)或操作是需要读/操作/写的原子操作,指令可能需要多次操作。
      • 你怎么知道是这样的?
      • @einpoklum:如果格雷格说是这样,那就是。
      • @talonmies:但我似乎记得共享内存操作的延迟比这高一个数量级。或者 - Greg 是在谈论吞吐量吗?如果是这样,后续操作之间不存在竞争吗?
      【解决方案3】:

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

      因此,一般来说,您希望保持争用级别,即将尝试在同一内存位置并行执行原子操作的线程数尽可能低……

      【讨论】:

        猜你喜欢
        • 2012-07-11
        • 2023-03-08
        • 2013-05-21
        • 1970-01-01
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        相关资源
        最近更新 更多