【发布时间】:2020-12-16 05:30:24
【问题描述】:
我正在阅读关于 this intel page 的缓存阻塞。
上面写着:
阻塞是一种众所周知的优化技术,可以帮助避免许多应用程序中的内存带宽瓶颈。阻塞背后的关键思想是通过确保数据在多次使用中保留在缓存中来利用应用程序中可用的固有数据重用。
举个例子
for (body1 = 0; body1 < NBODIES; body1 ++) { for (body2=0; body2 < NBODIES; body2++) { OUT[body1] += compute(body1, body2); } }在此示例中,数据 (body2) 从内存中流式传输。假设 NBODIES 很大,我们将无法在缓存中重用。此应用程序受内存带宽限制。应用程序将以内存速度运行到 CPU 速度,低于最佳速度。
优化到
for (body2 = 0; body2 < NBODIES; body2 += BLOCK) { for (body1=0; body1 < NBODIES; body1 ++) { for (body22=0; body22 < BLOCK; body22 ++) { OUT[body1] += compute(body1, body2 + body22); } } }被阻塞的代码...是通过将body2循环拆分为一个在多个BLOCK中迭代体的外循环和一个在块内迭代元素的内body22循环,并交错body1和body2循环。此代码在 body1 循环的多次迭代中重复使用一组 BLOCK body2 值。如果选择 BLOCK 以使这组值适合缓存,则内存流量会减少一个 BLOCK 系数。
老实说,我不明白随附的解释。
我也不明白内存流量是如何降低的,以及为什么被阻止的示例会更快。
请有人帮忙解释一下缓存阻塞以及它实际上是如何加速循环的?
Wikipedia同样有一个例子:
for (i=0; i<N; ++i) { ... }可以通过替换为块大小 B 来阻止
for (j=0; j<N; j+=B) { for (i=j; i<min(N, j+B); ++i) { .... } }
我不知道为什么会更快。
为什么这会利用缓存?
【问题讨论】:
标签: c caching optimization memory