Cache Blocking

背景

提高缓存命中率的一个重要技巧是Blocking,数据块将逐块计算,使得存储器访问是一个具有高内存局部性的小邻域。

通过在缓存中使用/重用这些数据,我们减少了进入内存的需求(减少内存带宽压力)。

Blocking避免了应用程序中的内存带宽瓶颈,可以在1-D,2-D或3-D空间数据结构上执行Blocking。

在代码的角度,Blocking通常会涉及到循环拆分和交换。

实现

1-D Blocking

原始代码
for (body1 = 0; body1 < NBODIES; body1 ++) {
   for (body2=0; body2 < NBODIES; body2++) {
     OUT[body1] += compute(body1, body2);
   }
}

假设NBODIES很大,body2就不会在缓存中重用,受到内存带宽的限制。

修改代码
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);
      }
   }
}

在这个修改过的代码中,数据(body22)被保留并在缓存中得到重用,从而产生更好的性能。

你可能感兴趣的:(Operating,System)