2

我有一個連續的內存 1024緩衝區,每個緩衝區大小2K字節。我使用鏈表來保存可用緩衝區的記錄(這裏的緩衝區可以被認爲是由生產者和消費者使用)。一些操作之後,鏈接列表中的緩衝區順序變得隨機。現代計算機緩存爲當地支持的相鄰數據大小

現代計算機體系結構主張緊湊的數據,地方很多。它在需要訪問位置時緩存相鄰數據。我的計算機的緩存行是64(從64K更正)字節。

問題1.對我來說,由於我的訪問模式是隨機的,是否有很多緩存未命中?

問題2.現代計算機緩存的鄰近數據的大小是多少?我想如果你訪問一個整數數組中的位置,它會緩存相鄰的整數。但是我的單元數據(2K)比int(4)大得多。所以,我不確定有多少鄰居會被緩存。

回答

3

首先我懷疑「我的電腦的緩存行是64K字節」。它最有可能只有64字節。讓我試着回答你的問題:

問題1.對我來說,由於我的訪問模式是隨機的,是否有很多緩存未命中?

不一定。這取決於一旦緩存緩衝區後,您在緩衝區上執行了多少操作。

  • 所以,如果你緩存一個2K緩衝區,並做大量的順序工作,你的 緩存命中率會很好。正如Paul所建議的那樣,這個在啓用硬件預取功能的情況下工作得更好。
  • 但是,如果您經常在緩衝區之間跳轉並在每個緩衝區上執行相對較低的工作量,則緩存命中率將下降。 然而,1024 x 2KB = 2MB,因此可能是L2緩存的大小(如果您也有L3,則L2是通常較小的)()。所以即使 如果你錯過了L1,在這兩種情況下你都會很有可能打到L2的 。

問題2.現代計算機緩存的鄰近數據的大小是多少?

通常,獲取的鄰居數量由高速緩存行大小給出。如果行大小爲64B,則可以獲取16個整數值。所以在每次讀取時,您都會填充緩存行。但是,您需要考慮預取如果您的CPU檢測到內存讀取是連續的,則它會預取更多鄰居並提前提供更多緩存行。

希望這會有所幫助!

+0

L2高速緩存通常小於2 MiB(例如,第2代至第4代Intel Core處理器具有256 KiB L2)。值得一提的是,64字節緩存線是對齊的。此外,除了後面的解釋之外,在第一個要點中提到硬件預取(例如,「好的,特別是對於硬件預取」)可能是一種改進。 – 2014-11-05 10:25:57

+0

@ PaulA.Clayton感謝您的意見。我會很好地調整帖子。關於L2尺寸,這是有爭議的。在L2是最後一級的移動SoC上,它通常更大。ARM和Intel Atom可以輕鬆升級到2MB。你也有L3,你是對的。 – VAndrei 2014-11-05 10:32:38

+0

可悲的是,自從我提出這個帖子以來,我無法用upvote獎勵你的編輯。 (是的,當L2是有限責任公司時,它往往更大,而AMD的FX處理器有2MiB L2加L3,我確實寫過「經常」。) – 2014-11-05 14:12:11