2014-09-12 140 views
2

CPU:英特爾Sandy /常春藤橋(x86_64的)高速緩存,存儲緩衝區和BIU/WCB在CPU中各自擁有單獨的物理緩衝區還是單個物理緩衝區?

我需要編寫該連接通過PCI Express CPU和需要使用的最大帶寬的設備驅動器。爲此,我將映射的設備內存用於處理器的物理地址空間。然後使用ioremap_wc()將此內存映射到標記爲WC(寫入組合)的內核的虛擬地址空間。

作爲x86_64的CPU中已知有幾個緩衝區:

  1. 緩存 - 公知的快速存儲緩衝器,由三個緩衝器: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)存儲緩衝器 - ,其中所有的數據被順序地存儲緩衝器(隊列)。在相同的序列中,數據在後臺懶洋洋地存儲在內存中。但是可以通過使用SFENCEMFENCE(例如,用於支持核之間的順序一致性)來強制將數據從存儲緩衝區保存到緩存/ RAM

  • BIU(總線接口單元)/ WCB(寫入合併緩衝器) - 在WC(寫聯合)模式。當內存區域被標記爲WT時,不使用緩存,並使用大小爲64字節的BUI/WCB作爲緩存行。當我們將內存MOV [addr], reg以1個字節存儲到內存64次時,只有當最後一個字節被存儲時,整個內存纔會被存儲到內存 - 這是一個優化的機制,用於將數據寫入64個整個內存區字節。例如,通過PCI-Express接口映射到CPU物理地址空間的設備存儲器的存儲數據非常重要,其中通過64字節的記錄(發送)增加了與記錄(發送)相比的實際帶寬1個字節。但有一個選項可以使用SFENCEMFENCE將數據從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)有影響?

    +0

    你的CPU型號是什麼? – osgx 2014-09-15 18:55:39

    +0

    @osgx CPU:Intel Sandy/Ivy Bridge(x86_64) – Alex 2014-09-15 18:59:28

    +0

    你確定你的L1是64k嗎?也許你數了數據和指令高速緩存 – Leeor 2014-09-17 14:13:57

    回答

    1
    1. 緩存,存儲緩衝區和BIU/WCB都是CPU中獨立的物理結構。

    2. 爲什麼Cache-line和BIU具有相同的大小64字節?爲了方便和便於設計。並且因爲各個cacheabilty區域之間的邊界至少有64個字節對齊。

    3. 單個核心上的BIU/WCB數量不是體系結構的一部分,它是一個實現細節,甚至可能會從逐步變爲步進。

    4. SFENCEMFENCE導致掛起存儲被完成,這可能會導致一些可緩存數據從CPU存儲緩衝區寫入緩存。

    (編輯)L1/L2/L3緩存形成一個單一的緩存一致性系統,它是外部存儲器的捷徑。

    取決於設計中實現的緩存包含屬性,fence操作會導致待定存儲被寫入某個特定級別的緩存(L1/L2或L3)。通常情況下,fence指令會導致可緩存的數據從存儲緩衝區移動到L1,但我認爲有可能將內存區域標記爲僅L2或僅L3中的可緩存區域。在這種情況下,數據將從存儲緩衝區移至L2或L3。 (許多MIPS處理器都支持這種操作模式。)

    不可緩存的數據將始終從存儲緩衝區/ WCB直接寫入內存,並且永遠不會寫入緩存。

    自從P6開始,我就沒有在英特爾處理器上工作過,所以我不知道實現細節,例如當前內核上的WCB或存儲緩衝區的數量。

    如果您想了解特定英特爾內核的實現細節,請參閱Microprocessor Report或會議的熱點討論會會議。 (兩者應在大學圖書館提供。)

    +0

    非常感謝!但是,您如何看待英特爾Ivy Bridge有多少BIU?(例如,步驟1)?當我們從寄存器 - >(存儲緩衝區) - >存儲到RAM時,那麼這個值立即存儲到L3緩存中,或者首先存儲到L1(通過使用'SFENCE'沖刷到L3)? – Alex 2014-09-16 20:00:22

    +0

    非常感謝!即當我們使用WCB時,Cache和Store-buffer不用? – Alex 2014-09-17 09:04:43

    +1

    這是正確的。 – markgz 2014-09-17 17:47:17