如何安裝CPU
如何安裝CPU
我們都知道CPU是什么東西,有什么用,但是你知道它是如何工作的嗎?下面就讓學(xué)習(xí)啦小編和大家說(shuō)一下CPU是如何工作的。
CPU的工作方式
對(duì)于同級(jí)別的CPU產(chǎn)品而言,AMD CPU的單核性能(甚至總體性能)比Intel CPU的差,甚至差距不小,這是不爭(zhēng)的事實(shí)。然而,幾乎沒(méi)有人問(wèn)一句為什么如此,或者只是略知一二(包括我)。本文就用盡量淺顯的語(yǔ)言探討一下這個(gè)實(shí)際上極為復(fù)雜的問(wèn)題。
鑒于Intel和AMD都沒(méi)有披露新品的whitepaper的習(xí)慣,所以我用信息比較充足的有點(diǎn)久遠(yuǎn)的型號(hào)進(jìn)行講解,就是Intel的Sandy Bridge/Ivy Bridge(第2、3代酷睿)和AMD的Bulldozer/Piledriver(推土機(jī)、打樁機(jī))微架構(gòu)。目前來(lái)講,兩家的微架構(gòu)設(shè)計(jì)都大體穩(wěn)定,從比較新的Broadwell和Steamroller的各方面信息來(lái)看,它們?nèi)匀换狙赜昧藦腟andy Bridge和Bulldozer以來(lái)的方案,沒(méi)有本質(zhì)的變化。
(因此農(nóng)企想要翻身,只能把希望寄托在遙不可及的Zen微架構(gòu)上了)
首先來(lái)說(shuō)基礎(chǔ)知識(shí),就是CPU是如何工作的。學(xué)習(xí)計(jì)算機(jī)科學(xué)的童鞋可能對(duì)下面的這些東西比較了解。
CPU之所以能完成這么多的事情,是因?yàn)樗跁r(shí)時(shí)都在執(zhí)行著很多的指令(instructions)。指令就是我們所運(yùn)行的操作系統(tǒng)和各種程序發(fā)送給CPU的命令,CPU根據(jù)這些指令來(lái)做出各種響應(yīng)。
CPU能夠執(zhí)行的所有指令的集合就叫做指令集(instruction set)。目前我們最常見(jiàn)的Intel和AMD CPU,其都采用最經(jīng)典的CISC x86指令集,以及在x86指令集上的某些擴(kuò)展,也就是說(shuō)絕大部分是相同的。
另外,CPU中還有兩個(gè)重要的部件,分別為寄存器(register)和緩存(cache,為了方便簡(jiǎn)寫為$),它們都擔(dān)負(fù)著暫存指令或者數(shù)據(jù)的作用。
寄存器處于CPU內(nèi)部,有很多組,是最高速的存儲(chǔ)單元,容量非常小。緩存可以處于CPU內(nèi)部或外部,其存儲(chǔ)速度比寄存器慢,但比內(nèi)存快得多,并且容量可以用KB或MB來(lái)衡量。另外,緩存可以分級(jí),離CPU核心最近的叫做一級(jí)緩存(L1$),次近的叫做二級(jí)緩存(L2$),以此類推。
只有指令沒(méi)有用,必須還要有一套方法來(lái)驅(qū)動(dòng)CPU做事情,否則不過(guò)是空殼而已。這套方法就叫做流水線(pipeline)。
這個(gè)概念并不抽象,大家可以把它想象成工廠裝配車間里的流水線:從一堆零部件開(kāi)始,經(jīng)過(guò)流水線上十幾位工人的組裝,最后出來(lái)的時(shí)候就變成了一臺(tái)可以使用的設(shè)備。并且,工廠里肯定不只有一條流水線,可能有數(shù)十條,也就是上百甚至上千位工人同時(shí)工作,生產(chǎn)效率就會(huì)變得非常高。
從上世紀(jì)90年代的奔騰時(shí)代之前,CPU中就引入了流水線的概念。當(dāng)時(shí)的5段流水線模型十分經(jīng)典,其設(shè)計(jì)經(jīng)過(guò)逐代擴(kuò)充,目前仍然在用。這個(gè)經(jīng)典的模型就是:
取指(Instruction Fetch)→譯碼(Instruction Decode)→執(zhí)行(EXecute)→寫回(Write Back)
分別簡(jiǎn)稱為IF、ID、EX和WB,其中ID階段有兩段,分別稱為ID1和ID2,所以一共5段。
顧名思義,這條流水線的邏輯就是:從緩存或者內(nèi)存中取得指令→對(duì)指令進(jìn)行翻譯,變成CPU能夠理解的具體功能→按照翻譯結(jié)果,執(zhí)行運(yùn)算動(dòng)作→將運(yùn)算結(jié)果寫回存儲(chǔ)器中。很容易理解吧。
大家都知道,CPU的運(yùn)作是靠時(shí)鐘信號(hào)來(lái)驅(qū)動(dòng)的,這個(gè)信號(hào)的頻率就叫CPU的主頻(main frequency),頻率的倒數(shù)當(dāng)然就是周期了。一般來(lái)講,每個(gè)流水線階段的執(zhí)行需要花費(fèi)1個(gè)時(shí)鐘周期(clock cycle,為了方便簡(jiǎn)寫為CC)。
因此,如果這樣的流水線執(zhí)行4條指令,那么它的執(zhí)行時(shí)空?qǐng)D就如下。
也就是說(shuō),采用這種流水線只需要8CC就可以執(zhí)行4條指令,效率非常高。到了奔騰時(shí)代之后,更出現(xiàn)了超標(biāo)量流水線(superscalar pipeline),也就是CPU中有多條流水線同時(shí)執(zhí)行指令,效率幾乎翻倍提高。另外,還出現(xiàn)了超流水線(super pipeline),也就是流水線的級(jí)數(shù)大大增加,規(guī)模明顯提升。分別的示意圖如下。
但是,這樣的流水線設(shè)計(jì)也存在問(wèn)題,具體來(lái)講有二。
第一,考慮同一流水線中先后執(zhí)行的兩條指令1:add a,b和2:xor c,a,也就是說(shuō)2需要1的計(jì)算結(jié)果,這種關(guān)系叫做相關(guān)性。當(dāng)指令2執(zhí)行到上表中第5個(gè)CC時(shí),無(wú)法進(jìn)入EX階段,因?yàn)榇藭r(shí)指令1的結(jié)果還未寫回寄存器,也就是說(shuō)指令2的EX階段必須拖到第6個(gè)CC才可以執(zhí)行,浪費(fèi)了一個(gè)CC的時(shí)間,這叫做流水線的阻塞(stall)。超流水線級(jí)數(shù)越多,這種現(xiàn)象就越發(fā)明顯,效率就越低。如下圖。
第二,考慮超標(biāo)量流水線中,不同流水線中執(zhí)行的兩條指令。如果排在前面的指令執(zhí)行速度太慢(比如涉及耗時(shí)嚴(yán)重的訪存操作),那么會(huì)造成后面早已執(zhí)行完畢的指令不得不等待,造成更嚴(yán)重的性能問(wèn)題。
也就是說(shuō),基于線性通路的流水線,對(duì)于目前的復(fù)雜的微處理器而言是并不適用的。因此,Intel早早就提出了“亂序執(zhí)行”(out-of-order execution, OOO EX)的概念,采用非完全線性的通路來(lái)規(guī)避這個(gè)問(wèn)題。也就是這樣的。
我借助這個(gè)圖粗略講一下現(xiàn)代處理器的執(zhí)行過(guò)程。
上圖是一個(gè)四發(fā)射、亂序執(zhí)行的流水線框圖,從1995年以來(lái)的Intel處理器基本都采用類似的設(shè)計(jì)方案。所謂多發(fā)射(multiple issue),就是處理器能夠同時(shí)獲取并譯碼多條指令,目前的處理器幾乎都是四發(fā)射設(shè)計(jì)。
首先,在取指過(guò)程中,會(huì)多出一個(gè)分支預(yù)測(cè)(branch prediction, BP)的階段,圖中未明確示出。分支預(yù)測(cè)器能檢測(cè)諸如跳轉(zhuǎn)、返回等動(dòng)作的大致發(fā)生時(shí)機(jī),并提前把跳轉(zhuǎn)目的地的指令加載到指令緩存(I$)中,以提高效率。
然后,經(jīng)過(guò)多個(gè)譯碼器的譯碼,指令被分解成為上文所述的CPU能夠理解的操作,這些叫做微操作(μop)。微操作被送入寄存器別名表(RAT),進(jìn)行重命名,以防止多條指令共用一個(gè)對(duì)程序猿非透明的寄存器時(shí)產(chǎn)生的相關(guān)性,簡(jiǎn)單來(lái)講,就是用內(nèi)部的臨時(shí)寄存器來(lái)替代一般我們能見(jiàn)到的寄存器來(lái)進(jìn)行操作。重命名完畢后,微操作進(jìn)入后面的重排序緩存(ROB)中,進(jìn)行重新排列。
然后就是亂序執(zhí)行的重點(diǎn)了。微操作從保留站(reservation station, RS)中,分別打入不同的執(zhí)行端口(port),同時(shí)執(zhí)行。每個(gè)端口都是全速運(yùn)行的,只要微操作準(zhǔn)備就緒,并且有空閑的對(duì)應(yīng)端口,那么它就可以立即被執(zhí)行,而不用關(guān)心其他微操作的執(zhí)行狀態(tài),也就是可以跳過(guò)任何還沒(méi)有準(zhǔn)備就緒的微操作。這樣,流水線產(chǎn)生阻塞的可能性就大大地降低了。每個(gè)port都可以負(fù)責(zé)一種或多種事務(wù),如整數(shù)運(yùn)算、浮點(diǎn)運(yùn)算、存數(shù)據(jù)、取地址等。
當(dāng)一條指令分解成的所有微操作被執(zhí)行完畢之后,它們會(huì)返回保留站,并通知各自的地址,通過(guò)地址可以將微操作重新聚合為一條完整的指令。完成的指令排成一個(gè)隊(duì)列,并退出流水線。也就是說(shuō),盡管所有指令的碎片是亂序執(zhí)行的,但從流水線中出來(lái)時(shí),它們?nèi)匀皇琼樞虻?,就跟自然而然的一樣?/p>
基礎(chǔ)知識(shí)講完了,下面開(kāi)始對(duì)比,看看農(nóng)企為何不太給力。
為了描述方便,后面用SNB/IVB代表Sandy Bridge/Ivy Bridge,BDZ/PDV代表Bulldozer/Piledriver。
首先看SNB和BDZ的簡(jiǎn)單框圖。下面的是以i7 2600為例。
下面的則是以八核心Opteron為例,畢竟圖上寫了個(gè)Interlagos Node,反正是推土機(jī)就好了,你們可以把它當(dāng)成FX-8150之類的。
我們都知道,Intel的CPU采用超線程(hyper threading, HT)技術(shù),使得一個(gè)物理核心對(duì)高層而言看起來(lái)像是兩個(gè)核心一樣,這種邏輯的、虛擬的核心在Intel的概念內(nèi)叫做線程。而AMD的CPU采用模塊化設(shè)計(jì),就是每?jī)蓚€(gè)物理核心集合為一個(gè)模塊,AMD將它命名為計(jì)算單元(compute unit, CU),一個(gè)CU中的兩個(gè)核心協(xié)同完成事務(wù)。也就是說(shuō),i7是四核心、八線程,F(xiàn)X是四模塊、八核心,本質(zhì)上可以近似認(rèn)為是一樣的。
另外,從圖中還可以看到內(nèi)存控制器、顯示控制器、HyperTransport控制器等,并且還能大致觀察到它們的緩存結(jié)構(gòu),下面當(dāng)然也會(huì)細(xì)說(shuō)。
下面給出SNB/IVB架構(gòu)的全圖。
下面給出BDZ/PDV架構(gòu)的全圖。
可以看到,上面的兩張圖被中間的一條紅線分為兩個(gè)區(qū)域。紅線上面的部分叫處理器前端(processor front-end),下面的部分叫處理器后端(processor back-end)。
另外,圖中的方框也被五種顏色區(qū)分開(kāi)了。前端部分包括紫色和橙色,紫色的為取指(IF)和分支預(yù)測(cè)(BP)模塊,橙色的為譯碼(ID)模塊。后端部分包括黃、藍(lán)、綠三種顏色,黃色的為調(diào)度和保留站(RS)模塊,藍(lán)色的為執(zhí)行(EX)模塊,綠色的為存儲(chǔ)(MEM)模塊。我們逐個(gè)來(lái)討論。
首先看取指和分支預(yù)測(cè)模塊。下圖是SNB/IVB的該模塊。
下圖是BDZ/PDV的該模塊。
我們來(lái)比較分支預(yù)測(cè)機(jī)制,就是圖中的Branch Predictors。
SNB/IVB的分支預(yù)測(cè)器有兩級(jí),每個(gè)核心有一個(gè)。第一級(jí)預(yù)測(cè)器很小,但速度極快,可以在1CC內(nèi)完成一次分支預(yù)測(cè)。第二級(jí)則大得多,作為一個(gè)后備。預(yù)測(cè)器的成分包括:簡(jiǎn)單的2-bit預(yù)測(cè)器、全局歷史預(yù)測(cè)器、循環(huán)退出預(yù)測(cè)器。Intel在內(nèi)部自建有一套算法,用于判斷當(dāng)前哪個(gè)預(yù)測(cè)器的準(zhǔn)確度較高,并選用之。
SNB/IVB的分支目標(biāo)緩存(branch target buffer, BTB)結(jié)構(gòu)目前大多認(rèn)為是1層,具體細(xì)節(jié)未知,但基本上會(huì)有多達(dá)8K甚至16K條條目(”reasonably large”)。對(duì)于每16個(gè)字節(jié)長(zhǎng)的代碼段,它能hold住最多4條跳轉(zhuǎn)指令。另外,返回棧的緩存有16條。
當(dāng)然,如果預(yù)測(cè)錯(cuò)誤的話,必然會(huì)造成時(shí)間損失(因?yàn)榱魉€幾乎會(huì)被flush掉),這叫做誤預(yù)測(cè)罰時(shí)(misprediction penalty)。SNB/IVB的罰時(shí)大約為15~17CC。
BDZ/PDV的分支預(yù)測(cè)器則是每個(gè)模塊有一個(gè),由兩個(gè)核心共享,采用本地預(yù)測(cè)+全局預(yù)測(cè)的混合預(yù)測(cè)方式。AMD在其內(nèi)部使用了感知器(perceptron),像神經(jīng)元一樣跟隨并記憶分支結(jié)果,因此在經(jīng)過(guò)一段時(shí)間的訓(xùn)練過(guò)程后,對(duì)較長(zhǎng)的跳轉(zhuǎn)有較好的表現(xiàn)。但其內(nèi)部并無(wú)循環(huán)計(jì)數(shù)器,因此對(duì)于嵌套較深的循環(huán)表現(xiàn)比較差。
BDZ/PDV的BTB結(jié)構(gòu)是兩層組相連的緩存。L1 BTB有128組*4路=512條,L2 BTB有1024組*5路=5120條。返回棧的緩存則是有24條。誤預(yù)測(cè)罰時(shí)大約為20~25CC。
我們大致需要知道的是:BP的誤預(yù)測(cè)率越高,誤預(yù)測(cè)罰時(shí)越長(zhǎng),那么整個(gè)BP模塊的效率就越低。AMD宣稱BDZ/PDV的BP效率較其上一代的K10(Barcelona/Magny-Cours)架構(gòu)為高,但實(shí)際上是相反的。K10的誤預(yù)測(cè)罰時(shí)只有12~15CC(當(dāng)然,K10是沒(méi)有采用比較先進(jìn)的模塊化設(shè)計(jì)的),也就是說(shuō),在同頻率下,對(duì)于那些風(fēng)險(xiǎn)比較大的分支,BDZ必須要比K10達(dá)到40%以上的正確預(yù)測(cè)率的提升,才能彌補(bǔ)罰時(shí)的損失,但這是不可能的事情。相對(duì)而言,SNB/IVB的BP效率比較高,預(yù)測(cè)器中的一個(gè)bit可以對(duì)應(yīng)多條分支,并且有了黑科技μop$的加成(下面會(huì)提到),誤預(yù)測(cè)帶來(lái)的損失會(huì)更小。
上面有大神在回復(fù)中提到說(shuō),推土機(jī)有些像奔騰4時(shí)代的NetBurst架構(gòu)。這種說(shuō)法還是比較中肯的。BDZ雖然沒(méi)有NetBurst那么恐怖的流水線級(jí)數(shù)(比如Prescott的39級(jí)流水線),但仍然比較長(zhǎng),有18~20級(jí),并且分支預(yù)測(cè)的時(shí)間損失都比較大,都沒(méi)有實(shí)現(xiàn)“通過(guò)提高主頻就可以簡(jiǎn)單地提升性能”的設(shè)想。
下面來(lái)看取指過(guò)程。
對(duì)于SNB/IVB而言,當(dāng)下一條指令的地址確定之后,就會(huì)同時(shí)查詢L1I$和μop$(下面就提到),一次可以從I$取得16B的代碼段。然后,取得的指令會(huì)被放入下面的預(yù)譯碼緩存中。預(yù)譯碼器會(huì)劃分這些指令的邊界,并對(duì)指令前綴進(jìn)行譯碼。隨后,經(jīng)過(guò)預(yù)譯碼的指令以每個(gè)CC 6條的速度,送入下面的指令隊(duì)列中,準(zhǔn)備接受譯碼。SNB/IVB的指令隊(duì)列長(zhǎng)度未知,但由于早在Merom架構(gòu)時(shí),其長(zhǎng)度就達(dá)到了18條,因此幾乎可以肯定這里的指令隊(duì)列長(zhǎng)于18條。
對(duì)于BDZ/PDV而言,取指模塊仍然是由兩個(gè)核心共享的。在兩個(gè)核心都活動(dòng)的情況下,它最多可以一次從I$取得32B的代碼段;在一個(gè)核心活動(dòng)的情況下,則是最多20B的代碼段。當(dāng)代碼沒(méi)有對(duì)齊時(shí),取指的速率會(huì)有降低。指令在I$中劃分邊界,然后以32B/CC的速率,進(jìn)入16個(gè)條目的指令碼緩存,作用和Intel的指令隊(duì)列是相同的。
CPU是如何工作的相關(guān)文章:
5.電腦是如何工作的