CPU多級緩存架構(gòu)

1逾条、基本概念

現(xiàn)代CPU為了提升執(zhí)行效率厂庇,減少CPU與內(nèi)存的交互(交互影響CPU效率),一般在CPU上集成了多級緩存架構(gòu)迷帜,常見的為三級緩存結(jié)構(gòu)物舒。于是當(dāng)從內(nèi)存中讀取數(shù)據(jù)時,并不是只讀自己想要的部分戏锹。而是讀取足夠的字節(jié)來填入高速緩存行冠胯。根據(jù)不同的 CPU ,高速緩存行大小不同锦针。如 X86 是 32BYTES 荠察,而 ALPHA 是 64BYTES 。并且始終在第 32 個字節(jié)或第 64 個字節(jié)處對齊奈搜。這樣悉盆,當(dāng) CPU 訪問相鄰的數(shù)據(jù)時,就不必每次都從內(nèi)存中讀取馋吗,提高了速度焕盟。 因為訪問內(nèi)存要比訪問高速緩存用的時間多得多。

1.1宏粤、總線

????前端總線(FSB)就是負(fù)責(zé)將CPU連接到內(nèi)存的一座橋京髓,前端總線頻率則直接影響CPU與內(nèi)存數(shù)據(jù)交換速度,如果FSB頻率越高商架,說明這座橋越寬堰怨,可以同時通過的車輛越多,這樣CPU處理的速度就更快蛇摸。目前PC機(jī)上CPU前端總線頻率有533MHz备图、800MHz、1066MHz赶袄、1333MHz揽涮、1600MHz等幾種,前端總線頻率越高,CPU與內(nèi)存之間的數(shù)據(jù)傳輸量越大。
????前端總線——Front Side Bus(FSB)政恍,是將CPU連接到北橋芯片的總線。選購主板和CPU時雪标,要注意兩者搭配問題零院,一般來說,前端總線是由CPU決定的村刨,如果主板不支持CPU所需要的前端總線告抄,系統(tǒng)就無法工作。

1.2嵌牺、頻率與降頻

????只支持1333內(nèi)存頻率的cpu和主板配1600內(nèi)存條就會降頻打洼。核心數(shù)跟ddr2和ddr3沒關(guān)系,核心數(shù)是cpu本身的性質(zhì)逆粹,cpu是四核的就是四核的募疮,是雙核的就是雙核的。如果cpu只支持1333僻弹,而主板支持1600阿浓,那也會降頻;cpu支持1600而主板只支持1333那不僅內(nèi)存會降頻奢方,而且發(fā)揮不出cpu全部性能搔扁。
????另外如果是較新的主板cpu爸舒,已經(jīng)采用新的qpi總線蟋字,而不是以前的fsb總線。以前的fsb總線一般是總線為多少就支持多高的內(nèi)存頻率扭勉。而qpi總線的cpu集成了內(nèi)存控制器鹊奖,5.0gt/s的cpu可能只支持1333內(nèi)存頻率,但是總線帶寬相當(dāng)于1333內(nèi)存的內(nèi)存帶寬的兩倍涂炎,這時候忠聚,組成1333雙通道,內(nèi)存速度就會翻倍唱捣,相當(dāng)于2666的內(nèi)存頻率两蟀。

1.3、cache line

????Cache Line可以簡單的理解為CPU Cache中的最小緩存單位震缭。目前主流的CPU Cache的Cache Line大小都是64Bytes赂毯。假設(shè)我們有一個512字節(jié)的一級緩存,那么按照64B的緩存單位大小來算拣宰,這個一級緩存所能存放的緩存?zhèn)€數(shù)就是512/64 = 8個党涕。

2、CPU多級緩存架構(gòu)



級別越小的緩存绿渣,越接近CPU, 意味著速度越快且容量越少次企。

L1是最接近CPU的舟茶,它容量最小,速度最快堵第,每個核上都有一個L1 Cache(準(zhǔn)確地說每個核上有兩個L1 Cache吧凉, 一個存數(shù)據(jù) L1d Cache, 一個存指令 L1i Cache)踏志;

L2 Cache 更大一些阀捅,例如256K,速度要慢一些针余,一般情況下每個核上都有一個獨立的L2 Cache饲鄙;二級緩存就是一級緩存的緩沖器:一級緩存制造成本很高因此它的容量有限,二級緩存的作用就是存儲那些CPU處理時需要用到圆雁、一級緩存又無法存儲的數(shù)據(jù)忍级。

