正文

指令集體系結(jié)構(gòu)(2)

大話(huà)處理器 作者:萬(wàn)木楊


 

3.1.2  計(jì)算機(jī)語(yǔ)言——人與計(jì)算機(jī)溝通的橋梁

早期人們編程時(shí),都是使用匯編語(yǔ)言進(jìn)行編程,編譯器將匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言,交由計(jì)算機(jī)執(zhí)行,匯編語(yǔ)言描述了計(jì)算機(jī)的運(yùn)算過(guò)程,但是卻不符合人類(lèi)的思維方式,程序員苦在其中。

1977年,巴庫(kù)斯在圖靈獎(jiǎng)受獎(jiǎng)演說(shuō)時(shí)講到:“程序設(shè)計(jì)能從馮·諾伊曼風(fēng)格中解放出來(lái)嗎?”巴庫(kù)斯為什么能得到圖靈獎(jiǎng),原因在于他發(fā)明了世界上第一個(gè)高級(jí)語(yǔ)言Fortran,他當(dāng)時(shí)在IBM工作。巴庫(kù)斯向人們介紹了一種全新的編程概念:程序員知道自己想要做什么,而并不需要知道是怎樣做的。高級(jí)語(yǔ)言的編程風(fēng)格更接近于人類(lèi)的自然語(yǔ)言,有了高級(jí)語(yǔ)言后,程序員就擺脫了對(duì)計(jì)算機(jī)的依賴(lài)。

后來(lái),又陸續(xù)出現(xiàn)了C/C++、Java等高級(jí)語(yǔ)言,在這些語(yǔ)言中,兩個(gè)數(shù)求和就可以寫(xiě)成C = A + B,這樣更符合人們的表達(dá)方式,編程也更為方便。

C/C++這些語(yǔ)言,離人們的自然語(yǔ)言還很遠(yuǎn),編程語(yǔ)言也一直向著更智能的方向發(fā)展。在C語(yǔ)言中,矩陣的乘法運(yùn)算要寫(xiě)3級(jí)for循環(huán),而在Matlab中,只要一行語(yǔ)句就可以了。在數(shù)據(jù)庫(kù)語(yǔ)言SQL中,在一個(gè)表中找什么字段,只要SELECT xx FROM xx就可以了,如果用C語(yǔ)言,則需要大量的循環(huán)和比較操作。

未來(lái),編程語(yǔ)言將發(fā)展到和人類(lèi)的自然語(yǔ)言統(tǒng)一,電腦能聽(tīng)懂人類(lèi)的語(yǔ)言,這樣人們就只要告訴電腦要做什么,而不用告訴電腦怎么做。最近,參加知識(shí)競(jìng)賽而聞名的IBM計(jì)算機(jī)Watson在人類(lèi)語(yǔ)言理解上有了很大的突破,它還能夠回答一些腦筋急轉(zhuǎn)彎題目,相信未來(lái)會(huì)做得更好。

3.2  指令集發(fā)展的來(lái)龍去脈

3.2.1  CISC時(shí)代——粗放式擴(kuò)張

CISC代表Complex Instruction Set Computer(復(fù)雜指令集計(jì)算機(jī)),其實(shí)最早并沒(méi)有CISC這個(gè)詞,只是后來(lái)出現(xiàn)了新的計(jì)算機(jī)設(shè)計(jì)思想,于是將采用新思想開(kāi)發(fā)的計(jì)算機(jī)稱(chēng)為RISC(Reduced Instruction Set Computer,精簡(jiǎn)指令集計(jì)算機(jī)),將以前的計(jì)算機(jī)稱(chēng)為CISC。這就好比世上本沒(méi)有舊中國(guó),只是新中國(guó)出現(xiàn)了,才有了舊中國(guó)。CISC和RISC也分別代表了兩種處理器的指令集類(lèi)型。

計(jì)算機(jī)發(fā)展早期,人們使用匯編語(yǔ)言編程,自然更喜歡強(qiáng)大和好用的指令集,處理器的設(shè)計(jì)人員于是將指令集設(shè)計(jì)得更強(qiáng)大、更靈活。后來(lái)高級(jí)語(yǔ)言出現(xiàn),處理器設(shè)計(jì)人員又在指令集中增加了一些指令集和特性直接完成高級(jí)語(yǔ)言對(duì)應(yīng)的某些功能,如復(fù)雜的尋址模式,直接對(duì)應(yīng)指針的運(yùn)算。

