【问题标题】:Coalescesed access across blocks in CUDA?CUDA 中跨块的联合访问?
【发布时间】:2013-02-28 11:49:59
【问题描述】:

假设我们有 16 个线程在块 1 上运行,另外 16 个线程在块 2 上运行。

每个线程从内存中读取 1 个 double:块 1 上的 16 个线程需要从内存地址 0-127 读取 16 个 double,块 2 上的 16 个线程需要从地址 128-255 读取。

我知道块 1 上 16 个线程的内存读取可以在一个内存事务中完成,因为合并访问。

我的问题是,当我们考虑这两个区块时,我们需要多少内存事务,一个还是两个?换句话说,不同块的内存访问可以同时发生吗?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    块是完全独立的 - 硬件可以选择(并且可能 - 将)在不同的多处理器上启动它们。

    来自不同块的线程将在不同的线程中运行。因此,不可能合并它们之间的内存访问。

    【讨论】:

    • 此外,在您描述的场景中也没有任何好处。合并扩展到最大 L1 缓存行大小,即 128 字节。两个 128 字节的请求将在 2 个事务中处理,无论它们来自一个块还是两个块。读取对齐的相邻双精度的 16 个线程将为您提供最大的合并好处。
    【解决方案2】:

    您至少需要两个内存事务。确保每个块的线程将在不同的扭曲中处理。

    此外,即使线程已形成一个 warp 或占用相同的多处理器并共享 L1 缓存,来自 warp 的地址也会转换为 128B 或 32B 行(取决于缓存/非缓存模式),因此在缓存的情况下模式下,您至少需要 2 个事务,如果是非缓存模式,则需要 8 个事务。查看 this 非常有用的演示文稿,以更好地了解全局内存访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多