2016-12-29 36 views
2

我正在學習緩存行,以及循環跨步對緩存的影響。我遇到了this頁面,其中顯示了循環與循環步幅的執行時間。根據基準,增加循環跨度會減少執行時間,這對我來說非常困惑。據我瞭解,如果緩存行是64字節,並假設如果在第一種情況下循環步長是1,這意味着循環順序遍歷數組元素,那麼應該有最少的執行時間,因爲16個整數(4byte x 16 = 64字節)被加載到緩存中。由於所有16個元素都被加載到同一個緩存行中,因此執行時間應該最短爲16步。當步幅增加到16以上時,應該增加執行時間,因爲數組元素不在緩存行中,但頁面上的圖形完全相反。循環跨步和緩存行

running times of loop for different step values

回答

3

在該示例中的長度是恆定的,所以步幅較大的 - 你去通過更少的元件。

有趣的現象是它不適用於緩存行下面,這是因爲你不能帶一部分行。因此,如果低於16,您將爲獲取所有緩存行支付相同的罰款。 16歲以上,你開始跳過一些行。例如32位以上(128B),你可以每隔一行取一行 - 因此+/-一半的時間(假設你的執行時間由內存延遲所支配)

+0

所以,當你說「低於16時,你支付同樣的罰金緩存行「是否意味着整個數組(全部元素)被加載到緩存中,並且當超過16個數組的部分被加載到緩存中時?我的印象是,加載的元素數量取決於步幅 – zer0c00l

+1

緩存是以64字節的粒度完成的。如果你訪問一個緩存行的一個元素,你仍然需要獲取整行。但是,如果您的步幅是兩條緩存線寬,則不必在中間獲取線條。如果你繪製它,你會發現任何超過64B的步驟都會允許跳過,而且步幅越長,跳過的次數越多 – Leeor