摘要:本系列深度分析文章將調(diào)查13種不成功的處理器種群,探索了造成每一個(gè)處理器種群死亡的主要設(shè)計(jì)錯(cuò)誤。每一個(gè)主要設(shè)計(jì)錯(cuò)誤還用一個(gè)或幾個(gè)例子來闡述。
關(guān)鍵詞:處理器;HLL;算法;語言
在計(jì)算機(jī)發(fā)展的整個(gè)70年期間,曾經(jīng)出現(xiàn)了各種各樣的分立和嵌入式處理器種群,它們已經(jīng)進(jìn)化,并且有些種群已經(jīng)逐漸消失。從這一進(jìn)化中產(chǎn)生了許多新奇的設(shè)計(jì)。有些新奇的概念繼續(xù)生存,有些幾乎立即消亡,而一些概念僅僅存活了短暫的時(shí)間就銷聲匿跡了,但是,繼承他們基因的技術(shù)在后續(xù)的種群中再次出現(xiàn)。
錯(cuò)誤1:設(shè)計(jì)高水平的計(jì)算機(jī)指令集架構(gòu)以支持特殊的語言或語言域(Myopisaur)
本文將調(diào)查13種不成功的處理器種群。然而,隨著技術(shù)使得許多老的概念煥發(fā)新生、重塑輝煌并再次成為新概念而獲得無止境的重復(fù)利用,也許不知什么時(shí)候,勇猛的探索者/設(shè)計(jì)師將接下來遇見這些處理器種群當(dāng)中的哪一個(gè)呢?這些種群可能被當(dāng)成是恐龍:許多基于這些概念的處理器曾經(jīng)就是它們那個(gè)時(shí)代的優(yōu)勢(shì)種群,或者,已經(jīng)曾經(jīng)大放光芒并極其繁榮而引起了大量的關(guān)注。正是因?yàn)椴粩噙M(jìn)化的世界造成了我們的處理器種群的必然演化甚至滅絕,但這并不意味著一個(gè)處理器種群在它存在的鼎盛時(shí)期不能合理地適應(yīng)世界。
從最早的計(jì)算時(shí)代起,人們不斷推動(dòng)在抽象級(jí)解決編程問題,從接線板編程、撥動(dòng)開關(guān)輸入、機(jī)器語言輸入、匯編語言到整個(gè)一大群“高級(jí)”編程語言(HLL),從上世紀(jì)50年代的Fortran和COBOL,乃至上、下半葉研究出來的幾百或上千種編程語言。
HLL一被開發(fā)出來,人們就開始擔(dān)心用于捕獲編程問題答案的HLL描述與被在目標(biāo)機(jī)上執(zhí)行的由HLL編譯器產(chǎn)生的實(shí)際指令之間的語義差異。每一種編譯器常常產(chǎn)生不好的結(jié)果一有時(shí)候非常糟糕。即使現(xiàn)在,盡管編譯器的開發(fā)經(jīng)歷了50多年,但是,對(duì)于許多算法來說,最高技能的人類匯編語言編碼員所獲得的編譯結(jié)果的質(zhì)量,要比由最佳的HLL編程器與最佳的可用最優(yōu)化編譯器所產(chǎn)生的代碼高一個(gè)數(shù)量級(jí)(或一個(gè)數(shù)量級(jí)以上)。
計(jì)算機(jī)研究人員和商用計(jì)算機(jī)供應(yīng)商不可避免地開始研究根據(jù)特殊的HLL或語言種群調(diào)節(jié)一種特殊處理器的可行性,以期把處理器的指令集與語言的要求更為緊密地匹配起來,并縮小語義差異。其理論就是以那些目標(biāo)HLL編寫的程序應(yīng)該在這些經(jīng)調(diào)整的機(jī)器上更為高效地執(zhí)行。
一系列不合適的努力
為了實(shí)現(xiàn)這一方法一出現(xiàn)在從主機(jī)、微型機(jī)、分立微處理器IC到嵌入式處理器內(nèi)核一的幾十年經(jīng)驗(yàn)以及努力,已經(jīng)再三地確定這種方法是一個(gè)重大架構(gòu)錯(cuò)誤。的確,在Hennessy和Patterson關(guān)于計(jì)算機(jī)架構(gòu)的開創(chuàng)性圖書中可以發(fā)現(xiàn)這是典型的“謬誤和缺陷”之一。
這一方法存在的基本問題是多方面的:盡管已經(jīng)被調(diào)整為一種語言,但是,處理器可能(而且非常可能)被用于運(yùn)行于其它語言編寫的程序。經(jīng)調(diào)整的處理器在運(yùn)行采用這些其它HLL編寫的程序時(shí)效率比較低。
在較早時(shí)代,硬件資源很少被花費(fèi)在極少被采用的指令的有效執(zhí)行上——這是對(duì)昂貴的架構(gòu)資本的一種劣質(zhì)應(yīng)用。
因一種HLL構(gòu)造的一些非常特殊的應(yīng)用,針對(duì)特定語言的指令可能終止執(zhí)行,并且對(duì)于典型和最常見的應(yīng)用是沒有用的。因此,對(duì)這種指令的硬件本質(zhì)上是一種浪費(fèi)。
語言演化。基于固定、針對(duì)特殊HLL硬件的計(jì)算機(jī)架構(gòu)較之于語言本身趨向于在非常長(zhǎng)的時(shí)間內(nèi)維持不變,因?yàn)檐浖扔布右子谧兓?/p>
針對(duì)特殊HLL的處理器的流行被目標(biāo)HLL的普及無情地終結(jié)。在各種語言中的少數(shù)體驗(yàn)造成一種處理器具有最少的市場(chǎng)訴求。
因此,這種架構(gòu)方法的缺陷花了很長(zhǎng)時(shí)間才顯現(xiàn)出來。從上世紀(jì)60年代至80年代中期,在RISC架構(gòu)方法發(fā)源以前,基于復(fù)雜指令集計(jì)算機(jī)(CISC)、針對(duì)特殊HLL的計(jì)算機(jī)架構(gòu)激起了人們巨大的興趣。研究人員撰寫了幾百或上千的論文,關(guān)于這個(gè)課題的專題研討會(huì)和座談會(huì)相當(dāng)流行,而各個(gè)公司根據(jù)這一設(shè)計(jì)哲學(xué)向市場(chǎng)推出各種真實(shí)的機(jī)器。
E-mode意味著緩慢的模式
Burroughs公司的“E-mode”機(jī)可能是被設(shè)計(jì)為支持特殊語言的最著名的機(jī)器系列。這個(gè)系列包括從上世紀(jì)60年代初至90年代的B5000/6000/7000和A-series機(jī)(一些兼容的處理器仍然在供貨)。這些機(jī)器被設(shè)計(jì)為直接執(zhí)行Algol 60。這種計(jì)算機(jī)家族還具有許多其它重要的功能,包括基于堆棧的架構(gòu)、非平(non-flat)存儲(chǔ)器的利用、無匯編語言、操作系統(tǒng)和專用的管理子系統(tǒng)采用與Algol 60的直接對(duì)話編寫、并且采用的是48比特的存儲(chǔ)字(加上標(biāo)簽比特)。的確,在上世紀(jì)60年代和70年代期間,Burroughs幾乎成為了針對(duì)特殊HLL的計(jì)算機(jī)設(shè)計(jì)方法的偶像。
在這個(gè)時(shí)期,這家公司生產(chǎn)了中等規(guī)模和小型的針對(duì)Cobol的主機(jī)(B2000/3000/4000),以及一種被用于B1700/1800機(jī)的有趣的微碼架構(gòu),其中,包括一組可以被進(jìn)出交換以匹配不同語言的解釋指令集組。正如關(guān)于B5000的最熱心評(píng)論所說,Burroughs“專注于采用較高級(jí)的編程注釋以實(shí)際地排斥機(jī)器或匯編語言”。
遺憾的是,Burroughs E-mode機(jī)因HLL機(jī)的若干缺點(diǎn)而受損。它們?cè)跇?biāo)準(zhǔn)科學(xué)和商務(wù)處理語言—FORTRAN和COBOL—上的表現(xiàn)肯定是缺乏活力的。后來,為這些機(jī)器構(gòu)建C編譯器以及把Unix引入它們的根本架構(gòu)上的嘗試被證明是困難的,因架構(gòu)的分層存儲(chǔ)結(jié)構(gòu)沒有小的部分。要嘗試把針對(duì)特定HLL的指令集擴(kuò)展至較低端的機(jī)器需要大量的微碼。遺憾的是,Algol 60從未真正以流行的編程語言起飛。這毫無疑問減少了Burroughs機(jī)的普及程度。
如上所述,Burroughs以面向B2000/3000/4000計(jì)算機(jī)的COBOL語言繼續(xù)它的針對(duì)特殊HLL的設(shè)計(jì)哲學(xué),它至少具有針對(duì)更為流行、鎖定商務(wù)的HLL的有點(diǎn)。
許多語言,同樣差的結(jié)果
針對(duì)特定HLL的處理器設(shè)計(jì)的吸引力,還導(dǎo)致人們開發(fā)直接運(yùn)行用APL[HAS]、Lisp[WHO]、Prolog[FAG]以及其它直接針對(duì)Basic、Fortran、Pascal、PL/I和Snobol[DIT80]編寫的程序的機(jī)器。的確,針對(duì)特定HLL的計(jì)算機(jī)架構(gòu)設(shè)計(jì)方法所存在的問題導(dǎo)致人們?cè)?980年[DIT80]對(duì)它們進(jìn)行了深刻的反思,只是在CISC工作站出現(xiàn)之前、以及后來在上世紀(jì)80年代中期RISC處理器和工作站出現(xiàn)之時(shí)。
從主機(jī)時(shí)代向著小型和微型計(jì)算機(jī)時(shí)代的遷移,見證了上述針對(duì)特定HLL的計(jì)算機(jī)架構(gòu)設(shè)計(jì)方法以Burroughs B1700/1800獲得重復(fù)使用,它為若干語言提供了微碼指令集(COBOL、RPG以及其中的Fortran)[ORG77]和許多專用的工作站級(jí)機(jī)器。被設(shè)計(jì)來直接執(zhí)行Lisp的機(jī)器就是一個(gè)特別著名的例子(Lisp機(jī)、Symbolics)。
分立微處理器時(shí)代也看到了若干針對(duì)特定HLL的微處理器架構(gòu),包括:被設(shè)計(jì)來運(yùn)行Occam的Inmos Transputer;由貝爾實(shí)驗(yàn)室設(shè)計(jì)的用于直接執(zhí)行C程序的CRISP處理器[DIT87,DIT87b];在所有這類微處理器當(dāng)中,也許最為著名(或聲名狼藉)的就是英特爾公司的432,它被設(shè)計(jì)為運(yùn)行以Ada語言編寫的程序[GEH]。Transputer及其Occam描述了一種針對(duì)特定HLL的處理器的功能之一,有時(shí)候,它的開發(fā)者對(duì)于特殊的計(jì)算理論以信奉宗教般或準(zhǔn)宗教般的熱愛投入,從而以奴性的方式證明它自己對(duì)于一種編程語言的奉獻(xiàn),并盡力進(jìn)行實(shí)質(zhì)努力以開發(fā)一種支持它的機(jī)器。
盡管Transputer編譯器后來形成為更加傳統(tǒng)的HLL,但是,Transputer是以O(shè)ccam推出的,這是一種基于Tony Hoare的計(jì)算序列處理概念。Transputer就是特定為Occam構(gòu)建的。Inmos的領(lǐng)導(dǎo)人Iann Barron是Occam的最高牧師。Transputer的歷史描述了前面所列出的針對(duì)HLL的架構(gòu)所存在的問題之一。它的成功高度依賴于找到一個(gè)對(duì)Occam有足夠興趣的市場(chǎng),以購(gòu)買為它而設(shè)計(jì)的處理器,或者對(duì)Transputer有足夠的興趣以采納它作為與眾不同的語言。這聽起來很像一次宗教對(duì)話。
英特爾公司的432被設(shè)計(jì)為執(zhí)行Ada,Ada在更為一般的意義上說是面向?qū)ο蟮恼Z言。英特爾公司的432可能代表針對(duì)特定HLL處理器的極端情況,它對(duì)任何語言均無法實(shí)現(xiàn)足夠的性能,包括用來設(shè)計(jì)它的Ada語言。實(shí)際上,英特爾公司的432微處理器整個(gè)冗長(zhǎng)的故事一直遭受設(shè)計(jì)錯(cuò)誤的折磨。在[GEH]中引證了一些設(shè)計(jì)錯(cuò)誤,我們發(fā)現(xiàn)它們分別是:
·Ada編譯器產(chǎn)生謬誤的指令;
·Ada編譯器并不執(zhí)行通用的子表達(dá)式消除;
·編譯器由數(shù)值/結(jié)果通過參數(shù),即使對(duì)于大的陣列(而不是由參考值);
·編譯器總是采用非常慢的模塊間調(diào)用,即使當(dāng)不必要時(shí);
·指令以比特排列,因此,解碼速度慢;
·從字面上看,不允許一個(gè)以上的指令流;
·機(jī)器的程序調(diào)用效率極低一超過1000個(gè)時(shí)鐘周期,包括282個(gè)等待狀態(tài);相比之下,在那個(gè)時(shí)代的其它處理器采用不到100個(gè)時(shí)鐘周期。
因此,英特爾的432執(zhí)行通用的基準(zhǔn)比Vax 11/780要慢10-26倍,而比8MHz 8086要慢2-23倍。對(duì)于英特爾來說,幸運(yùn)的是,x86處理器以及用于IBM PC的接任者的演化取得了成功,從而讓英特爾的432完全消失,它已經(jīng)被當(dāng)今大多數(shù)的計(jì)算從業(yè)者所遺忘。
Java:最新注定要失敗的努力
針對(duì)特定處理器的最后劫掠一直就在當(dāng)今的嵌入式時(shí)代,利用由Sun、ARM以及其它供應(yīng)商設(shè)計(jì)的特殊硬件來執(zhí)行Java(Sun公司的pic0Java處理器以及ARM公司的Jazelle處理器等等)。這些針對(duì)Java的處理器鼓動(dòng)起一些興趣,但是,并未激發(fā)狂熱。在當(dāng)代的嵌入式世界中,設(shè)計(jì)工程師為了陳述Java應(yīng)用,在傳統(tǒng)的高性能處理器以及即時(shí)(JIT)編譯上解釋Java已經(jīng)被證明是更加引人興趣的路線。此外,在嵌入式處理器性能上的持續(xù)改善常常證明對(duì)于在嵌入式產(chǎn)品中的許多Java應(yīng)用來說是相當(dāng)足夠的,這些應(yīng)用主要是面向控制和用戶界面。如果針對(duì)特定語言的處理器路線通過四個(gè)計(jì)算時(shí)代已經(jīng)證明它自身就是最令人誤導(dǎo)的方法的話,對(duì)于那些希望利用硬件以超越通用目的處理器的方式加速語言、以及用那些語言編寫的應(yīng)用程序的人來說,有什么其它的選項(xiàng)是不受限制的?
要拋棄的第一個(gè)概念一定是“一切關(guān)于語言”這個(gè)概念。的確,對(duì)于數(shù)據(jù)處理加強(qiáng)的應(yīng)用來說,它更多的“一切關(guān)于”計(jì)算以及通信內(nèi)核和嵌入在程序中的算法。如果一個(gè)應(yīng)用程序涉及重復(fù)地執(zhí)行大矢量的標(biāo)量積,那么,對(duì)于不采用具有規(guī)模適當(dāng)?shù)挠布朔ㄆ骰蛘吒玫某朔ㄒ焕奂悠?MAC)單元的處理器來說,不論采用Fortran、Ada、C、Java、Basic或是COBOL編寫的程序來執(zhí)行這一應(yīng)用,其速度均會(huì)很慢。如果對(duì)于所采用的語言來說,處理器具有合適功能的單元和良好HLL編譯器(或解釋器),那么,以這些語言當(dāng)中的任何一種表達(dá)的算法應(yīng)該執(zhí)行得相當(dāng)快速,不論采用什么語言。
正是算法的特征一而不是語言的特征一被用于設(shè)計(jì)、修改或選擇正確的處理器。對(duì)于這一應(yīng)用,你或者可以搜尋一種具有乘法器或MAC單元的處理器(和或零開銷的循環(huán))—DSP可能是良好的選擇,或者—甚至更好的—你可以采用指令集擴(kuò)展以裁剪一個(gè)可配置的處理器內(nèi)核,使之更為精確地滿足應(yīng)用的性能和通信要求。在這種意義上說,搜尋一種針對(duì)特定HLL的計(jì)算機(jī)架構(gòu)現(xiàn)在可以由搜尋一種面向特定應(yīng)用的指令集處理器(ASIP)來取代。