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)被保留並在緩存中得到重用,從而產生更好的性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章