【问题标题】:Coalesced memory access performance合并的内存访问性能
【发布时间】:2015-01-06 05:28:42
【问题描述】:

我已经阅读了有关合并内存访问 (In CUDA, what is memory coalescing, and how is it achieved?) 及其性能重要性的信息。但是,当发生非合并内存访问时,我不知道典型的 GPU 会做什么。当一个线程“请求”位置 P 中的一个字节而其他线程请求远处的某个东西时,GPU 会为该线程获得一个完整的 128 字节块?如果读数对齐,我可以“免费”读取其他 127 个字节吗?

【问题讨论】:

  • @Robert 的回答很到位。真正简短的答案是:非合并读取会被序列化,内核只有在它们全部完成后才会继续。因此,您可以看到合并读取的好处!比最坏情况快 32 倍。

标签: opengl cuda gpu gpgpu


【解决方案1】:

一般规则:

  • 内存访问指令是在整个 warp 范围内发出的,就像任何其他指令一样
  • warp 中的每个线程都提供了一个可供读取的地址
  • 假设这些地址没有“命中”任何高速缓存,内存控制器会收集所有地址并确定需要从 DRAM 获得多少“段”(大致类似于高速缓存行)。 “段”是 32 字节或 128 字节,具体取决于缓存和设备细节。
  • 然后内存控制器从 DRAM 请求这些行/段

如果单个线程生成的地址不靠近经线中生成的任何其他地址,则内存控制器将需要从 DRAM 请求整行/段,可能是 32 字节或 128 字节,取决于设备和涉及哪些缓存(即发生了哪种类型的“未命中”)只是为了满足来自那个线程的那个地址。因此,无论该线程是在单个线程读取事务中请求最小 1 字节还是最多 16 字节,内存控制器都必须从 DRAM 读取 32 字节或 128 字节以满足源自该线程的读取.类似的逻辑将适用于从该特定“扭曲读取”发出的所有其他地址。

这种分散或孤立的访问模式是“未合并的”,因为 warp 中没有其他线程需要一个足够接近的地址,以便它可以从同一段/行满足其需求。

当一个线程“请求”位置 P 中的一个字节而其他线程请求远处的某个东西时,GPU 会为该线程获得一个完整的 128 字节块?

是的,32 字节或 128 字节是可以从 DRAM 发出的最小请求粒度。

如果读数对齐,我可以“免费”读取其他 127 个字节吗?

无论您是否需要,也不管行/段内的请求是否对齐,您将获得来自任何 DRAM 读取事务的 32 字节或 128 字节.

这并不涵盖所有情况,但 32 字节/128 字节差异的一般细分如下:

  1. cc2.x 设备启用了 L1 缓存,因此缓存“未命中”通常会触发 128 字节的读取
  2. cc3.x 设备仅启用了二级缓存(用于全局内存事务),二级缓存线大小为 32 字节。此处的“未命中”将需要从 DRAM 加载 32 字节,但跨 warp 的完全合并读取最终仍将需要 128 字节的加载(例如,intfloat)所以最终 仍然需要四个 L2 高速缓存行。 (没有免费的午餐。)
  3. cc5.x 设备再次启用了 L1,因此应该回到需要在“未命中”时加载完整的 128 字节

This presentation 将具有指导意义。特别是,幻灯片 17 显示了“完美”合并的一个示例,而幻灯片 25 显示了“完全未合并”负载的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多