天天看點

cache一緻性協:MESI和MOESI

轉自:http://blog.sina.com.cn/s/blog_6472c4cc0100qxcd.html

PCI裝置對可Cache的存儲器空間進行DMA讀寫的操作的過程較為複雜,有關Cache一緻性的話題可以獨立成書。而不同的處理器系統使用的Cache Memory的層次結構和通路機制有較大的差異,這部分内容也是現代處理器系統設計的重中之重。

本節僅介紹在Cache Memory系統中與PCI裝置進行DMA操作相關的,一些最為基礎的概念。在多數處理器系統中,使用了以下概念描述Cache一緻性的實作過程。

1 Cache一緻性協定

多數SMP處理器系統使用了MESI協定處理多個處理器之間的Cache一緻性。該協定也被稱為Illinois protocol,MESI協定在SMP處理器系統中得到了廣泛的應用。MESI協定使用四個狀态位描述每一個Cache行。

  •  M(Modified)位。M 位為1 時表示目前Cache 行中包含的資料與存儲器中的資料不一緻,而且它僅在本CPU的Cache 中有效,不在其他CPU的Cache 中存在拷貝,在這個Cache行的資料是目前處理器系統中最新的資料拷貝。當CPU對這個Cache行進行替換操作時,必然會引發系統總線的寫周期,将Cache行中資料與記憶體中的資料同步。
  •  E(Exclusive)位。E 位為1 時表示目前Cache行中包含的資料有效,而且該資料僅在目前CPU的Cache中有效,而不在其他CPU的Cache中存在拷貝。在該Cache行中的資料是目前處理器系統中最新的資料拷貝,而且與存儲器中的資料一緻。
  •  S(Shared)位。S 位為1 表示Cache行中包含的資料有效,而且在目前CPU和至少在其他一個CPU中具有副本。在該Cache行中的資料是目前處理器系統中最新的資料拷貝,而且與存儲器中的資料一緻。
  • I(Invalid)位。I 位為1 表示目前Cache 行中沒有有效資料或者該Cache行沒有使能。MESI協定在進行Cache行替換時,将優先使用I位為1的Cache行。

MESI協定還存在一些變種,如MOESI協定和MESIF協定。基于MOESI協定的Cache一緻性模型如圖3‑5所示,該模型基于AMD處理器使用的MOESI協定。不同的處理器在實作MOESI協定時,狀态機的轉換原理類似,但是在處理上仍有細微差別。

cache一緻性協:MESI和MOESI

MOESI協定引入了一個O(Owned)狀态,并在MESI協定的基礎上,進行了重新定義了S狀态,而E、M和I狀态和MESI協定的對應狀态相同。

  •  O位。O位為1表示在目前Cache 行中包含的資料是目前處理器系統最新的資料拷貝,而且在其他CPU中一定具有該Cache行的副本,其他CPU的Cache行狀态為S。如果主存儲器的資料在多個CPU的Cache中都具有副本時,有且僅有一個CPU的Cache行狀态為O,其他CPU的Cache行狀态隻能為S。與MESI協定中的S狀态不同,狀态為O的Cache行中的資料與存儲器中的資料并不一緻。
  •  S位。在MOESI協定中,S狀态的定義發生了細微的變化。當一個Cache行狀态為S時,其包含的資料并不一定與存儲器一緻。如果在其他CPU的Cache中不存在狀态為O的副本時,該Cache行中的資料與存儲器一緻;如果在其他CPU的Cache中存在狀态為O的副本時,Cache行中的資料與存儲器不一緻。

在一個處理器系統中,主裝置(CPU或者外部裝置)進行存儲器通路時,将試圖從存儲器系統(主存儲器或者其他CPU的Cache)中獲得最新的資料拷貝。如果該主裝置通路的資料沒有在本地命中時,将從其他CPU的Cache中擷取資料,如果這些資料仍然沒有在其他CPU的Cache中命中,主存儲器将提供資料。外設裝置進行存儲器通路時,也需要進行Cache共享一緻性。

