CPU:英特爾Sandy /常春藤橋(x86_64的)高速緩存,存儲緩衝區和BIU/WCB在CPU中各自擁有單獨的物理緩衝區還是單個物理緩衝區?
我需要編寫該連接通過PCI Express CPU和需要使用的最大帶寬的設備驅動器。爲此,我將映射的設備內存用於處理器的物理地址空間。然後使用ioremap_wc()
將此內存映射到標記爲WC(寫入組合)的內核的虛擬地址空間。
作爲x86_64的CPU中已知有幾個緩衝區:
- 緩存 - 公知的快速存儲緩衝器,由三個緩衝器:L1/L2/L3每個級別包括一個64字節的緩存行。
- 在WB(回寫)模式 - 在後臺CPU中(異步)通過使用任意序列的64字節塊將數據從高速緩存寫入RAM。
- 在WT(通過寫入)模式 - (同步)每個存儲到內存使用
MOV [addr], reg
正在存儲緩存行到緩存和RAM立即。
詳細約高速緩存級:每個核心具有L1(64 KB,1毫微秒)和L2(256 KB,3納秒),並整體CPU有一個用於所有內核緩衝器L3(4 - 40 MB ,10ns)。
(SB)存儲緩衝器 - ,其中所有的數據被順序地存儲緩衝器(隊列)。在相同的序列中,數據在後臺懶洋洋地存儲在內存中。但是可以通過使用
SFENCE
或MFENCE
(例如,用於支持核之間的順序一致性)來強制將數據從存儲緩衝區保存到緩存/ RAM。BIU(總線接口單元)/ WCB(寫入合併緩衝器) - 在WC(寫聯合)模式。當內存區域被標記爲WT時,不使用緩存,並使用大小爲64字節的BUI/WCB作爲緩存行。當我們將內存
MOV [addr], reg
以1個字節存儲到內存64次時,只有當最後一個字節被存儲時,整個內存纔會被存儲到內存 - 這是一個優化的機制,用於將數據寫入64個整個內存區字節。例如,通過PCI-Express接口映射到CPU物理地址空間的設備存儲器的存儲數據非常重要,其中通過64字節的記錄(發送)增加了與記錄(發送)相比的實際帶寬1個字節。但有一個選項可以使用SFENCE
或MFENCE
將數據從BIU/WCB強制保存到[remote]內存。
而一些密切相關的問題:
1。高速緩存,存儲緩衝區和BIU/WCB是否都在CPU中使用相同的物理緩衝區,但是其中的不同部分,或者它們全部在CPU中具有單獨的物理緩衝區?
2.如果高速緩存和BIU使用相同的物理緩衝器,例如高速緩存-L1的兩端使用的部分,那麼爲什麼SFENCE/MFENCE
對第二imapct,但還沒有對第一。如果它們具有單獨的物理緩衝區,那麼爲什麼Cache-line和BIU具有相同的64字節大小?
3.對於L1,高速緩存行的數量等於(65536/64)= 1024,對於L2等於(262144/64)= 4096,對於L3等於4MB/64字節。存儲緩衝區的大小我們不知道。但是單個CPU-Core或整個CPU上有多少個BUI/WCB(每個64字節)?
正如我們所看到的,命令SFENCE
或存儲緩衝區和BIU/WCBMFENCE
影響。但是這些命令是否對緩存(L1/L2/L3)有影響?
你的CPU型號是什麼? – osgx 2014-09-15 18:55:39
@osgx CPU:Intel Sandy/Ivy Bridge(x86_64) – Alex 2014-09-15 18:59:28
你確定你的L1是64k嗎?也許你數了數據和指令高速緩存 – Leeor 2014-09-17 14:13:57