2017-08-16 35 views
5

這似乎是一個奇怪的問題。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,換句話說,AB不適合在一個高速緩存行,但不會太遠分開,當A是裝通過CPU,提取B所花費的時鐘週期數量與N遠大於64時所花費的時鐘週期數量相同?

改寫 - 當被加載A,讓表示取B的時間的經過,是Ñ = 70)遠小於或幾乎等於Ñ = 9999999)?

我問這個問題,因爲我懷疑ñ = 70)比ñ = 9999999)要小得多,因爲CPU緩存是層次

如果有定量研究,情況會更好。

回答

4

A失誤越快,至少有三個因素可以使B取得。首先,處理器可以推測性地提取下一個塊(獨立於任何基於步長的預取引擎,這將取決於在時間和位置上彼此接近的兩個未命中以確定步幅;單位步長預取不需要確定步幅值[這是一個],並且可以在第一次錯過後開始)。由於這種預取消耗內存帶寬和片上存儲,因此它通常具有調節機制(其可以像具有適度大小的預取緩衝區一樣簡單並且只在存儲器接口充分空閒時進行高度推測預取)。其次,由於DRAM被組織成行並且(在單個存儲體內)改變行增加了延遲,如果B與A在相同的DRAM行中,則對B的訪問可以避免行預充電的延遲(關閉先前打開的行)並激活(打開新行)。 (這也可以提高內存帶寬利用率。)

第三,如果B與A位於相同的地址翻譯頁面,則可以避免TLB。 (在許多設計中,由於分頁結構可以被緩存,所以分層結構頁錶行走在附近區域也更快,例如,在x86-64中,如果B與A處於相同的2MiB區域,則TLB未命中可能只需執行一次內存訪問因爲頁目錄可能仍然被緩存;此外,如果B的轉換與A的轉換處於相同的64字節高速緩存行中,並且A的TLB未命中有點近,則高速緩存行可能仍然存在。)

在某些情況下,還可以通過安排可能錯過固定的有序步幅的對象來利用跨步預取引擎。這似乎是一個相當困難和有限的上下文優化。

一個明顯的方式,即邁步可以增加延遲是通過引入衝突未命中。大多數高速緩存使用簡單的模聯合有限性的兩個索引的功能,所以兩個步幅的功率(或對同一個高速緩存集的其他映射)可以將不成比例的數據放置在有限數量的集合中。一旦超過關聯性,就會發生衝突缺失。 (已經提出偏斜相關性和非冪次模2索引來減少這個問題,但是這些技術還沒有被廣泛採用。)

(順便說一下,原因指針追逐特別慢並不僅僅是低的空間局部性,但是直到訪問A完成之後才能開始對B的訪問,因爲存在數據依賴性,即,獲取B的等待時間不能與獲取A的等待時間重疊。)

+0

所以..簡而言之,t(N = 70)最可能小於t(N = 999999),對吧? – user8385554

+1

@ user8385554是的。它傾向於具有TLB命中並且可能利用推測預取下一個高速緩存行,甚至可能利用仍然打開的DRAM行(如果A和B未命中靠近)。如果A命中L3,TLB的好處可能是主/唯一一次(下一行預取很可能在內存控制器完成,並且DRAM行不會被激活來訪問A)。如果B在不同的頁面上(x86上帶有基頁的4 KiB邊界),則沒有任何好處可用。 –

2

如果B的地址比A低,即使它們相鄰,也不會在同一個高速緩存行中。所以你的N < 64的情況是錯誤的:它確實是「相同的緩存行」的情況。


既然你提到的英特爾酷睿i7:SandyBridge的家庭在L2,這(如果沒有大量的已經很卓越的未命中)預取其他高速緩存行一對,完成了「空間」預取自然對齊的128B對線。

從英特爾優化手冊,在2.3節的Sandy Bridge:

2.3.5.4 Data Prefetching

  • ...一些預取器讀取到L1。

  • 空間預取:該預取努力完成每高速緩存行提取到L2高速緩存與 ,它完成對一個128字節對齊組塊中的一對線。

  • ...等幾個預取嘗試預取到L2

IDK它是如何儘快做到這一點;如果它在第一個緩存行到達之前不發出請求,那麼對於追蹤指針的案例來說,這無關緊要。如果緩存行到達L1D時,依賴加載只能執行幾個週期,如果它真的只是指針追蹤而沒有一堆計算延遲。但是如果它在第一次未命中(包含第二次加載的地址)之後不久發出預取,則第二次加載可以在L1D高速緩存中找到它的數據,在第一次請求加載之後到達一個或兩個週期。

無論如何,這使得128B的邊界與Intel CPU中的預取有關。


查看Paul對其他因素的優秀答案。