3.3.1 Cache一致性的基本概念
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協議時,狀態機的轉換原理類似,但是在處理上仍有細微區別。
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 | 0 | 表示HOST主橋訪問的地址在CPU的Cache中命中,而且Cache的狀態為S(Shared)或者E(Exclusive),即Cache中的數據與存儲器的數據一致。 |
0 | 1 | 表示HOST主橋訪問的地址在CPU的Cache中命中,而且Cache的狀態為M(Modified),即Cache中的數據與存儲器的數據不一致,在Cache中保存最新的數據拷貝。 |
0 | 0 | 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所示。
在一個實際的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的操作流程。
最後更新:2017-04-03 16:48:39