2012-08-08 25 views
8

假設在速度嚴重的代碼中,我們有一對經常一起使用的數組,其中的確切大小無關緊要,只需將其設置爲合理的數值即可。爲緩存友好性避免使用2的權力

int a[256], b[256]; 

這是一個潛在的pessimization因爲低地址位是相同的可以使它更難緩存能夠同時處理兩個陣列?最好是指定例如300而不是256?

+4

你是正確的懷疑,權力的兩個可能有問題。但它通常只適用於你有兩個以上的步幅。 (特別是當你超過你的L1緩存關聯性時)[這裏是一個它實際上成爲問題的例子。](http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than -two-loops)在這個例子中,有4個數組 - 所有這些數組都與4k頁的起始位置相同。 – Mysticial 2012-08-08 17:27:34

回答

6

移動我的評論一個答案:

你是正確的懷疑權力 - 的二可能是有問題的。但它通常只適用於你有兩個以上的步幅。直到你超過L1 cache associativity,它纔會變得非常糟糕。但即使在此之前,您可能會遇到錯誤的別名問題。

下面是兩個例子權力-的二個地方實際上成爲問題:

在第一例中,有4個陣列 - 所有這些都對準到與4k頁面的開始相同的偏移量。

在第二個示例中,矩陣的逐列跳躍在尺寸爲二的冪時完全破壞了性能。


在任何情況下,請注意關鍵概念實際上是數組的對齊方式,而不是它們的大小。如果你發現你的速度變慢了,只需在你的陣列之間添加一些填充來打破對齊。

+0

另一個有用的技巧:如果你一次只訪問一個條目(並且從不通過memcpy或類似的東西訪問「片」),你可以嘗試對數組索引應用一個簡單的散列函數。通常,XOR。即總是訪問[i^0x67]和b [j^0x34]。 //我找到了一個有用的地方 – 2012-10-26 04:28:18