我記得假設在我的架構類中L1緩存命中是1個週期(即與寄存器訪問時間相同),但是在現代x86處理器上實際上是否如此?L1高速緩存命中與x86上寄存器的週期/成本?
L1緩存命中需要多少個週期?它與註冊訪問相比如何?
我記得假設在我的架構類中L1緩存命中是1個週期(即與寄存器訪問時間相同),但是在現代x86處理器上實際上是否如此?L1高速緩存命中與x86上寄存器的週期/成本?
L1緩存命中需要多少個週期?它與註冊訪問相比如何?
下面是關於這個問題的一個偉大的文章:
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
如何訪問L3緩存可能需要100-300個週期,而本地DRAM訪問只需要約120個週期。這是否意味着L3緩存比主內存中使用的DRAM慢兩倍以上? – user2316602 2016-08-10 17:52:00
@ user2316602:對我來說似乎也是虛假的,除非該錶行應該用於不同套接字中CPU的L3高速緩存。 (這是Nehalem Xeon系統,所以主內存和L3都是NUMA。) – 2016-08-24 21:32:21
如果我沒有記錯的話,大概需要1-2個時鐘週期,但這是一個估計值,較新的緩存可能會更快。這是我沒有的計算機體系結構書,這是AMD的信息,所以英特爾可能會略有不同,但我會約束它5至15個時鐘週期,這似乎是一個很好的估計給我。
編輯:哎呦L2是10個週期標籤訪問,L1採用1到兩個週期,我的錯誤:\
其實L1高速緩存命中的成本幾乎是一樣的寄存器訪問成本。這對我來說是令人驚訝的,但至少在我的處理器(Athlon 64)中是如此。前一段時間,我編寫了一個簡單的測試應用程序,以測試多處理器系統中訪問共享數據的效率。應用程序主體是一個簡單的內存變量,在預定義的時間段內遞增。爲了進行合作,我首先對非共享變量進行了基準測試。在那次活動中,我捕獲了結果,但是在應用程序拆卸期間,我發現編譯器被我的期望欺騙了,並對我的代碼應用了不需要的優化。它只是把變量放在CPU寄存器中,並在寄存器中迭代地遞增,而不需要存儲器訪問。但是,我強制compliler使用內存中的變量而不是寄存器變量後,真正的驚喜得以實現。在更新的應用程序上,我獲得了幾乎相同的基準測試結果。性能降低真的可以忽略(〜1-2%),並且看起來像一些副作用。
至於結果:
1)我覺得你可以考慮L1緩存作爲一個非託管的處理器寄存器池。
2)通過強制編譯器存儲頻繁地訪問處理器寄存器中的數據,沒有任何意義可以應用殘酷的assambly優化。如果它們真的被頻繁訪問,它們將會存在於L1緩存中,並且由於這將具有與處理器寄存器相同的訪問成本。
您的基準測試是錯誤的,或者是其他問題的瓶頸。 '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
有關循環計數和無序執行的更多詳細信息,請參閱Agner Fog's microarch pdf和x86 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號。
它因處理器而異,但我不知道它的位置*與寄存器一樣快*大約比較慢1到5個時鐘週期。 – 2012-04-23 03:15:18
我不知道L1有單週期延遲的架構。此外,我不知道任何x86體系結構,其中寄存器訪問本身具有可測量的延遲(由於其他因素可能會感知到一些延遲)。 – harold 2012-04-24 12:07:42
請參閱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