【问题标题】: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 字节的加载(例如,int 或 float)所以最终 仍然需要四个 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
    相关资源
    最近更新 更多