L3 Cache是三級緩存中最大的一級,例如12MB伪朽,同時也是最慢的一級轴咱,在同一個CPU插槽之間的核共享一個L3 Cache。三級緩存和內(nèi)存可以看作是二級緩存的緩沖器烈涮,它們的容量遞增朴肺,但單位制造成本卻遞減。

當(dāng)CPU運作時坚洽,它首先去L1尋找它所需要的數(shù)據(jù)戈稿,然后去L2,然后去L3讶舰。如果三級緩存都沒找到它需要的數(shù)據(jù)鞍盗,則從內(nèi)存里獲取數(shù)據(jù)。尋找的路徑越長绘雁,耗時越長橡疼。所以如果要非常頻繁的獲取某些數(shù)據(jù),保證這些數(shù)據(jù)在L1緩存里庐舟。這樣速度將非承莱快。下表表示了CPU到各緩存和內(nèi)存之間的大概速度:

3挪略、多核CPU多級緩存一致性協(xié)議MESI

  1. CPU1 讀取了一個字節(jié)历帚,以及它和它相鄰的字節(jié)被讀入 CPU1 的高速緩存滔岳。

  2. CPU2 做了上面同樣的工作。這樣 CPU1 挽牢, CPU2 的高速緩存擁有同樣的數(shù)據(jù)谱煤。

  3. CPU1 修改了那個字節(jié),被修改后禽拔,那個字節(jié)被放回 CPU1 的高速緩存行刘离。但是該信息并沒有被寫入 RAM 。

  4. CPU2 訪問該字節(jié)睹栖,但由于 CPU1 并未將數(shù)據(jù)寫入 RAM 硫惕,導(dǎo)致了數(shù)據(jù)不同步。

????為了解決這個問題野来,芯片設(shè)計者制定了一個規(guī)則恼除。當(dāng)一個 CPU 修改高速緩存行中的字節(jié)時,計算機(jī)中的其它 CPU 會被通知曼氛,它們的高速緩存將視為無效豁辉。于是,在上面的情況下舀患, CPU2 發(fā)現(xiàn)自己的高速緩存中數(shù)據(jù)已無效徽级, CPU1 將立即把自己的數(shù)據(jù)寫回 RAM ,然后 CPU2 重新讀取該數(shù)據(jù)构舟。 可以看出灰追,高速緩存行在多處理器上會導(dǎo)致一些不利堵幽。

????多核CPU的情況下有多個一級緩存狗超,如何保證緩存內(nèi)部數(shù)據(jù)的一致,不讓系統(tǒng)數(shù)據(jù)混亂。這里就引出了一個一致性的協(xié)議MESI朴下。

MESI 是指4中狀態(tài)的首字母努咐。每個Cache line有4個狀態(tài),可用2個bit表示殴胧,它們分別是:

緩存行(Cache?line):緩存存儲數(shù)據(jù)的單元渗稍,一般為64Byte。

注意: 對于M和E狀態(tài)而言總是精確的团滥,他們在和該緩存行的真正狀態(tài)是一致的竿屹,而S狀態(tài)可能是非一致的。如果一個緩存將處于S狀態(tài)的緩存行作廢了灸姊,而另一個緩存實際上可能已經(jīng)獨享了該緩存行拱燃,但是該緩存卻不會將該緩存行升遷為E狀態(tài),這是因為其它緩存不會廣播他們作廢掉該緩存行的通知力惯,同樣由于緩存并沒有保存該緩存行的copy的數(shù)量碗誉,因此(即使有這種通知)也沒有辦法確定自己是否已經(jīng)獨享了該緩存行召嘶。

????從上面的意義看來E狀態(tài)是一種投機(jī)性的優(yōu)化:如果一個CPU想修改一個處于S狀態(tài)的緩存行,總線事務(wù)需要將所有該緩存行的copy變成invalid狀態(tài)哮缺,而修改E狀態(tài)的緩存不需要使用總線事務(wù)弄跌。

3.2、MESI狀態(tài)轉(zhuǎn)換


1.觸發(fā)事件

