浅谈Intel QPI的MESIF协议和Home,Source Snoop
Intel的Nehalem一出,CPU江湖頓時(shí)失色。其中北橋FSB被滅,CSI/QPI興起是一個(gè)重要因素。也正式宣告了Parallel Bus在處理器領(lǐng)域的王牌地位退出,和Serial Bus或者Point2Point互聯(lián)的統(tǒng)治地位的誕生。。。:走的快(Parallel Bus)不如走的遠(yuǎn)(Serial Bus)。
QPI的互聯(lián),其中Cache的一致性是一個(gè)關(guān)鍵。
其協(xié)議是什么?MESIF!與經(jīng)典的MESI相比,多了一個(gè)F word。當(dāng)然,不是bad words。這里的F是Forwarding的意思。
在上面的兩個(gè)圖中,左邊的是MESIF;右邊的是經(jīng)典的MESI。MESIF的例子中,我們可以看見(jiàn),F狀態(tài)的存在其實(shí)就是為了與S狀態(tài)區(qū)別開(kāi)來(lái)。系統(tǒng)中只有一個(gè)F,類比與:在一個(gè)家庭中,婆婆與老婆。如果是雙重領(lǐng)導(dǎo),事情全mess up。必須是一個(gè)領(lǐng)導(dǎo)F。找數(shù)據(jù)的時(shí)候,F給你,而非S(系統(tǒng)中有許多S)。讀者一定要注意,F狀態(tài)的引入是為了性能,而非狀態(tài)機(jī)的完備性。沒(méi)有F,S就可以搞定一切[如上右圖]。系統(tǒng)中,對(duì)任何一個(gè)數(shù)據(jù)的Cacheline,有而且只有一個(gè)F。每次一個(gè)新人上臺(tái),需要數(shù)據(jù),F就移交。F變成S。最新的數(shù)據(jù)變成F。這也是最佳利用Cache算法中的所謂Temporal Locality和Spatial Locality的考量:年輕人一定是會(huì)持續(xù)工作,時(shí)間長(zhǎng)的。。。;年老的數(shù)據(jù)一定不是常用的;持續(xù)力不夠的。。。另外,讀者從上面兩圖中可以看出,MESI會(huì)造成QPI的鏈路上產(chǎn)生沒(méi)必要的Snooping Response: 系統(tǒng)里多個(gè)婆婆(擁有相同數(shù)據(jù)備份的node)在非常殷勤的告訴一個(gè)申請(qǐng)者:阿拉有數(shù)據(jù),and here you go。。。
在Nehalem互聯(lián)中,QPI可以有Source Snoop或者Home Snoop。通常而言,小規(guī)模socket互聯(lián)用Source Snoop;大規(guī)?;ヂ?lián)用Home Snoop。
Home Snoop和Source Snoop的本質(zhì)區(qū)別與Snooping時(shí)候MESFI狀態(tài)機(jī)的F狀態(tài)的目的是類似的:在能解決問(wèn)題的同時(shí),盡量減少互聯(lián)上的Transaction。例如,Home Snoop的意思就是:老大說(shuō)了算,負(fù)責(zé)協(xié)調(diào);別人都別吭聲。Soure Snoop的意思就是:各個(gè)小山頭都可以摻和,立功表態(tài)。說(shuō)到這里,就理解了,如果是一個(gè)大規(guī)模的Nehalem機(jī)群互聯(lián),用Home Snoop好;如果是1-8個(gè)Nehalem互聯(lián),估計(jì)Source Snoop好一些。道理很簡(jiǎn)單:如果是一個(gè)startup,問(wèn)一個(gè)事,吆喝一聲,知道的都回答你,挺好的;如果是一個(gè)10萬(wàn)人的公司,發(fā)個(gè)群發(fā)email給10萬(wàn)個(gè)人,問(wèn)一個(gè)事情,估計(jì)罵你的人比回答你答案的人都多;你最好是問(wèn)主管(Home)。。。
在上圖中,哪個(gè)是Home Snoop?哪個(gè)是Source Snoop?顯然,右圖上Home Snoop;左圖是Source Snoop。Source Snoop一定是而且只是2 Hop就能搞定數(shù)據(jù),while Home Snoop需要在大本營(yíng)到一下手,需要3 Hop。
MESIF,Intel申請(qǐng)了專利。其專利為:
Forward state for use in cache coherency in a multiprocessor system
該專利是2002年12月9日申請(qǐng)的。2005年7月26日批的。
M-blah-blah-I有許多變種。許多讀者估計(jì)要么會(huì)迷糊,要么靜不下心來(lái)。如果是前者,抓住一個(gè)要素:Write Invalidate。
我曾經(jīng)在若干年前用大白話解釋過(guò)Write Invalidate協(xié)議。學(xué)術(shù)的東西其實(shí)本質(zhì)很簡(jiǎn)單。要理解須先要忘記學(xué)術(shù),返璞歸真。。。
下圖是一個(gè)MESI的簡(jiǎn)單狀態(tài)機(jī)。在理解Cache一致性協(xié)議狀態(tài)機(jī)的時(shí)候,最容易犯迷糊的是把本CPU的動(dòng)作與Snooping的動(dòng)作混淆。現(xiàn)在簡(jiǎn)單忽悠一下這里面的M狀態(tài)。從M上面圍繞的動(dòng)作,我們可以知道:藍(lán)色的是自已玩自己的動(dòng)作(發(fā)生在本CPU內(nèi)部的);紅色的是監(jiān)聽(tīng)到友商(別的CPU,或者其他邏輯,反正就是人在江湖,不得不在一起混的那些node,station等等)的動(dòng)作。M的意思是:我現(xiàn)在是獨(dú)家擁有,而且我很牛,還獨(dú)家擁有修改過(guò)的數(shù)據(jù)。我現(xiàn)在自己獨(dú)樂(lè)樂(lè)(Local Read;Local Write);顯然,沒(méi)人能拿你怎么樣。你多牛呀,你接著當(dāng)M!……但是,突然在總線(FSB)或者互聯(lián)(QPI)上監(jiān)聽(tīng)到了不想看到的事情。。。:(1)有人發(fā)生了讀行為(Remote Read)。你該如何辦?還想一黨獨(dú)大嘛?沒(méi)天理。你要把最新的數(shù)據(jù)給人民。。。而且要把數(shù)據(jù)UPDATE到DRAM里面去。數(shù)據(jù)是天下人的數(shù)據(jù);而非某個(gè)CPU的數(shù)據(jù)!你的狀態(tài)要變成S(hared)的了。。。。。。(2)有人發(fā)生了寫(xiě)行為(Remote Write)。要奪權(quán)!!!如何處理!?交權(quán)!皇帝輪流轉(zhuǎn)!請(qǐng)把數(shù)據(jù)交出來(lái),給別人寫(xiě)一寫(xiě),玩一玩;然后人家變成了M;你自己變成了I(nvalid)了。。。你需要變成S嘛?至少目前沒(méi)必要,除非你想讀。。。。。。
細(xì)心的讀者估計(jì)會(huì)反復(fù)琢磨這個(gè)狀態(tài)機(jī)。請(qǐng)注意I(nvalid)狀態(tài)的輸入!!!嚴(yán)格的一致:全部來(lái)自紅色的Remote Write–這就是我們說(shuō)M-blah-blah-blah-I等各種變種協(xié)議都來(lái)自學(xué)術(shù)界里的所謂:Write Invalidate Protocol。用大白話就是:寫(xiě)失效。只要我看到別人有寫(xiě)一個(gè)數(shù)據(jù)備份,我就認(rèn)栽!承認(rèn)自己是弱勢(shì)群體。。。。。。變成非法躲貓貓。
下圖所示是MESFI,MOESI,MESI狀態(tài)機(jī)的一些比較。Note that AMD的ccHT用的是MOESI。。。
另外,從SerDes的角度來(lái)觀察QPI。可以這樣去理解:QPI是一個(gè)Parallel Clock的SerDes。
這就可以理解QPI的Signal(Pin)了。QPI是單向的。信號(hào)是21個(gè)。20lane(bit)+clock。每個(gè)信號(hào)是Differential Signal(差分信號(hào))的。因此是20×2 +1×2=42個(gè)pin(管腳)。如果一個(gè)QPI 端口(Port)【一發(fā),一送,pair】,是84個(gè)pin。。。
Intel以前的并行總線Front-side Bus的pin有多少,600+多個(gè)!QPI是84個(gè)!比一比,嚇一跳。
Parallel Clock SerDes是典型的把以前的并行總線信號(hào)匯聚成Serial Bus的做法?!犊刂菩盘?hào)+數(shù)據(jù)信號(hào)+地址信號(hào)+時(shí)鐘)—》時(shí)鐘+Serialized Signals。
總結(jié)
以上是生活随笔為你收集整理的浅谈Intel QPI的MESIF协议和Home,Source Snoop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MarkdownPad入门级编写不完全指
- 下一篇: 发布自己的Python包(Pypi)