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