背景
提高緩存命中率的一個重要技巧是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)被保留並在緩存中得到重用,從而產生更好的性能。