2012-07-02 12 views
0

我的工作在這樣一個循環:如何編寫具有更好緩存行爲的循環?

int arrA[BIG], arrB[BIG], arrC[BIG]; 

for(int = 0; i<BIG; i++){ 
     do_operation(arrA[i], arrB[i], arrC[i]); 
} 

這裏do_operation不是實際的功能。這僅僅意味着A,B,C之間的一些操作。 從配置文件數據看來,緩存缺失看起來很高。

如何重寫具有更好緩存行爲的循環?

感謝您的任何評論!

+0

BIG'有多大? –

+0

它是各種各樣的。通常約爲1M。 – limi

回答

1

您正在線性訪問每個陣列,這對緩存使用(以及硬件預取器)來說基本上是最佳的。然而,如果你的數組是一個不幸的大小(通常是兩個大的權力),你會得到顛簸;如果你的數組是不幸的大小arrA[i],arrB[i]arrC[i]都將映射到相同的緩存行,並不斷驅逐對方。實質上,每一次訪問都將是一次緩存未命中。爲了避免這種情況,您應該嘗試稍微填充每個數組。

參見例如Understanding cache thrashing