蒲青文 西昌學(xué)院
氮?dú)猓鳛槌?jí)跑車在賽道上扭轉(zhuǎn)乾坤的利器,可以將引擎的最后一點(diǎn)潛能完全壓榨出來,以此獲得爆裂般的加速。而CPU作為對(duì)速度有更高要求的計(jì)算機(jī)核心部件,對(duì)于速度的追求自然是用戶以及工程師們的終極夢(mèng)想,因此各個(gè)實(shí)驗(yàn)室的工程師們也必將為此絞盡腦汁……
我們就以Intel CPU的發(fā)展為例為簡(jiǎn)要闡述一下CPU中的“氮?dú)狻奔铀偌夹g(shù)是怎么一點(diǎn)點(diǎn)被開發(fā)出來的。
Intel在1978-06-08創(chuàng)造了8086處理器,這時(shí)處理器的執(zhí)行流程非常簡(jiǎn)單,就是從內(nèi)存中讀取操作碼后將操作碼譯碼解析成微指令,并由微指令驅(qū)動(dòng)邏輯電路去完成具體計(jì)算操作,然后再讀取下一條指令。
以上操作可被概括為取指令、譯碼和執(zhí)行這三步,而且每次都要等到這三個(gè)步驟都完成后才能執(zhí)行下一條指令。
由于CPU的執(zhí)行速度遠(yuǎn)高于內(nèi)存的讀取速度,因此Intel發(fā)現(xiàn)整個(gè)CPU的性能瓶頸出現(xiàn)在內(nèi)存讀取這一環(huán)節(jié)上。而又因?yàn)榻^大多數(shù)指令編譯的操作碼僅幾個(gè)字節(jié)大小,所以Intel在1982年發(fā)布了一款新CPU 80186,并且增加了指令緩存機(jī)制。
80186擁有一個(gè)6字節(jié)的指令緩存器,在每次剩余空間大于等于3字節(jié)時(shí),80186就會(huì)自動(dòng)提前將下一條指令從內(nèi)存中讀取進(jìn)來,進(jìn)而大大降低了操作碼的讀取延遲。
由于指令緩存機(jī)制在80186上取得了巨大成功,因此Intel在1985年發(fā)布的80386上面將指令緩存提高到了最大8KB,相較80186增加了1300余倍,并增加了數(shù)據(jù)緩存機(jī)制。
由于內(nèi)存的延遲已經(jīng)被Intel在80386上盡可能的優(yōu)化,因此Intel的工程師們這一次將優(yōu)化的目光鎖定在指令執(zhí)行的流程上,他們首先將指令的執(zhí)行細(xì)分為五個(gè)步驟,分別為:
Step1:取指令,將操作碼從指令緩存中取出;
Step2:譯碼,將操作嗎翻譯為具體的微指令;
Step3:轉(zhuǎn)址,將內(nèi)存地址和偏移進(jìn)行轉(zhuǎn)換;
Step4:執(zhí)行,指令在該階段真正執(zhí)行運(yùn)算(由微指令控制硬件邏輯電路去完成);
Step5:退出,將執(zhí)行結(jié)果寫回到寄存器或者內(nèi)存。
一個(gè)指令必須要經(jīng)過這5步才能執(zhí)行完成,而CPU執(zhí)行這5步所需要占用的CPU時(shí)間就被稱之為這條指令執(zhí)行所需的時(shí)鐘周期,需要時(shí)鐘周期越短的指令,其在一秒鐘內(nèi)可以執(zhí)行的次數(shù)就越多,效率就越高。
Intel在1989年第一次將五級(jí)流水線技術(shù)應(yīng)用到了80486處理器中,使得新處理器在頻率僅為上代一倍多的情況下獲得了數(shù)倍于上代CPU的理論執(zhí)行速度。
既然流水線這么強(qiáng)悍,那么為什么不多搞一些呢?其實(shí)Intel的工程師們也是這么想的,因此Intel在1993年推出的首代奔騰(因?yàn)?86這個(gè)代號(hào)被占用,所以啟用了新名字Pentium)處理器時(shí),第一次將超標(biāo)量流水線結(jié)構(gòu)應(yīng)用到自己的產(chǎn)品中。
新款奔騰處理器的超標(biāo)量流水線由兩條五級(jí)流水線構(gòu)成,但是限于一些底層邏輯限制,第二條流水線能夠執(zhí)行的指令類別有所受限,并且在遇到類似于JMP、CALL等轉(zhuǎn)移指令時(shí)會(huì)使得第二條流水線失效,但是即便如此,啟用超流水線結(jié)構(gòu)的CPU也比其他同等工況下快了近1倍。
通過流水線的優(yōu)化讓Intel的工程師們嘗到了甜頭,但是因?yàn)槌绦虼a的前后順序邏輯等問題,在增加過多的流水線對(duì)于指令的執(zhí)行速度不會(huì)再有明顯的提高,因此Intel的工程師們將優(yōu)化目標(biāo)錨定在流水線本身邏輯的修改及加強(qiáng)上。
Intel在1995年推出的奔騰Pro處理器中首次應(yīng)用了可以極大改進(jìn)流水線工作效率的亂序執(zhí)行(Out-of-Order, OOO)技術(shù),并且為了緩解因JMP、JNZ等轉(zhuǎn)移指令對(duì)超標(biāo)量流水線的影響而推出了指令預(yù)測(cè)(猜測(cè)執(zhí)行/分支預(yù)測(cè))技術(shù),這兩種技術(shù)的出現(xiàn)使得Intel的流水線已經(jīng)被優(yōu)化到了極致。除此之外,奔騰Pro更是將原先的五級(jí)流水線升級(jí)到了12級(jí),這使得奔騰Pro處理器中的每條流水線理論上可同時(shí)執(zhí)行12條指令。
經(jīng)過如此優(yōu)化的流水線已經(jīng)明顯不符合當(dāng)時(shí)的主流情況,進(jìn)而導(dǎo)致奔騰Pro上的流水線在大多數(shù)情況下實(shí)際是在等待新指令的傳入,而正是由于Intel這次跨時(shí)代的流水線優(yōu)化,使其早在23年前便為今天的漏洞埋下了禍根,并且使其養(yǎng)成了擠牙膏的壞習(xí)慣,看來車開的太快果然容易出問題。
由于上次亂序執(zhí)行與指令預(yù)測(cè)的雙劍合璧,使得CPU處理指令的速度飆漲,進(jìn)而導(dǎo)致指令被執(zhí)行的速度比處理器能夠提供指令的速度更快,因此CPU的超標(biāo)量流水線部件在大部分時(shí)間處于空閑狀態(tài)。為了讓整套流水線部件能夠完全發(fā)揮其應(yīng)有的作用,Intel在2002年為奔騰4處理器加入了第二套前端部件(例如寄存器、譯碼器等),這樣對(duì)于操作系統(tǒng)來說,它就能看到兩個(gè)處理器了。這樣來自兩套前端部件的所有的指令被一個(gè)共享的流水線部件執(zhí)行,進(jìn)而充分的發(fā)揮了其本來作用,而這種技術(shù)就被稱之為超線程。