在MOESI模型中,“Probe Read”表示主裝置從其他CPU中擷取資料拷貝的目的是為了讀取資料;而“Probe Write”表示主裝置從其他CPU中擷取資料拷貝的目的是為了寫入資料;“Read Hit”和“Write Hit”表示主裝置在本地Cache中獲得資料副本;“Read Miss”和“Write Miss”表示主裝置沒有在本地Cache中獲得資料副本;“Probe Read Hit”和“Probe Write Hit”表示主裝置在其他CPU的Cache中獲得資料副本。

本節為簡便起見,僅介紹CPU進行存儲器寫和與O狀态相關的Cache行狀态遷移,CPU進行存儲器讀的情況相對較為簡單,請讀者自行分析這個過程。

當CPU對一段存儲器進行寫操作時,如果這些資料在本地Cache中命中時,其狀态可能為E、S、M或者O。

  •  狀态為E或者M時,資料将直接寫入到Cache中,并将狀态改為M。
  •  狀态為S時,資料将直接寫入到Cache中,并将狀态改為M,同時其他CPU儲存該資料副本的Cache行狀态将從S或者O遷移到I(Probe Write Hit)。
  •  狀态為O時,資料将直接寫入到Cache中,并将狀态改為M,同時其他CPU儲存該資料副本的Cache行狀态将從S遷移到I(Probe Write Hit)。

當CPU A對一段存儲器進行寫操作時,如果這些資料沒有在本地Cache中命中時,而在其他CPU,如CPU B的Cache中命中時,其狀态可能為E、S、M或者O。其中CPU A使用CPU B在同一個Cache共享域中。

  •  Cache行狀态為E時,CPU B将該Cache行狀态改為I;而CPU A将從本地申請一新的個Cache行,将資料寫入,并該Cache行狀态更新為M。
  •  Cache行狀态為S時,CPU B将該Cache行狀态改為I,而且具有同樣副本的其他CPU的Cache行也需要将狀态改為I;而CPU A将從本地申請一個Cache行,将資料寫入,并該Cache行狀态更新為M。
  •  Cache行狀态為M時,CPU B将原Cache行中的資料回寫到主存儲器,并将該Cache行狀态改為I;而CPU A将從本地申請一個Cache行,将資料寫入,并該Cache行狀态更新為M。
  •  Cache行狀态為O時,CPU B将原Cache行中的資料回寫到主存儲器,并将該Cache行狀态改為I,具有同樣資料副本的其他CPU的Cache行也需要将狀态從S更改為I;CPU A将從本地申請一個Cache行,将資料寫入,并該Cache行狀态更新為M。

Cache行狀态可以從M遷移到O。例如當CPU A讀取的資料從CPU B中命中時,如果在CPU B中Cache行的狀态為M時,将遷移到O,同時CPU B将資料傳送給CPU A新申請的Cache行中,而且CPU A的Cache行狀态将被更改為S。

當CPU讀取的資料在本地Cache中命中,而且Cache行狀态為O時,資料将從本地Cache獲得,并不會改變Cache行狀态。如果CPU A讀取的資料在其他Cache中命中,如在CPU B的Cache中命中而且其狀态為O時,CPU B将該Cache行狀态保持為O,同時CPU B将資料傳送給CPU A新申請的Cache行中,而且CPU A的Cache行狀态将被更改為S。

在某些應用場合,使用MOESI協定将極大提高Cache的使用率,因為該協定引入了O狀态,進而在發送Read Hit的情況時,不必将狀态為M的Cache回寫到主存儲器,而是直接從一個CPU的Cache将資料傳遞到另外一個CPU。目前MOESI協定在AMD和RMI公司的處理器中得到了廣泛的應用。