觸發(fā)事件描述本地讀瘸⑽(Local read)本地cache讀取本地cache數(shù)據(jù)本地寫入(Local write)本地cache寫入本地cache數(shù)據(jù)遠(yuǎn)端讀阮踔弧(Remote read)其他cache讀取本地cache數(shù)據(jù)遠(yuǎn)端寫入(Remote write)其他cache寫入本地cache數(shù)據(jù)

2.cache分類:
前提:所有的cache共同緩存了主內(nèi)存中的某一條數(shù)據(jù)。

本地cache:指當(dāng)前cpu的cache糠溜。
觸發(fā)cache:觸發(fā)讀寫事件的cache格仲。
其他cache:指既除了以上兩種之外的cache。
注意:本地的事件觸發(fā) 本地cache和觸發(fā)cache為相同诵冒。

下圖示意了凯肋,當(dāng)一個cache line的調(diào)整的狀態(tài)的時候,另外一個cache line 需要調(diào)整的狀態(tài)汽馋。

?


3.3侮东、多核緩存協(xié)同操作

假設(shè)有三個CPU A、B豹芯、C悄雅,對應(yīng)三個緩存分別是cache a、b铁蹈、 c宽闲。在主內(nèi)存中定義了x的引用值為0。?

單核讀取

那么執(zhí)行流程是:
CPU A發(fā)出了一條指令握牧,從主內(nèi)存中讀取x容诬。
從主內(nèi)存通過bus讀取到緩存中(遠(yuǎn)端讀取Remote read),這是該Cache line修改為E狀態(tài)(獨享).?

雙核讀取

那么執(zhí)行流程是:
CPU A發(fā)出了一條指令,從主內(nèi)存中讀取x沿腰。
CPU A從主內(nèi)存通過bus讀取到 cache a中并將該cache line 設(shè)置為E狀態(tài)览徒。
CPU B發(fā)出了一條指令,從主內(nèi)存中讀取x颂龙。
CPU B試圖從主內(nèi)存中讀取x時习蓬,CPU A檢測到了地址沖突。這時CPU A對相關(guān)數(shù)據(jù)做出響應(yīng)措嵌。此時x 存儲于cache a和cache b中躲叼,x在chche a和cache b中都被設(shè)置為S狀態(tài)(共享)。

修改數(shù)據(jù)

那么執(zhí)行流程是:
CPU A 計算完成后發(fā)指令需要修改x.
CPU A 將x設(shè)置為M狀態(tài)(修改)并通知緩存了x的CPU B, CPU B將本地cache b中的x設(shè)置為I狀態(tài)(無效)
CPU A 對x進(jìn)行賦值企巢。

同步數(shù)據(jù)

那么執(zhí)行流程是:

CPU B 發(fā)出了要讀取x的指令枫慷。
CPU B 通知CPU A,CPU A將修改后的數(shù)據(jù)同步到主內(nèi)存時cache a 修改為E(獨享)
CPU A同步CPU B的x,將cache a和同步后cache b中的x設(shè)置為S狀態(tài)(共享)。

MESI優(yōu)化和他們引入的問題

緩存的一致性消息傳遞是要時間的,這就使其切換時會產(chǎn)生延遲流礁。當(dāng)一個緩存被切換狀態(tài)時其他緩存收到消息完成各自的切換并且發(fā)出回應(yīng)消息這么一長串的時間中CPU都會等待所有緩存響應(yīng)完成涕俗。可能出現(xiàn)的阻塞都會導(dǎo)致各種各樣的性能問題和穩(wěn)定性問題神帅。

CPU切換狀態(tài)阻塞解決-存儲緩存(Store Bufferes)

比如你需要修改本地緩存中的一條信息再姑,那么你必須將I(無效)狀態(tài)通知到其他擁有該緩存數(shù)據(jù)的CPU緩存中,并且等待確認(rèn)找御。等待確認(rèn)的過程會阻塞處理器元镀,這會降低處理器的性能。應(yīng)為這個等待遠(yuǎn)遠(yuǎn)比一個指令的執(zhí)行時間長的多霎桅。

Store Bufferes

為了避免這種CPU運算能力的浪費栖疑,Store Bufferes被引入使用。處理器把它想要寫入到主存的值寫到緩存滔驶,然后繼續(xù)去處理其他事情遇革。當(dāng)所有失效確認(rèn)(Invalidate Acknowledge)都接收到時,數(shù)據(jù)才會最終被提交揭糕。 這么做有兩個風(fēng)險

