这篇博文解释了内存库冲突如何影响转置函数的性能。
现在我不禁想知道:“普通”cpu(在多线程上下文中)是否也会发生同样的情况?或者这是特定于 CUDA/OpenCL 的?或者它甚至没有出现在现代 CPU 中,因为它们的缓存大小相对较大?
这篇博文解释了内存库冲突如何影响转置函数的性能。
现在我不禁想知道:“普通”cpu(在多线程上下文中)是否也会发生同样的情况?或者这是特定于 CUDA/OpenCL 的?或者它甚至没有出现在现代 CPU 中,因为它们的缓存大小相对较大?
自 1960 年代最早的矢量处理 CPU 以来,就一直存在存储冲突。这是由交错内存或多通道内存访问引起的。
交错内存访问或 MCMA 解决了 RAM 访问速度变慢的问题,方法是分阶段从不同的存储库或通过不同的通道访问内存的每个字。但是有一个副作用,从同一个 bank 访问内存比从相邻 bank 访问内存需要更长的时间。
来自 1980 年代 Cray 2 的维基百科http://en.wikipedia.org/wiki/Cray-2
“主内存库被安排在象限中以同时访问,允许程序员将他们的数据分散到内存中以获得更高的并行度。这种方法的缺点是在前台处理器中设置分散/收集单元的成本相当高。与内存库数量相对应的步幅冲突会遭受性能损失(延迟),这在基于 2 次方 FFT 的算法中偶尔会发生。因为 Cray 2 的内存比 Cray 1 或 X-MP 大得多, 这个问题很容易通过在数组中添加一个额外的未使用元素来分散工作来解决”