Intel提出了另外一種MESI協定的變種,即MESIF協定,該協定與MOESI協定有較大的不同,也遠比MOESI協定複雜,該協定由Intel的QPI(QuickPath Interconnect)技術引入,其主要目的是解決“基于點到點的全互連處理器系統”的Cache共享一緻性問題,而不是“基于共享總線的處理器系統”的Cache共享一緻性問題。

在基于點到點互連的NUMA(Non-Uniform Memroy Architecture)處理器系統中,包含多個子處理器系統,這些子處理器系統由多個CPU組成。如果這個處理器系統需要進行全機Cache共享一緻性,該處理器系統也被稱為ccNUMA(Cache Cohenrent NUMA)處理器系統。MESIF協定主要解決ccNUMA處理器結構的Cache共享一緻性問題,這種結構通常使用目錄表,而不使用總線監聽處理Cache的共享一緻性。

MESIF協定引入了一個F(Forware)狀态。在ccNUMA處理器系統中,可能在多個處理器的Cache中存在相同的資料副本,在這些資料副本中,隻有一個Cache行的狀态為F,其他Cache行的狀态都為S。Cache行的狀态位為F時,Cache中的資料與存儲器一緻。

當一個資料請求方讀取這個資料副本時,隻有狀态為F的Cache行,可以将資料副本轉發給資料請求方,而狀态位為S的Cache不能轉發資料副本。進而MESIF協定有效解決了在ccNUMA處理器結構中,所有狀态位為S的Cache同時轉發資料副本給資料請求方,而造成的資料擁塞。

在ccNUMA處理器系統中,如果狀态位為F的資料副本,被其他CPU拷貝時,F狀态位将會被遷移,建立的資料副本的狀态位将為F,而老的資料副本的狀态位将改變為S。當狀态位為F的Cache行被改寫後,ccNUMA處理器系統需要首先Invalidate狀态位為S其他的Cache行,之後将Cache行的狀态更新為M。

獨立地研究MESIF協定并沒有太大意義,該協定由Boxboro-EX處理器系統[1]引入,目前Intel并沒有公開Boxboro-EX處理器系統的詳細設計文檔。MESIF協定僅是解決該處理器系統中Cache一緻性的一個功能,該功能的詳細實作與QPI的Protocal Layer相關,QPI由多個層次組成,而Protocal Layer是QPI的最高層。

對MESIF協定QPI互連技術有興趣的讀者,可以在深入了解“基于目錄表的Cache一緻性協定”的基礎上,閱讀Robert A. Maddox, Gurbir Singh and Robert J. Safranek合著的書籍“Weaving High Performance Multiprocessor Fabric”以了解該協定的實作過程和與QPI互連技術相關的背景知識。

值得注意的是,MESIF協定解決主要的問題是ccNUMA架構中SMP子系統與SMP子系統之間Cache一緻性。而在SMP處理器系統中,依然需要使用傳統的MESI協定。Nehelem EX處理器也可以使用MOESI協定進一步優化SMP系統使用的Cache一緻性協定,但是并沒有使用該協定。

為簡化起見,本章假設處理器系統使用MESI協定進行Cache共享一緻性,而不是MOESI協定或者MESIF協定。

2 HIT#和HITM#信号

在SMP處理器系統中,每一個CPU都使用HIT#和HITM#信号反映HOST主橋通路的位址是否在各自的Cache中命中。當HOST主橋通路存儲器時,CPU将驅動HITM#和HIT#信号,其描述如表3‑1所示。

 表3‑1 HITM#和HIT#信号的含義

HITM# HIT# 描述
1 1 表示HOST主橋通路的位址沒有在CPU的Cache中命中。
1 表示HOST主橋通路的位址在CPU的Cache中命中,而且Cache的狀态為S(Shared)或者E(Exclusive),即Cache中的資料與存儲器的資料一緻。
1 表示HOST主橋通路的位址在CPU的Cache中命中,而且Cache的狀态為M(Modified),即Cache中的資料與存儲器的資料不一緻,在Cache中儲存最新的資料拷貝。
MESI協定規定這種情況不允許出現,但是在有些處理器系統中仍然使用了這種狀态,表示暫時沒有獲得是否在Cache命中的資訊,需要等待幾拍後重試。

