閱讀458 返回首頁    go 阿裏雲 go 技術社區[雲棲]


3.3.1 Cache一致性的基本概念

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

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

1 Cache一致性協議

多數SMP處理器係統使用了MESI協議處理多個處理器之間的Cache一致性。該協議也被稱為Illinois protocolMESI協議在SMP處理器係統中得到了廣泛的應用。MESI協議使用四個狀態位描述每一個Cache行。

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

MESI協議還存在一些變種,如MOESI協議和MESIF協議。基於MOESI協議的Cache一致性模型如3?5所示,該模型基於AMD處理器使用的MOESI協議。不同的處理器在實現MOESI協議時,狀態機的轉換原理類似,但是在處理上仍有細微區別。


MOESI協議引入了一個O(Owned)狀態,並在MESI協議的基礎上,進行了重新定義了S狀態,而EMI狀態和MESI協議的對應狀態相同。

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

在一個處理器係統中,主設備(CPU或者外部設備)進行存儲器訪問時,將試圖從存儲器係統(主存儲器或者其他CPUCache)中獲得最新的數據拷貝。如果該主設備訪問的數據沒有在本地命中時,將從其他CPUCache中獲取數據,如果這些數據仍然沒有在其他CPUCache中命中,主存儲器將提供數據。外設設備進行存儲器訪問時,也需要進行Cache共享一致性。

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

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

CPU對一段存儲器進行寫操作時,如果這些數據在本地Cache中命中時,其狀態可能為ESM或者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 BCache中命中時,其狀態可能為ESM或者O。其中CPU A使用CPU B在同一個Cache共享域中。

  •  Cache行狀態為E時,CPU B將該Cache行狀態改為I;而CPU A將從本地申請一新的個Cache行,將數據寫入,並該Cache行狀態更新為M
  •  Cache行狀態為S時,CPU B將該Cache行狀態改為I,而且具有同樣副本的其他CPUCache行也需要將狀態改為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,具有同樣數據副本的其他CPUCache行也需要將狀態從S更改為ICPU A將從本地申請一個Cache行,將數據寫入,並該Cache行狀態更新為M

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

CPU讀取的數據在本地Cache中命中,而且Cache行狀態為O時,數據將從本地Cache獲得,並不會改變Cache行狀態。如果CPU A讀取的數據在其他Cache中命中,如在CPU BCache中命中而且其狀態為O時,CPU B將該Cache行狀態保持為O,同時CPU B將數據傳送給CPU A新申請的Cache行中,而且CPU ACache行狀態將被更改為S

在某些應用場合,使用MOESI協議將極大提高Cache的利用率,因為該協議引入了O狀態,從而在發送Read Hit的情況時,不必將狀態為MCache回寫到主存儲器,而是直接從一個CPUCache將數據傳遞到另外一個CPU。目前MOESI協議在AMDRMI公司的處理器中得到了廣泛的應用。

Intel提出了另外一種MESI協議的變種,即MESIF協議,該協議與MOESI協議有較大的不同,也遠比MOESI協議複雜,該協議由IntelQPI(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行的狀態都為SCache行的狀態位為F時,Cache中的數據與存儲器一致。

當一個數據請求方讀取這個數據副本時,隻有狀態為FCache行,可以將數據副本轉發給數據請求方,而狀態位為SCache不能轉發數據副本。從而MESIF協議有效解決了在ccNUMA處理器結構中,所有狀態位為SCache同時轉發數據副本給數據請求方,而造成的數據擁塞。

ccNUMA處理器係統中,如果狀態位為F的數據副本,被其他CPU拷貝時,F狀態位將會被遷移,新建的數據副本的狀態位將為F,而老的數據副本的狀態位將改變為S。當狀態位為FCache行被改寫後,ccNUMA處理器係統需要首先Invalidate狀態位為S其他的Cache行,之後將Cache行的狀態更新為M

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

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主橋訪問的地址沒有在CPUCache中命中。

1

0

表示HOST主橋訪問的地址在CPUCache中命中,而且Cache的狀態為S(Shared)或者E(Exclusive),即Cache中的數據與存儲器的數據一致。

0

1

表示HOST主橋訪問的地址在CPUCache中命中,而且Cache的狀態為M(Modified),即Cache中的數據與存儲器的數據不一致,在Cache中保存最新的數據拷貝。

0

0

MESI協議規定這種情況不允許出現,但是在有些處理器係統中仍然使用了這種狀態,表示暫時沒有獲得是否在Cache命中的信息,需要等待幾拍後重試。

 

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

3 Cache一致性協議中使用的Agent

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

  •  Request AgentFSB總線事務的發起設備。在本節中,Request Agent特指HOST主橋。實際上在FSB總線上的其他設備也可以成為Request Agent,但這些Request Agent並不是本節的研究重點。Request Agent需要進行總線仲裁後,才能使用FSB,在多數處理器的FSB中,需要對地址總線與數據總線分別進行仲裁。
  • Snoop AgentsFSB總線事務的監聽設備。Snoop AgentsCPU,在一個SMP處理器係統中,有多個CPU共享同一個FSB,此時這些CPU都是這條FSB上的Snoop AgentsSnoop Agents監聽FSB上的存儲器讀寫事務,並判斷這些總線事務訪問的地址是否在Cache中命中。Snoop Agents通過HIT#HITM#信號向FSB通知Cache命中的結果。在某些情況下,Snoop Agents需要將Cache中的數據回寫到存儲器,同時為Request Agent提供數據。
  •  Response AgentFSB總線事務的目標設備。在本節中,Response Agent特指存儲器控製器。Response Agent根據Snoop Agents提供的監聽結果,決定如何接收數據或者向Request Agent設備提供數據。在多數情況下,當前數據訪問沒有在Snoop Agents中命中時,Response Agent需要提供數據,此外Snoop Agents有時需要將數據回寫到Response Agent中。

4 FSB的總線事務

一個FSB的總線事務由多個階段組成,包括Request PhaseSnoop PhaseResponse PhaseData Phase。目前在多數高端處理器中,FSB支持流水操作,即在同一個時間段內,不同的階段可以重疊,如3?6所示。

3.3.1 Cache一致性的基本概念 - maoxingbing - 毛毛蟲的爹


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

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

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



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

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

最後更新:2017-04-03 16:48:39

  上一篇:go 6.1 MSI/MSI-X Capability結構
  下一篇:go POJ 2354 求球麵兩點距離