簡體   English   中英

現代 x86 CPU 使用什么緩存一致性解決方案?

[英]What cache coherence solution do modern x86 CPUs use?

我對現代多核 CPU 中的緩存一致性系統 function 如何感到有些困惑。 我已經看到基於偵聽的協議(例如 MESIF/MOESI 基於偵聽的協議)已在 Intel 和 AMD 處理器中使用,另一方面,基於目錄的協議在多核時似乎效率更高,因為它們不廣播而是發送消息到特定節點。

什么是 AMD 或 Intel 處理器中的現代緩存一致性解決方案,是基於偵聽的協議(如 MOESI 和 MESIF),還是僅基於目錄的協議,還是兩者的組合(基於偵聽的協議,用於同一節點內的元素之間的通信和基於目錄的節點到節點通信)?

MESI 是根據監聽共享總線定義的,但不,現代 CPU 實際上並不是這樣工作的。 可以使用消息和窺探過濾器(基本上是一個目錄)跟蹤/更新每個緩存行的 MESI 狀態,以避免廣播這些消息,這正是 Intel (MESIF) 和 AMD (MOESI) 實際所做的。

例如,英特爾 CPU 中的共享包容性 L3 緩存( 在 Skylake 服務器之前)讓 L3 標簽充當窺探過濾器; 除了跟蹤 MESI state 之外,他們還記錄了哪個核心#(如果有)有一行的私有副本。 英特爾酷睿 i7 處理器中使用了哪種緩存映射技術?

例如,帶有環形總線的 Sandybridge 系列 CPU(現代客戶端芯片、服務器芯片直至 Broadwell)。 核心#0 讀取一行。 該行位於核心 #1 上的修改后的 state 中。

  • 在核心#0 上的 L1d 和 L2 緩存中讀取未命中,導致在環形總線上向包含該行的 L3 片發送請求(通過 hash function 在某些物理地址位上進行索引)

  • L3 的那部分得到消息,檢查它的標簽。 如果此時發現 tag = Shared,則響應可以通過雙向環形總線 go 與數據一起返回。

  • 否則,L3 標簽會告訴它核心#1 擁有一行的獨占所有權:Exclusive,可能已被提升為 Modified = dirty。

  • 該 L3 切片中的 L3 緩存邏輯將生成一條消息,要求核心 #1 寫回該行。

  • 消息到達核心#1 的環形總線站,並讓其 L2 或 L1d 寫回該行。

    IDK,如果一個環形總線消息可以直接由核心#0 以及相關的 L3 緩存片讀取,或者如果消息可能必須到 go 一直到 L3 片,然后從那里到達核心#0。 (最壞情況下的距離 = 基本上是環繞環,而不是雙向環的一半。)

這是超級手波; 在確切的細節上不要相信我的話,但是發送共享請求、RFO 或回寫等消息的一般概念是正確的心理 model。 BeeOnRope 的答案是類似的細分為涵蓋 uops 和存儲緩沖區以及 MESI / RFO 的步驟。


在類似的情況下,如果核心#1 只是獲得獨占所有權但從未編寫過它,它可能會在沒有修改它的情況下默默地放棄該行。 (緩存中未命中的加載默認加載到 Exclusive state,因此單獨的存儲不必為同一行執行 RFO)。 在那種情況下,我認為它畢竟沒有線路的核心必須發回一條消息來表明這一點。 或者,它可能直接向同樣位於環形總線上的 memory 控制器之一發送消息,而不是返回到 L3 切片以強制它執行此操作。

顯然,這樣的事情可以在每個內核上並行發生。 (並且每個內核可以有多個等待的未完成請求:單個內核內的 memory 級並行性。在 Intel 上,L2 超級隊列在某些微架構上有 16 個條目,而 L1 LFB 有 10 或 12 個。)

四路及更高系統在 sockets 之間具有監聽濾波器; Broadwell 和更早的具有 E5-xxxx CPU 的雙插槽 Intel 系統只是通過 QPI 鏈接相互偵聽垃圾郵件。 (除非您在雙插槽系統中使用支持四插槽的 CPU (E7-xxxx))。 多插槽很難,因為在本地 L3 中缺失並不一定意味着是時候使用 DRAM; / 另一個套接字可能已修改該行。

還有相關的:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM