2012-04-23 51 views
22

我記得假設在我的架構類中L1緩存命中是1個週期(即與寄存器訪問時間相同),但是在現代x86處理器上實際上是否如此?L1高速緩存命中與x86上寄存器的週期/成本?

L1緩存命中需要多少個週期?它與註冊訪問相比如何?

+0

它因處理器而異,但我不知道它的位置*與寄存器一樣快*大約比較慢1到5個時鐘週期。 – 2012-04-23 03:15:18

+2

我不知道L1有單週期延遲的架構。此外,我不知道任何x86體系結構,其中寄存器訪問本身具有可測量的延遲(由於其他因素可能會感知到一些延遲)。 – harold 2012-04-24 12:07:42

+0

請參閱http://www.7-cpu.com/cpu/Haswell.html:某些每高速緩存和每個TLB延遲數字以及一些實驗性數字。另請參閱[Agner Fog's microarch pdf](http://agner.org/optimize/)以及[x86 tag wiki](http://stackoverflow.com/tags/x86/info)中的其他鏈接。 Haswell的L1負載使用延遲爲4個週期,這是現代x86 CPU的典型特徵。存儲 - 重新加載延遲是5個週期,並且與緩存命中或未命中(它是存儲轉發,而不是緩存)無關。正如哈羅德所說,寄存器訪問是0個週期(例如,'inc eax'有1個週期延遲,'inc [mem]'有6個週期延遲(ALU +存儲轉發) – 2016-08-24 21:52:47

回答

32

下面是關於這個問題的一個偉大的文章:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/1

要回答你的問題 - 是的,緩存命中的成本與寄存器訪問大致相同。當然,高速緩存未命中是相當昂貴的;)

PS:

的細節會有所不同,但此鏈接有一些很好的大概數字:

Approximate cost to access various caches and main memory?

Core i7 Xeon 5500 Series Data Source Latency (approximate) 
L1 CACHE hit, ~4 cycles 
L2 CACHE hit, ~10 cycles 
L3 CACHE hit, line unshared ~40 cycles 
L3 CACHE hit, shared line in another core ~65 cycles 
L3 CACHE hit, modified in another core ~75 cycles remote 
L3 CACHE ~100-300 cycles 
Local DRAM ~30 ns (~120 cycles) 
Remote DRAM ~100 ns 

PPS:

這些數字代表太多較舊的較慢的CPU,但比率基本保持不變:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/2

Level     Access Time Typical Size Technology Managed By 
-----     ----------- ------------ ---------  ----------- 
Registers    1-3 ns  ?1 KB   Custom CMOS Compiler 
Level 1 Cache (on-chip) 2-8 ns  8 KB-128 KB SRAM   Hardware 
Level 2 Cache (off-chip) 5-12 ns  0.5 MB - 8 MB SRAM   Hardware 
Main Memory    10-60 ns  64 MB - 1 GB DRAM   Operating System 
Hard Disk    3M - 10M ns 20 - 100 GB Magnetic  Operating System/User 
+2

如何訪問L3緩存可能需要100-300個週期,而本地DRAM訪問只需要約120個週期。這是否意味着L3緩存比主內存中使用的DRAM慢兩倍以上? – user2316602 2016-08-10 17:52:00

+0

@ user2316602:對我來說似乎也是虛假的,除非該錶行應該用於不同套接字中CPU的L3高速緩存。 (這是Nehalem Xeon系統,所以主內存和L3都是NUMA。) – 2016-08-24 21:32:21

1

如果我沒有記錯的話,大概需要1-2個時鐘週期,但這是一個估計值,較新的緩存可能會更快。這是我沒有的計算機體系結構書,這是AMD的信息,所以英特爾可能會略有不同,但我會約束它5至15個時鐘週期,這似乎是一個很好的估計給我。

編輯:哎呦L2是10個週期標籤訪問,L1採用1到兩個週期,我的錯誤:\

+0

只是檢查,你說的是* hit *而不是* miss *,對嗎? – Mehrdad 2012-04-23 03:16:57

+0

是的,TAG訪問需要2個週期,我相信,剩下的時間是從緩存訪問和加載。 – 2012-04-23 03:17:51

+0

嗯,好的謝謝!+1 – Mehrdad 2012-04-23 03:18:18

0

