處理器設(shè)計的謬誤(1)
在計算機(jī)發(fā)展的整個70年期間,曾經(jīng)出現(xiàn)了各種各樣的分立和嵌入式處理器種群,它們已經(jīng)進(jìn)化,并且有些種群已經(jīng)逐漸消失。從這一進(jìn)化中產(chǎn)生了許多新奇的設(shè)計。有些新奇的概念繼續(xù)生存,有些幾乎立即消亡,而一些概念僅僅存活了短暫的時間就銷聲匿跡了,但是,繼承他們基因的技術(shù)在后續(xù)的種群中再次出現(xiàn)。
本文引用地址:http://www.ex-cimer.com/article/89230.htm本系列深度分析文章將調(diào)查13種不成功的處理器種群。這些文章探索了造成每一個處理器種群死亡的主要設(shè)計錯誤。每一個主要設(shè)計錯誤還用一個或幾個例子來闡述。然而,隨著技術(shù)使得許多老的概念煥發(fā)新生、重塑輝煌并再次成為新概念而獲得無止境的重復(fù)利用,也許不知什么時候,勇猛的探索者/設(shè)計師將接下來遇見這些處理器種群當(dāng)中的哪一個呢?這些種群可能被當(dāng)成是恐龍:許多基于這些概念的處理器曾經(jīng)就是它們那個時代的優(yōu)勢種群,或者,已經(jīng)曾經(jīng)大放光芒并極其繁榮而引起了大量的關(guān)注。正是因為不斷進(jìn)化的世界造成了我們的處理器種群的必然演化甚至滅絕,但這并不意味著一個處理器種群在它存在的鼎盛時期不能合理地適應(yīng)世界。
錯誤1:設(shè)計高水平的計算機(jī)指令集架構(gòu)以支持特殊的語言或語言域(Myopisaur)。
從最早的計算時代起,人們不斷推動在抽象級解決編程問題,從接線板編程、撥動開關(guān)輸入、機(jī)器語言輸入、匯編語言到整個一大群“高級”編程語言(HLL),從上世紀(jì)50年代的Fortran和Cobol,乃至上下半葉研究出來的幾百或上千種編程語言。
HLL一被開發(fā)出來,人們就開始擔(dān)心用于捕獲編程問題的答案HLL描述與被在目標(biāo)機(jī)上執(zhí)行的由HLL編譯器產(chǎn)生的實際指令之間的語義差異。每一種編譯器常常產(chǎn)生不好的結(jié)果—有時候非常糟糕。即使現(xiàn)在,盡管編譯器的開發(fā)經(jīng)歷了50多年,但是,對于許多算法來說,最高技能的人類匯編語言編碼員所獲得的編譯結(jié)果的質(zhì)量,要比由最佳的HLL編程器與最佳的可用最優(yōu)化編譯器所產(chǎn)生的代碼高一個數(shù)量級(或一個數(shù)量級以上)。
計算機(jī)研究人員和商用計算機(jī)供應(yīng)商不可避免地開始研究根據(jù)特殊的HLL或語言種群調(diào)節(jié)一種特殊處理器的可行性,以期把處理器的指令集與語言的要求更為緊密地匹配起來,并縮小語義差異。其理論就是以那些目標(biāo)HLL編寫的程序應(yīng)該在這些經(jīng)調(diào)整的機(jī)器上更為高效地執(zhí)行。
一系列不合適的努力
為了實現(xiàn)這一方法—出現(xiàn)在從主機(jī)、微型機(jī)、分立微處理器IC到嵌入式處理器內(nèi)核—的幾十年經(jīng)驗以及努力,已經(jīng)再三地確定這種方法是一個重大架構(gòu)錯誤。的確,在Hennessy和Patterson關(guān)于計算機(jī)架構(gòu)的開創(chuàng)性圖書中可以發(fā)現(xiàn)這是典型的“謬誤和缺陷”之一[HEN, p. 142]。
這一方法存在的基本問題是多方面的:盡管已經(jīng)被調(diào)整為一種語言,但是,處理器可能(而且非??赡軐?被用于運(yùn)行于其它語言編寫的程序。經(jīng)調(diào)整的處理器將—因其針對特定語言的調(diào)整—在運(yùn)行采用這些其它HLL編寫的程序時效率比較低。
在較早時代,硬件資源很少被花費(fèi)在極少被采用的指令的有效執(zhí)行上—這是對昂貴的架構(gòu)資本的一種劣質(zhì)應(yīng)用。
因一種HLL構(gòu)造的一些非常特殊的應(yīng)用,針對特定語言的指令可能終止執(zhí)行,并且對于典型和最常見的應(yīng)用是沒有用的。因此,對這種指令的硬件本質(zhì)上是一種浪費(fèi)。
語言演化?;诠潭?、針對特殊HLL硬件的計算機(jī)架構(gòu)較之于語言本身趨向于在非常長的時間內(nèi)維持不變,因為軟件比硬件更加易于變化。
針對特殊HLL的處理器的流行被目標(biāo)HLL的普及而被無情地終結(jié)。在各種語言中的少數(shù)體驗造成一種處理器具有最少的市場訴求。
因此,這種架構(gòu)方法的缺陷花了很長時間才顯現(xiàn)出來。從上世紀(jì)60年代至80年代中期,在RISC架構(gòu)方法發(fā)源以前,基于復(fù)雜指令集計算機(jī)(CISC)、針對特殊HLL的計算機(jī)架構(gòu)激起了巨大的興趣。研究人員撰寫了幾百或上千的論文,關(guān)于這個課題的專題研討會和座談會相當(dāng)流行,而各個公司根據(jù)這一設(shè)計哲學(xué)向市場推出各種真實的機(jī)器。
E-mode意味著緩慢的模式
Burroughs公司的"E-mode"機(jī)可能是被設(shè)計為支持特殊語言的最著名的機(jī)器系列。這個系列包括從上世紀(jì)60年代初至90年代的B5000/6000/7000 和A-series機(jī)(一些兼容的處理器仍然在供貨)1。這些機(jī)器被設(shè)計為直接執(zhí)行Algol 60。這種計算機(jī)家族還具有許多其它重要的功能,包括基于堆棧的架構(gòu)、非平存儲器的利用、無匯編語言、操作系統(tǒng)和專用的管理子系統(tǒng)采用與Algol 60的直接對話編寫、并且采用的是48比特的存儲字(加上標(biāo)簽比特)。的確,在上世紀(jì)60年代和70年代期間,Burroughs幾乎成為了針對特殊HLL的計算機(jī)設(shè)計方法的偶像。
在這個時期,這家公司生產(chǎn)了中等規(guī)模和小型的針對Cobol的主機(jī)(B2000/3000/4000),以及一種被用于B1700/1800機(jī)的有趣的微碼架構(gòu),其中,包括一組可以被進(jìn)出交換以匹配不同語言的解釋指令集組。正如關(guān)于B5000的最熱心評論所說,Burroughs“專注于采用較高級的編程注釋以實際地排斥機(jī)器或匯編語言”[EAR]。
遺憾的是,Burroughs E-mode機(jī)因HLL機(jī)的若干缺點而受損。它們在標(biāo)準(zhǔn)科學(xué)和商務(wù)處理語言—FORTRAN和COBOL—上的表現(xiàn)肯定是缺乏活力的。后來,為這些機(jī)器構(gòu)建C編譯器以及把Unix引入它們的根本架構(gòu)上的嘗試被證明是困難的,因架構(gòu)的分層存儲結(jié)構(gòu)沒有小的部分。要嘗試把針對特定HLL的指令集擴(kuò)展至較低端的機(jī)器(包括由Burroughs的接任者Unisys在1989年推出的一種單芯片實現(xiàn)—稱為單芯片A系列主機(jī)處理器(SCAMP) [UNI])需要大量的微碼。遺憾的是,Algol 60從未真正以流行的編程語言起飛。這毫無疑問減少了Burroughs機(jī)的普及程度。
注釋:關(guān)于E-mode機(jī)—[ORG73]、[CHU-CAR]和[CHU-DOR]—有幾篇參考文選可用,這里僅僅給出了其中幾篇。
如上所述,Burroughs以面向B2000/3000/ 4000計算機(jī)的COBOL語言繼續(xù)它的針對特殊HLL的設(shè)計哲學(xué),它至少具有針對更為流行、鎖定商務(wù)的HLL的有點。
許多語言,同樣差的結(jié)果
針對特定HLL的處理器設(shè)計的吸引力,還導(dǎo)致人們開發(fā)直接運(yùn)行用APL [HAS]、Lisp [WHO]、Prolog [FAG]以及其它直接針對Basic、Fortran、Pascal、PL/I和Snobol [DIT80]編寫的程序的機(jī)器。的確,針對特定HLL的計算機(jī)架構(gòu)設(shè)計方法所存在的問題導(dǎo)致人們在1980年[DIT80]對它們進(jìn)行了深刻的反思,只是在CISC工作站出現(xiàn)之前、以及后來在上世紀(jì)80年代中期RISC處理器和工作站出現(xiàn)之時。
從主機(jī)時代向著小型和微型計算機(jī)時代的遷移,見證了上述針對特定HLL的計算機(jī)架構(gòu)設(shè)計方法以Burroughs B1700/1800獲得重復(fù)使用,它為若干語言提供了微碼指令集(COBOL、RPG以及其中的Fortran) [ORG77]和許多專用的工作站級機(jī)器。被設(shè)計來直接執(zhí)行LISP的機(jī)器就是一個特別著名的例子(LISP機(jī)、Symbolics)。
分立微處理器時代也看到了若干針對特定HLL的微處理器架構(gòu),包括:被設(shè)計來運(yùn)行Occam的Inmos Transputer;由貝爾實驗室設(shè)計的用于直接執(zhí)行C程序的CRISP處理器[DIT87a, DIT87b];在所有這類微處理器當(dāng)中,也許最為著名(或聲名狼藉)的就是英特爾公司的432,它被設(shè)計為運(yùn)行以Ada語言編寫的程序[GEH]。Transputer及其Occam描述了一種針對特定HLL的處理器的功能之一,有時候,它的開發(fā)者對于特殊的計算理論以信奉宗教般或準(zhǔn)宗教般的熱愛投入,從而以奴性的方式證明它自己對于一種編程語言的奉獻(xiàn),并盡力進(jìn)行實質(zhì)努力以開發(fā)一種支持它的機(jī)器。
盡管Transputer編譯器后來形成為更加傳統(tǒng)的HLL,但是,Transputer是以O(shè)ccam推出的,這是一種基于Tony Hoare的計算序列處理概念。Transputer就是特定為Occam構(gòu)建的。Inmos的領(lǐng)導(dǎo)人Iann Barron是Occam的最高牧師。Transputer的歷史描述了前面所列出的針對HLL的架構(gòu)所存在的問題之一。它的成功高度依賴于找到一個對Occam有足夠興趣的市場,以購買為它而設(shè)計的處理器,或者,對Transputer有足夠的興趣以采納它作為與眾不同的語言。這聽起來很像一次宗教對話。
英特爾公司的432被設(shè)計為執(zhí)行Ada,Ada在更為一般的意義上說是面向?qū)ο蟮恼Z言。英特爾公司的432可能代表針對特定HLL處理器的極端情況,它對任何語言均無法實現(xiàn)足夠的性能,包括用來設(shè)計它的Ada語言。實際上,英特爾公司的432微處理器整個冗長的故事一直遭受設(shè)計錯誤的折磨。在[GEH]中引證了一些設(shè)計錯誤,我們發(fā)現(xiàn)它們分別是:
—Ada編譯器產(chǎn)生謬誤的指令;
—Ada編譯器并不執(zhí)行通用的子表達(dá)式消除;
—編譯器由數(shù)值/結(jié)果通過參數(shù),即使對于大的陣列(而不是由參考值);
—編譯器總是采用非常慢的模塊間調(diào)用,即使當(dāng)不必要時;
—指令以比特排列,因此,解碼速度慢;
—從字面上看,不允許一個以上的指令流;
—機(jī)器的程序調(diào)用效率極低—超過1000個時鐘周期,包括282個等待狀態(tài);相比之下,在那個時代的其它處理器采用不到100個時鐘周期。
因此,英特爾的432執(zhí)行通用的基準(zhǔn)比Vax 11/780要慢10~26倍,而比8MHz 8086要慢2~23倍。對于英特爾來說,幸運(yùn)的是,x86處理器以及用于IBM PC的接任者的演化取得了成功,從而讓英特爾的432完全消失,它已經(jīng)被當(dāng)今大多數(shù)的計算從業(yè)者所遺忘。
Java: 最新注定要失敗的努力
針對特定處理器的最后劫掠一直就在當(dāng)今的嵌入式時代,利用由Sun、ARM以及其它供應(yīng)商設(shè)計的特殊硬件來執(zhí)行Java(Sun公司的picoJava處理器以及ARM公司的Jazelle處理器等等)。這些針對Java的處理器鼓動起一些興趣,但是,并未激發(fā)狂熱。在當(dāng)代的嵌入式世界中,設(shè)計工程師為了陳述Java應(yīng)用,在傳統(tǒng)的高性能處理器以及即時(JIT)編譯上解釋Java已經(jīng)被證明是更加引人興趣的路線。此外,在嵌入式處理器性能上的持續(xù)改善常常證明對于在嵌入式產(chǎn)品中的許多Java應(yīng)用來說是相當(dāng)足夠的,這些應(yīng)用主要是面向控制和用戶界面。如果針對特定語言的處理器路線通過四個計算時代已經(jīng)證明它自身就是最令人誤導(dǎo)的方法的話,對于那些希望利用硬件以超越通用目的處理器的方式加速語言、以及用那些語言編寫的應(yīng)用程序的人來說,有什么其它的選項是不受限制的?
要拋棄的第一個概念一定是“一切關(guān)于語言”這個概念。的確,對于數(shù)據(jù)處理加強(qiáng)的應(yīng)用來說,它更多的“一切關(guān)于”計算以及通信內(nèi)核和嵌入在程序中的算法。如果一個應(yīng)用程序涉及重復(fù)地執(zhí)行大矢量的標(biāo)量積,那么,對于不采用具有規(guī)模適當(dāng)?shù)挠布朔ㄆ骰蛘吒玫某朔?累加器(MAC)單元的處理器來說,不論采用Fortran、Ada、C、Java、Basic或是COBOL編寫的程序來執(zhí)行這一應(yīng)用,其速度均會很慢。如果對于所采用的語言來說,處理器具有合適功能的單元和良好HLL編譯器(或解釋器),那么,以這些語言當(dāng)中的任何一種表達(dá)的算法應(yīng)該執(zhí)行得相當(dāng)快速,不論采用什么語言。
正是算法的特征—而不是語言的特征—被用于設(shè)計、修改或選擇正確的處理器。對于這一應(yīng)用,你或者可以搜尋一種具有乘法器或MAC單元的處理器(和或零開銷的循環(huán))—DSP可能是良好的選擇,或者—甚至更好的—你可以采用指令集擴(kuò)展以裁剪一個可配置的處理器內(nèi)核,使之更為精確地滿足應(yīng)用的性能和通信要求。在這種意義上說,搜尋一種針對特定HLL的計算機(jī)架構(gòu)現(xiàn)在可以由搜尋一種面向特定應(yīng)用的指令集處理器(ASIP)來取代。
注釋*:本系列文章以“Processor Design: System-On-Chip Computing for ASICs and FPGAs, Jari Nurmi (editor), Springer, June 2007. ”一書的其中一章為基礎(chǔ)。
注釋1:作者之一Grant Martin為Burroughs工作。在這篇系列文章中一再采用E-mode機(jī)作為例子,可以被視為對令人感興趣的那個時代的有點懷舊和充滿深情的回憶。
參考文獻(xiàn):
[CHU] Yaohan Chu 編,High-Level Language Computer Architecture,Academic Press, 紐約, 1975
[CHU-CAR] 上述[CHU]的第三章,Carl R. Carlson, High-Level Language Computer Architecture
[CHU-DOR] 上述[CHU]的第四章,Robert W. Doran, Architecture of Stack Machines
[DIT80] David R. Ditzel和David A. Patterson, Retrospective on High-Level Language Computer Architecture, Proceedings of the 7th Annual Symposium on Computer Architecture, La Baule, 法國 (1980年6月), pp. 97104
[DIT87a] David R. Ditzel, Hubert R. McLellan和Alan D. Berenbaum, Design Tradeoffs to Support the C Programming Language in the CRISP Microprocessor, ASPLOS 1987, pp. 158163
[DIT87b] David R. Ditzel, Hubert R. McLellan和Alan D. Berenbaum, The Hardware Architecture of the CRISP Microprocessor, Proceedings of the 14th Annual International Symposium on Computer Architecture, Pittsburgh, Pennsylvania, 美國, 1987, pp. 309319
[EAR] E. Dean Earnest, Twenty years of Burroughs high-level language machines, Proceedings of the International Workshop on High-Level Language Computer Architecture, June 1980, pp. 6471
[FAG] Barry Fagin, Yale Patt, Vason Sirni, Alvin Despain, Compiling Prolog into Microcode: A Case Study Using the NCR/32-000, Proceedings of the 18th IEEE Microprogramming Workshop, 1985年12月
[GEH] Edward F. Gehringer and Robert P. Colwell, Fast Object-oriented procedure calls: lessons from the Intel 432, Proceedings of the 13th Annual International Symposium on Computer Architecture, 日本東京, 1986, pp. 92101
[HAS] A. Hassitt, J. W. Lageschulte和L.E. Lyon, Implementation of a High Level Language Machine, Communications of the ACM,1973年4月, Volume 16, Number 4, pp. 199212
[HEN] John L. Hennessy and David A. Patterson, Computer Architecture: A Quantitative Approach, 3rd edition (2003), Elsevier Morgan Kaufmann, 舊金山
[ORG73] E.I. Organick, Computer Systems Organization: The B5700/B6700 Series, Academic Press, 紐約, 1973
[ORG77] Elliott I. Organick, James A. Hinds, Architecture and Programming of the B1700/B1800 Series, North-Holland, 紐約, 1977.
[UNI] Reuters新聞, Unisys Introduces Micro A Computer, 1989年1月19日 URL:http://query.nytimes.com/gst/fullpage.html?res=950DE2DE113AF93AA25752C0A96F948260
[WHO] Skef Wholey和Scott F. Fahlman, The Design of an Instruction Set for Common Lisp, ACM Symposium on LISP and Functional Programming, 1984, pp. 150158
評論