1. 程式人生 > >快取一致性問題——MESI

快取一致性問題——MESI

 Cache一致性協議之MESI

          處理器上有一套完整的協議,來保證Cache一致性。比較經典的Cache一致性協議當屬MESI協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。

單核Cache中每個Cache line有2個標誌:dirty和valid標誌,它們很好的描述了Cache和Memory(記憶體)之間的資料關係(資料是否有效,資料是否被修改),而在多核處理器中,多個核會共享一些資料,MESI協議就包含了描述共享的狀態。

         在MESI協議中,每個Cache line有4個狀態,可用2個bit表示,它們分別是: 

狀態

描述

M(Modified)

這行資料有效,資料被修改了,和記憶體中的資料不一致,資料只存在於本Cache中。

E(Exclusive)

這行資料有效,資料和記憶體中的資料一致,資料只存在於本Cache中。

S(Shared)

這行資料有效,資料和記憶體中的資料一致,資料存在於很多Cache中。

I(Invalid)

這行資料無效。

MESI狀態

           M(Modified)和E(Exclusive)狀態的Cache line,資料是獨有的,不同點在於M狀態的資料是dirty的(和記憶體的不一致),E狀態的資料是clean的(和記憶體的一致)。

          S(Shared)狀態的Cache line,資料和其他Core的Cache共享。只有clean的資料才能被多個Cache共享。

          I(Invalid)表示這個Cache line無效。

          E狀態示例如下:

E狀態

       只有Core 0訪問變數x,它的Cache line狀態為E(Exclusive)。

        S狀態示例如下:

S狀態

         3個Core都訪問變數x,它們對應的Cache line為S(Shared)狀態。

         M狀態和I狀態示例如下:

M狀態和I狀態

            Core 0修改了x的值之後,這個Cache line變成了M(Modified)狀態,其他Core對應的Cache line變成了I(Invalid)狀態。

        在MESI協議中,每個Cache的Cache控制器不僅知道自己的讀寫操作,而且也監聽(snoop)其它Cache的讀寫操作。每個Cache line所處的狀態根據本核和其它核的讀寫操作在4個狀態間進行遷移。

       MESI協議狀態遷移圖如下:

MESI協議狀態遷移圖

        在上圖中,Local Read表示本核心讀本Cache中的值,Local Write表示本核心寫本Cache中的值,Remote Read表示其它核心讀其它Cache中的值,Remote Write表示其它核心寫其它Cache中的值,箭頭表示本Cache line狀態的遷移,環形箭頭表示狀態不變。

        當核心需要訪問的資料不在本Cache中,而其它Cache有這份資料的備份時,本Cache既可以從記憶體中匯入資料,也可以從其它Cache中匯入資料,不同的處理器會有不同的選擇。MESI協議為了使自己更加通用,沒有定義這些細節,只定義了狀態之間的遷移,下面的描述假設本Cache從記憶體中匯入資料。

        MESI狀態之間的遷移過程如下:

當前狀態

事件

行為

下一個狀態

I(Invalid)

Local Read

如果其它Cache沒有這份資料,本Cache從記憶體中取資料,Cache line狀態變成E;

如果其它Cache有這份資料,且狀態為M,則將資料更新到記憶體,本Cache再從記憶體中取資料,2個Cache 的Cache line狀態都變成S;

如果其它Cache有這份資料,且狀態為S或者E,本Cache從記憶體中取資料,這些Cache 的Cache line狀態都變成S

E/S

Local Write

從記憶體中取資料,在Cache中修改,狀態變成M;

如果其它Cache有這份資料,且狀態為M,則要先將資料更新到記憶體;

如果其它Cache有這份資料,則其它Cache的Cache line狀態變成I

M

Remote Read

既然是Invalid,別的核的操作與它無關

I

Remote Write

既然是Invalid,別的核的操作與它無關

I

E(Exclusive)

Local Read

從Cache中取資料,狀態不變

E

Local Write

修改Cache中的資料,狀態變成M

M

Remote Read

資料和其它核共用,狀態變成了S

S

Remote Write

資料被修改,本Cache line不能再使用,狀態變成I

I

S(Shared)

Local Read

從Cache中取資料,狀態不變

S

Local Write

修改Cache中的資料,狀態變成M,

其它核共享的Cache line狀態變成I

M

Remote Read

狀態不變

S

Remote Write

資料被修改,本Cache line不能再使用,狀態變成I

I

M(Modified)

Local Read

從Cache中取資料,狀態不變

M

Local Write

修改Cache中的資料,狀態不變

M

Remote Read

這行資料被寫到記憶體中,使其它核能使用到最新的資料,狀態變成S

S

Remote Write

這行資料被寫到記憶體中,使其它核能使用到最新的資料,由於其它核會修改這行資料,

狀態變成I

I

MESI狀態遷移

           AMD的Opteron處理器使用從MESI中演化出的MOESI協議,O(Owned)是MESI中S和M的一個合體,表示本Cache line被修改,和記憶體中的資料不一致,不過其它的核可以有這份資料的拷貝,狀態為S。

         Intel的core i7處理器使用從MESI中演化出的MESIF協議,F(Forward)從Share中演化而來,一個Cache line如果是Forward狀態,它可以把資料直接傳給其它核心的Cache,而Share則不能。