其實L1高速緩存命中的成本幾乎是一樣的寄存器訪問成本。這對我來說是令人驚訝的,但至少在我的處理器(Athlon 64)中是如此。前一段時間,我編寫了一個簡單的測試應用程序,以測試多處理器系統中訪問共享數據的效率。應用程序主體是一個簡單的內存變量,在預定義的時間段內遞增。爲了進行合作,我首先對非共享變量進行了基準測試。在那次活動中,我捕獲了結果,但是在應用程序拆卸期間,我發現編譯器被我的期望欺騙了,並對我的代碼應用了不需要的優化。它只是把變量放在CPU寄存器中,並在寄存器中迭代地遞增,而不需要存儲器訪問。但是,我強制compliler使用內存中的變量而不是寄存器變量後,真正的驚喜得以實現。在更新的應用程序上,我獲得了幾乎相同的基準測試結果。性能降低真的可以忽略(〜1-2%),並且看起來像一些副作用。

至於結果:

1)我覺得你可以考慮L1緩存作爲一個非託管的處理器寄存器池。

2)通過強制編譯器存儲頻繁地訪問處理器寄存器中的數據,沒有任何意義可以應用殘酷的assambly優化。如果它們真的被頻繁訪問,它們將會存在於L1緩存中,並且由於這將具有與處理器寄存器相同的訪問成本。

+0

您的基準測試是錯誤的,或者是其他問題的瓶頸。 'inc [mem]'在Intel Haswell上有6c的延遲,而在AMD上則有類似的延遲。 'inc eax'在所有現代x86 CPU上都有1個週期的延遲。這是存儲轉發延遲,而不是L1延遲。 L1負載使用延遲更像是4個週期。請參閱Agner Fog的microarch pdf以及[x86 tag wiki]上的其他鏈接(http://stackoverflow.com/tags/x86/info)。 – 2016-08-24 21:38:42

3

有關循環計數和無序執行的更多詳細信息,請參閱Agner Fog's microarch pdfx86 tag wiki中的其他鏈接。


英特爾Haswell的L1負載使用延遲是4個週期,這是現代x86 CPU的典型情況。即可以多快地運行一個循環,並且指向自己的指針。 (或者到一個小的閉環鏈表)。

對於Intel CPU中的SSE/AVX向量,負載使用延遲高出1個週期。


店重裝延時爲5個週期,並且是無關的緩存命中或錯過(它的儲存轉發,不L1高速緩存)。

正如哈羅德評論的那樣,寄存器訪問是0個週期。因此,例如:

  • inc eax具有1週週期的等待時間(只是ALU操作)
  • inc dword [mem]具有6個週期的延遲,直到從dword [mem]負載將準備。 (ALU +商店轉發)。例如在內存中保留一個循環計數器將循環限制爲每6個循環一次循環。
  • mov rax, [rsi]有4個週期的等待時間從rsi正準備rax準備好上的L1命中(L1負載使用的等待時間。)

http://www.7-cpu.com/cpu/Haswell.html具有每緩存延遲的表(我將這裏複製)和其他一些實驗數據,包括L2-TLB命中延遲(在L1DTLB未命中)。

Intel i7-4770(Haswell),3.4 GHz(Turbo Boost off),22 nm。內存:32 GB(PC3-12800 cl11 cr2)。

  • L1數據緩存= 32 KB,64 B /行,8-WAY。
  • L1指令緩存= 32 KB,64 B /行,8-WAY。
  • L2高速緩存= 256 KB,64 B /線,8-WAY
  • L3高速緩存= 8 MB,64 B /線

  • L1數據高速緩存延遲= 4個週期用於經由指針簡單的訪問(mov rax, [rax]

  • L1數據高速緩存延遲=用於複雜地址計算訪問的5個週期(mov rax, [rsi + rax*8])。
  • L2緩存延遲= 12個週期
  • L3緩存延遲= 36個循環
  • RAM延遲= 36個週期+ 57納秒

頂層基準頁是http://www.7-cpu.com/utils.html,但仍然沒有按」不能真正解釋不同的測試大小意味着什麼,但代碼是可用的。測試結果包括Skylake,這與Haswell在這個測試中幾乎相同。

@ paulsm4的答案有一個多插座Nehalem Xeon表,包括一些遠程(其他插座)內存/ L3號。