這似乎是一個奇怪的問題。CPU緩存:兩個地址之間的距離是否需要小於8個字節以獲得緩存優勢?
假設緩存行的大小爲64個字節。此外,假設L1,L2,L3具有相同的高速緩存行大小(this帖子稱它是Intel Core i7的情況)。
存儲器上有兩個對象A
,B
,它們的(物理)地址是N字節。爲簡單起見,我們假設A
是高速緩存器邊界上,也就是它的地址是64。
1)如果N
< 64的整數倍,當A
是由CPU取出,B
將被讀入高速緩存,太。因此,如果需要B
,並且高速緩存行尚未被驅逐,則CPU會在很短的時間內獲取B
。每個人都很高興。 2)如果N
>> 64(即遠遠大於64),當A
被CPU提取時,B
不會被讀入高速緩存行,而是A
。所以我們說「CPU不喜歡追逐指針」,這是避免堆分配的基於節點的數據結構的原因之一,如std::list
。
我的問題,如果N
> 64,但仍然很小,說N
= 70,換句話說,A
和B
不適合在一個高速緩存行,但不會太遠分開,當A
是裝通過CPU,提取B
所花費的時鐘週期數量與N
遠大於64時所花費的時鐘週期數量相同?
改寫 - 當被加載A
,讓噸表示取B
的時間的經過,是噸(Ñ = 70)遠小於或幾乎等於噸(Ñ = 9999999)?
我問這個問題,因爲我懷疑噸(ñ = 70)比噸(ñ = 9999999)要小得多,因爲CPU緩存是層次。
如果有定量研究,情況會更好。
所以..簡而言之,t(N = 70)最可能小於t(N = 999999),對吧? – user8385554
@ user8385554是的。它傾向於具有TLB命中並且可能利用推測預取下一個高速緩存行,甚至可能利用仍然打開的DRAM行(如果A和B未命中靠近)。如果A命中L3,TLB的好處可能是主/唯一一次(下一行預取很可能在內存控制器完成,並且DRAM行不會被激活來訪問A)。如果B在不同的頁面上(x86上帶有基頁的4 KiB邊界),則沒有任何好處可用。 –