【问题标题】:Is coalesced memory access a feature or phenomenon?合并内存访问是一种特性还是现象?
【发布时间】:2017-10-01 08:26:56
【问题描述】:

我目前正在用 OpenCL 编写一个较小的项目,并试图找出真正导致内存合并的原因。每本关于 GPGPU 编程的书都说 GPGPU 应该如何编程,而不是为什么硬件更喜欢这样。

那么它是某种特殊的硬件组件来合并数据传输吗?还是只是为了更好地利用缓存?还是完全不同?

【问题讨论】:

  • 一方面,硬件内存获取操作宽度为 128 位,如果您使用 32 位值,则可以在单个指令中从内存中获取其中的 4 个(如果它们是连续的地址)来馈送一次 4 个工作项。另一个,如果都访问相同的地址,所有工作项在一次操作中获得相同的数据,并带有广播。至少对于gcn。此外,128 位由多个通道组成,当它们是不同的地址而不是相同的模值时,它们可以提供最好的服务。此外,内存读/写是在硬件中流水线化的,因此最好使用独立的地址、独立的存储区。

标签: caching opencl gpgpu coalescing


【解决方案1】:

内存合并使几个不同的事情更有效率。它通常在请求到达缓存之前完成。与 SIMT 执行模型类似,它是一种架构权衡。它使 GPU 能够拥有更高效和高性能的内存系统,但也迫使程序员仔细考虑他们的数据布局。

如果不合并,要么缓存需要能够同时处理大量请求,要么内存访问需要更长的时间,因为需要一次处理一个不同的数据传输。当只是检查某件事是成功还是失败时,这甚至是相关的。

合并请求相当容易,您只需选择一个传输,然后将所有请求与匹配的高地址位合并。您只需在每个周期生成一个请求并重播加载或存储指令,直到所有线程都已处理完毕。

缓存还存储连续字节,32/64/128Byte,这非常适合大多数应用程序,非常适合现代 DRAM,并减少缓存簿记信息的开销:缓存按缓存线组织,每个缓存线都有一个标签指示哪些地址存储在该行中。

现代 DRAM 使用宽接口和长突发:GPU 的内存通常组织在 32 位或 64 位宽通道中,GDDR5 内存的突发长度为 8。这意味着 DRAM 上的每个事务接口必须一次至少获取 32-bit*8=32 字节或 64-bit*8=64 字节,即使这些字节只需要一个字节。设计导致合并请求的数据布局有助于有效地使用 DRAM 接口。

GPU 也有大量同时活动的并行线程和相当小的缓存。 CPU 通常能够使用其缓存将其内存请求重新排序为 DRAM 友好模式。 GPU 上更多的线程和更小的缓存使这种“基于缓存的合并”在 GPU 上的效率降低,因为数据通常不会在缓存中停留足够长的时间,无法在缓存中与对同一缓存行的其他请求合并。

【讨论】:

    【解决方案2】:

    尽管“RAM”(随机存取存储器)上有“随机存取”名称,但双倍数据速率 #3 随机存取存储器 (DDR3-RAM) 在访问连续位置时比随机存取更快。

    例如:“CAS Latency”是当您访问新“列”时 DDR3 RAM 将停止的时间量,因为您的 RAM 芯片实际上正在充电以从另一个位置提供新数据芯片。

    编辑:Jan Lucas 认为 RAS 延迟在实践中更为重要。有关详细信息,请参阅他的评论。

    每次切换列时都会有大约 10ns 的延迟。所以,如果你有一堆内存访问,如果你保持访问一堆数据彼此“接近”,那么你就不会调用 CAS 延迟。

    因此,如果您在特定位置有 20 个字要访问,那么在移动到新的内存位置(调用 CAS 延迟)之前访问这 20 个字会更有效。否则,您将不得不调用另一个 CAS 延迟来在内存位置之间“切换回”。

    大约只有 10 纳秒,但随着时间的推移,这个时间会加起来。

    【讨论】:

    • 您似乎混淆了 CAS 和 RAS。行需要打开并保持在同一行内,以避免 RAS 延迟。然而,CAS 延迟总是存在的,但是是流水线的。 CAS 延迟对 GPU 几乎没有影响。
    • 感谢您的信息。我可能是对的,我已经有一段时间没有上计算机架构课程了。
    猜你喜欢
    • 2015-01-06
    • 2012-06-17
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-10-17
    • 2012-09-17
    相关资源
    最近更新 更多