HIT#和HITM#信号是FSB中非常重要的兩個信号,各個CPU的HIT#和HITM#信号通過“線與方式”直接相連[2]。而在一個實際FSB中,還包括許多信号,本節并不會詳細介紹這些信号。

3 Cache一緻性協定中使用的Agent

在處理器系統中,與Cache一緻性相關的Agent如下所示。

  •  Request Agent。FSB總線事務的發起裝置。在本節中,Request Agent特指HOST主橋。實際上在FSB總線上的其他裝置也可以成為Request Agent,但這些Request Agent并不是本節的研究重點。Request Agent需要進行總線仲裁後,才能使用FSB,在多數處理器的FSB中,需要對位址總線與資料總線分别進行仲裁。
  • Snoop Agents。FSB總線事務的監聽裝置。Snoop Agents為CPU,在一個SMP處理器系統中,有多個CPU共享同一個FSB,此時這些CPU都是這條FSB上的Snoop Agents。Snoop Agents監聽FSB上的存儲器讀寫事務,并判斷這些總線事務通路的位址是否在Cache中命中。Snoop Agents通過HIT#和HITM#信号向FSB通知Cache命中的結果。在某些情況下,Snoop Agents需要将Cache中的資料回寫到存儲器,同時為Request Agent提供資料。
  •  Response Agent。FSB總線事務的目标裝置。在本節中,Response Agent特指存儲器控制器。Response Agent根據Snoop Agents提供的監聽結果,決定如何接收資料或者向Request Agent裝置提供資料。在多數情況下,目前資料通路沒有在Snoop Agents中命中時,Response Agent需要提供資料,此外Snoop Agents有時需要将資料回寫到Response Agent中。

4 FSB的總線事務

一個FSB的總線事務由多個階段組成,包括Request Phase、Snoop Phase、Response Phase和Data Phase。目前在多數高端處理器中,FSB支援流水操作,即在同一個時間段内,不同的階段可以重疊,如圖3‑6所示。

cache一緻性協:MESI和MOESI

在一個實際的FSB中,一個總線事務還可能包含Arbitration Phase和Error Phase。而本節僅講述圖3‑6中所示的4個基本階段。

  •  Request Phase。Request Agent在獲得FSB的位址總線的使用權後,在該階段将通路資料區域的位址和總線事務類型發送到FSB上。
  • Snoop Phase。Snoop Agents根據通路資料區域在Cache中的命中情況,使用HIT#和HITM#信号,向其他Agents通知Cache一緻性的結果。有時Snoop Agent需要将資料回寫到存儲器。
  • Reponse Phase。Response Agent根據Request和Snoop Phase提供的信号,可以要求Request Agent重試(Retry),或者Response Agent延時處理(Defer)目前總線事務。在FSB總線事務的各個階段中,該步驟的處理過程最為複雜。本章将在下文結合PCI裝置的DMA讀寫執行過程,說明該階段的實作原理。
  •  Data Phase。一些不傳遞資料的FSB總線事務不包含該階段。該階段用來進行資料傳遞,包括Request Agent向Response Agent寫入資料;Response Agent為Request Agent提供資料;和Snoop Agent将資料回寫到Response Agent。

下文将使用本小節中的概念,描述在PCI總線中,與Cache相關的總線事務,并講述相關的FSB的操作流程。

[1] Boxboro-EX處理器系統由多個Nehalem EX處理器組成,而Nehalem EX處理器由兩個SMP處理器系統組成,一個SMP處理器系統由4個CPU組成,而每一個CPU具有2個線程。其中SMP處理器系統之間使用QPI進行連接配接,而在一個SMP處理器内部的各個CPU仍然使用FSB連接配接。

[2] HIT#和HITM#信号是Open Drain(開漏)信号,Open Drain信号可以直接相連,而不用使用邏輯門。