那個(gè)時(shí)期的存儲(chǔ)器既昂貴且速度慢,因此指令使用了變長(zhǎng)編碼,以節(jié)約存儲(chǔ)空間。由于一條指令能完成很多的功能,對(duì)內(nèi)存的訪(fǎng)問(wèn)也減少了,這樣也減少了緩慢的存儲(chǔ)器訪(fǎng)問(wèn)對(duì)程序性能的影響。

當(dāng)下還在使用的最出名的CISC指令集是Intel的x86指令集。

3.2.2  RISC時(shí)代——優(yōu)化配置資源,合理提升效率

上世紀(jì)70年代中葉,IBM的John Cocke發(fā)現(xiàn),很多時(shí)候,處理器提供的大量指令集和復(fù)雜尋址方式并不會(huì)被編譯器生成的代碼用到,套用當(dāng)下流行的二八定律,那就是20%的簡(jiǎn)單指令經(jīng)常被用到,它們占程序總指令數(shù)的80%,而指令系統(tǒng)中其余80%復(fù)雜的指令則很少使用,只占程序總指令數(shù)的20%。

一些專(zhuān)家基于這種思想,將指令集和處理器進(jìn)行了重新的設(shè)計(jì),在新的設(shè)計(jì)中,只保留了常用的簡(jiǎn)單的指令,這樣處理器就不需要浪費(fèi)太多的晶體管去做那些很復(fù)雜又很少使用的功能。典型的例子就是Intel的x86指令集手冊(cè)有一千多頁(yè),而一般的RISC處理器指令集手冊(cè)則只有二、三百頁(yè)。

由于簡(jiǎn)單指令大部分時(shí)間都能在一個(gè)cycle內(nèi)完成,因此處理器的頻率得以大幅提升。這個(gè)時(shí)期為了更好地實(shí)現(xiàn)流水線(xiàn),指令集采用了定長(zhǎng)編碼,這樣指令的譯碼過(guò)程就簡(jiǎn)單了。

由于指令集更精簡(jiǎn),這種思想的指令集就叫RISC指令集,以前的指令集就叫CISC指令集。RISC是計(jì)算機(jī)歷史上的一個(gè)飛躍,RISC先驅(qū)之一Steven Przybylski半開(kāi)玩笑地把RISC定義為:“1985年之后發(fā)布的所有處理器”。ARM、MIPS、Power、DSP等都屬于RISC體系,其中MIPS最遵守RISC規(guī)則。

IBM、加州大學(xué)伯克利分校的David Patterson、斯坦福大學(xué)的John Hennessy是RISC研究的先驅(qū),后來(lái)很多商業(yè)的處理器都受到他們的影響,Power處理器來(lái)自IBM,PowerPC處理器起源于Power,ARM、SPARC處理器受到伯克利RISC的影響,MIPS來(lái)自斯坦福,Alpha處理器受到它的影響。

3.2.3  后RISC時(shí)代——不管黑貓白貓,抓到老鼠就是好貓

RISC處理器通過(guò)更合理的微架構(gòu),在性能上超越了傳統(tǒng)的CISC,在最初的較量中,Intel處理器敗下陣來(lái),服務(wù)器的處理器大部分被RISC陣營(yíng)所占據(jù)。在PC領(lǐng)域,由于眾多的應(yīng)用軟件要求處理器后向兼容,因此Intel的地位暫時(shí)沒(méi)有動(dòng)搖。

Intel當(dāng)時(shí)也嘗試做RISC處理器,但是因?yàn)榧嫒菪詥?wèn)題,市場(chǎng)不買(mǎi)賬。《非誠(chéng)勿擾2》中有句經(jīng)典臺(tái)詞:“婚姻怎么選都是錯(cuò),長(zhǎng)久的婚姻就是將錯(cuò)就錯(cuò)?!北诌@一理念,Intel決定一條路走到黑,將兼容性進(jìn)行到底,但是CISC架構(gòu)很難提升性能的壓力卻仍然擺在Intel面前。不過(guò)世界上沒(méi)有什么邁不過(guò)去的坎,任何困難都有解決的方法,Intel終于在Pentium Pro處理器問(wèn)世時(shí)解決了這一問(wèn)題。

