合并内存访问是一个功能还是现象?

时间:2017-10-01 08:26:56

标签: caching opencl gpgpu coalescing

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

是否有一些合并数据传输的特殊硬件组件?或者只是为了更好地利用缓存?或者它是完全不同的东西?

2 个答案:

答案 0 :(得分:0)

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

如果没有合并,则缓存需要能够同时处理大量请求,或者内存访问需要更长时间,因为需要一次处理一个不同的数据传输。这只是在检查某些东西是命中还是遗漏时甚至是相关的。

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

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

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

GPU同时还有大量并行线程处于活动状态,而且缓存很小。 CPU通常能够使用其缓存将其内存请求重新排序为DRAM友好模式。 GPU上的大量线程和较小的高速缓存使得这种基于高速缓存的合并能够实现#34; GPU上的效率较低,因为数据在缓存中通常不会保持足够长的时间以便在缓存中与其他对同一缓存行的请求合并。

答案 1 :(得分:0)

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

例证:“CAS Latency”是DDR3 RAM在您访问新“列”时停止的时间,因为您的RAM芯片正在收费以提供来自另一个的新数据芯片上的位置。

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

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

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

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