【问题标题】:Are atomic operations on global memory in CUDA performed in parallel across a warp?CUDA 中全局内存上的原子操作是否跨经线并行执行?
【发布时间】:2012-10-17 07:34:19
【问题描述】:

我需要在 CC 2.0 设备上的全局内存上执行原子 FP 添加操作。如果 warp 中引用的全局数据适合对齐的 128 字节扇区,这些操作是并行执行还是一次执行一个?

我的猜测是它们是平行的,但我不确定

问候 Gautham Ganapathy

【问题讨论】:

    标签: cuda nvidia


    【解决方案1】:

    在编程时,您可以将原子操作视为概念上的并行(同时仍满足原子性的要求)。

    在优化时,了解可能发生的序列化是有帮助的。实际发生的情况取决于您运行的硬件。性能取决于原子内存单元的位置和数量,以及并行执行的内存访问模式。

    例如,如果并行寻址的位置映射到完全不同的原子单元,它们将并行发生。如果多个地址并行映射到同一个原子单元,它们必须被序列化。

    从 sm_11(首次出现的计算能力 1.1)到 sm_2x(费米设备),再到 sm_3x(开普勒设备),原子操作性能不断提高。 Kepler 将最坏情况的原子内存操作性能(许多原子操作访问相同的内存地址)提高了 10 倍,将最佳情况的性能(许多原子操作访问非常不同的内存地址)提高了 2 倍。 Kepler 上的原子性能足够高,您可以考虑在以前使用显式并行缩减代码的地方使用原子。详情请见this presentation

    注意:此讨论适用于全局内存原子。共享内存原子是一种不同的野兽,通常会导致序列化,因此性能不高。

    【讨论】:

      【解决方案2】:

      原子操作比普通操作慢,因为它们确实不能并行发生。

      可能会发生的情况是,每次添加都会一次完成一个,但在所有线程都完成之前,执行不会超过添加,从代码的角度来看,它看起来是并行的。

      我不确定访问是否会合并,但原子操作的速度损失可能会超过内存访问速度的好处。

      【讨论】:

      • 是的。然而,我一直想知道的是,由于 G200 设备内存控制器足够智能,可以解决冲突和来自半扭曲的未合并读/写访问,假设内存控制器有足够的独立原子操作执行单元进行处理,也许所有跨半扭曲的操作可以并行完成,而不会受到其他设备内存请求的中断。这可能吗?
      • 例如,如果每个 warp 执行一个更新,例如 atomicAdd(baseAddress + tid, x),如果内存控制器有 16 个加法器,那么半个 warp 的所有操作都可以并行完成1. 问题是,是这样吗?
      【解决方案3】:

      重新表述已经说过的内容:ATOMIC 操作将按顺序执行,但由于此时所有其他操作都将停止,因此它们将看起来同时(并行)执行。需要注意的一件重要事情是,尽管原子操作是顺序的,但它们的 ORDER 是无法控制的。

      【讨论】:

        猜你喜欢
        • 2019-12-17
        • 2014-07-07
        • 1970-01-01
        • 2017-09-08
        • 2017-02-19
        • 2013-11-13
        • 2011-07-13
        • 1970-01-01
        相关资源
        最近更新 更多