David B. Papworth和他的同事一起設(shè)計(jì)了Pentium Pro處理器,它的微架構(gòu)是Intel著名的P6,在很多教科書(shū)上都會(huì)介紹。在這個(gè)處理器中,x86指令集被先解碼為類(lèi)似于RISC指令的微操作(micro- operations,簡(jiǎn)稱(chēng)為uops),以后的執(zhí)行過(guò)程采用RISC內(nèi)核,這種架構(gòu)一直延續(xù)至今,成為一代經(jīng)典。CISC這種古老的架構(gòu),通過(guò)巧妙的設(shè)計(jì),又一次煥發(fā)新春,可以說(shuō)是老樹(shù)發(fā)新芽的典范,Papworth也因此在Intel內(nèi)獲得很多獎(jiǎng)項(xiàng),成為Intel Fellow。

這種處理器結(jié)構(gòu)相較于沒(méi)有兼容性壓力的純RISC處理器要復(fù)雜,但好在有兼容性的優(yōu)勢(shì)來(lái)保證市場(chǎng)。80、90年代,服務(wù)器廠(chǎng)商很多,不少服務(wù)器廠(chǎng)商都自己生產(chǎn)處理器,而生產(chǎn)處理器是個(gè)燒錢(qián)的行當(dāng),如果沒(méi)有一定銷(xiāo)量的保證,就會(huì)得不償失,這也限制了處理器芯片的研發(fā),而Intel有良好的PC市場(chǎng)來(lái)保證研發(fā),因此x86處理器的性能逐漸超過(guò)了同期的RISC處理器,搶占了服務(wù)器市場(chǎng),導(dǎo)致其他的處理器廠(chǎng)商只能向低功耗,或面向?qū)S蓄I(lǐng)域的嵌入式方向發(fā)展。

RISC和CISC都是時(shí)代的產(chǎn)物,也無(wú)所謂誰(shuí)好誰(shuí)壞。RISC作為新興事物,在很多思想上要更先進(jìn),不過(guò)CISC也有它的一些優(yōu)點(diǎn)。

CISC指令的一條指令常常對(duì)應(yīng)著RISC指令的多條指令,在RISC處理器中,過(guò)分精簡(jiǎn)的指令數(shù)量,使得RISC 處理器與存儲(chǔ)器之間的數(shù)據(jù)交換增多,而存儲(chǔ)器的工作速度遠(yuǎn)低于處理器,很容易導(dǎo)致性能惡化。

增加處理器性能的一種方法就是多提供指令功能,RISC中的“精簡(jiǎn)指令”也越來(lái)越變得不精簡(jiǎn)。x86處理器近幾年逐漸增加了幾百條MMX、SSE指令,用于提高多媒體程序和其他特殊程序的性能。DSP、ARM、MIPS等處理器每代也會(huì)增加不少的指令,用于完成特殊的任務(wù),哪怕是這些功能很少被使用。

傳統(tǒng)的RISC指令集為了譯碼方便,指令采用定長(zhǎng)編碼,因此程序空間較大,雖然存儲(chǔ)成本相對(duì)較低,但是在很多應(yīng)用下,程序空間較大會(huì)降低Cache的命中率,降低程序的執(zhí)行效率。

TI C64 DSP采用定長(zhǎng)指令編碼,每個(gè)指令32bit,而在它的升級(jí)版本C64+內(nèi)核中,就將一些指令改為16bit,這樣大大減少了程序長(zhǎng)度。Tensilica公司的可配置處理器內(nèi)核Xtensa也是采用16bit/24bit的指令長(zhǎng)度,同樣的例子還有MIPS、ARM等處理器,ARM的Thumb指令集就是16bit的,這種簡(jiǎn)單的變長(zhǎng)指令集,并沒(méi)有增加多少譯碼電路,不過(guò)卻能大幅度減少程序空間和功耗。

總結(jié)

處理器/指令集呈現(xiàn)出螺旋式的發(fā)展:逐漸做大,然后優(yōu)化,然后又做大……從量變到質(zhì)變,然后進(jìn)入下一輪的量變和質(zhì)變,只是此“質(zhì)”已非彼“質(zhì)”了。


上一章目錄下一章

Copyright ? 讀書(shū)網(wǎng) www.afriseller.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)