Store Bufferes的風(fēng)險 第一萝快、就是處理器會嘗試從存儲緩存(Store buffer)中讀取值,但它還沒有進(jìn)行提交著角。這個的解決方案稱為Store Forwarding揪漩,它使得加載的時候,如果存儲緩存中存在吏口,則進(jìn)行返回奄容。 第二、保存什么時候會完成产徊,這個并沒有任何保證昂勒。

value?=?3;void?exeToCPUA(){??value?=?10;
??isFinsh?=?true;
}void?exeToCPUB(){??if(isFinsh){????//value一定等于10囚痴?叁怪!
????assert?value?==?10;
??}
}

試想一下開始執(zhí)行時审葬,CPU A保存著finished在E(獨享)狀態(tài)深滚,而value并沒有保存在它的緩存中。(例如涣觉,Invalid)痴荐。在這種情況下,value會比finished更遲地拋棄存儲緩存官册。完全有可能CPU B讀取finished的值為true生兆,而value的值不等于10。

即isFinsh的賦值在value賦值之前。

這種在可識別的行為中發(fā)生的變化稱為重排序(reordings)鸦难。注意根吁,這不意味著你的指令的位置被惡意(或者好意)地更改。

它只是意味著其他的CPU會讀到跟程序中寫入的順序不一樣的結(jié)果合蔽。

3.4击敌、硬件內(nèi)存模型

執(zhí)行失效也不是一個簡單的操作,它需要處理器去處理拴事。另外沃斤,存儲緩存(Store Buffers)并不是無窮大的,所以處理器有時需要等待失效確認(rèn)的返回刃宵。這兩個操作都會使得性能大幅降低衡瓶。為了應(yīng)付這種情況,引入了失效隊列牲证。它們的約定如下:

寫屏障 Store Memory Barrier(a.k.a. ST, SMB, smp_wmb)是一條告訴處理器在執(zhí)行這之后的指令之前,應(yīng)用所有已經(jīng)在存儲緩存(store buffer)中的保存的指令挎塌。

讀屏障Load Memory Barrier (a.k.a. LD, RMB, smp_rmb)是一條告訴處理器在執(zhí)行任何的加載前徘六,先應(yīng)用所有已經(jīng)在失效隊列中的失效操作的指令。

void?executedOnCpu0()?{????value?=?10;????//在更新數(shù)據(jù)之前必須將所有存儲緩存(store?buffer)中的指令執(zhí)行完畢榴都。
????storeMemoryBarrier();
????finished?=?true;
}void?executedOnCpu1()?{????while(!finished);????//在讀取之前將所有失效隊列中關(guān)于該數(shù)據(jù)的指令執(zhí)行完畢待锈。
????loadMemoryBarrier();
????assert?value?==?10;
}

原文連接



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘴高,隨后出現(xiàn)的幾起案子竿音,更是在濱河造成了極大的恐慌,老刑警劉巖拴驮,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件春瞬,死亡現(xiàn)場離奇詭異,居然都是意外死亡套啤,警方通過查閱死者的電腦和手機(jī)宽气,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萄涯,你說我怎么就攤上這事绪氛。” “怎么了涝影?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵钞楼,是天一觀的道長。 經(jīng)常有香客問我袄琳,道長询件,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任唆樊,我火速辦了婚禮宛琅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逗旁。我一直安慰自己嘿辟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布片效。 她就那樣靜靜地躺著红伦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淀衣。 梳的紋絲不亂的頭發(fā)上昙读,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音膨桥,去河邊找鬼蛮浑。 笑死,一個胖子當(dāng)著我的面吹牛只嚣,可吹牛的內(nèi)容都是我干的沮稚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼册舞,長吁一口氣:“原來是場噩夢啊……” “哼蕴掏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起调鲸,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤盛杰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后线得,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饶唤,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年贯钩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡角雷,死狀恐怖祸穷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺三,我是刑警寧澤雷滚,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站吗坚,受9級特大地震影響祈远,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜商源,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一车份、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牡彻,春花似錦扫沼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至总寻,卻和暖如春器罐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渐行。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工技矮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殊轴。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓衰倦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旁理。 傳聞我的和親對象是個殘疾皇子樊零,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容