1

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

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

4

2 回答 2

0

内存合并使几个不同的事情更有效。它通常在请求到达缓存之前完成。与 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 上的效率降低,因为数据通常不会在缓存中停留足够长的时间,无法在缓存中与对同一缓存行的其他请求合并。

于 2017-10-02T18:34:53.497 回答
0

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

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

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

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

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

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

于 2017-10-02T20:29:36.380 回答