處理器設(shè)計(jì)的謬誤—第二部分
摘要:本系列文章深度調(diào)查了各種失敗的處理器種群。每一篇文章探索了造成一種特殊的處理器種群消亡的重大設(shè)計(jì)錯(cuò)誤。每一種重大的設(shè)計(jì)錯(cuò)誤還用一個(gè)或兩個(gè)以上的例子來進(jìn)行說明。
關(guān)鍵詞:處理器;設(shè)計(jì);ISA;HLL;微碼
本文第一部分討論了支持特定語言或語言域的高級(jí)計(jì)算機(jī)指令集架構(gòu)(ISA)的發(fā)展,并把那個(gè)種群稱為Myopisaur。本系列文章將來會(huì)討論其它的處理器種群以及跟那個(gè)種群相關(guān)的設(shè)計(jì)錯(cuò)誤。
在那個(gè)年代所采用的一種主要方法就是實(shí)現(xiàn)針對HLL的處理器,正如在本系列文章第一部分所討論的那樣,就是把一個(gè)中間ISA裁剪為一種HLL,然后,采用或開發(fā)類似的處理器硬件以通過微編程來仿效經(jīng)定義的ISA。在上世紀(jì)50年代,微碼首次被劍橋大學(xué)在EDSAC項(xiàng)目中由Maurice Wilkes實(shí)現(xiàn),人們最初開發(fā)它是為計(jì)算機(jī)控制邏輯而開發(fā)一種更為簡單的方法1。微碼由實(shí)現(xiàn)中間ISA的基本處理器指令序列組成。它或者由一些簡化的中間語言進(jìn)行編譯,或者以匯編形式進(jìn)行手工編寫。微匯編程序然后把匯編代碼轉(zhuǎn)換為可執(zhí)行代碼,這些可執(zhí)行代碼然后被存儲(chǔ)在片上本地存儲(chǔ)器或快速訪問、低延遲存儲(chǔ)器上。在上世紀(jì)70年代和80年代,設(shè)計(jì)工程師把微碼存儲(chǔ)在由分立存儲(chǔ)器芯片或存儲(chǔ)器模塊實(shí)現(xiàn)的外部存儲(chǔ)器上。在當(dāng)今的IC集成水平上,處理器微碼幾乎總是存儲(chǔ)在片上RAM或ROM之上。
微碼盡管曾經(jīng)獲得了普及應(yīng)用,但是,本質(zhì)上已經(jīng)從現(xiàn)代的處理器設(shè)計(jì)消失了,因?yàn)槠峡捎糜布焖僭黾?、硬件成本的關(guān)聯(lián)下降以及廣泛的采用邏輯綜合來進(jìn)行芯片設(shè)計(jì)。所有這些發(fā)展使得ISA的直接硬件實(shí)現(xiàn)更加容易并且更加在經(jīng)濟(jì)上有吸引力。
贊成采用微碼的案例
微碼提供的若干優(yōu)點(diǎn):
·目標(biāo)碼在一個(gè)家族之內(nèi)與其它處理器兼容或與以前一代的處理器兼容;
—以各種價(jià)格-性能特性能夠創(chuàng)建一個(gè)家族的待構(gòu)建的處理器。在該家族中的高端處理器實(shí)現(xiàn)中間ISA更為直接或者甚至通過多功能單元而加速它,以開發(fā)指令級(jí)并行化(ILP)。在該家族中的低端處理器把中間ISA映射至更為有限的硬件上,從而使得程序的執(zhí)行更慢但是也成本更低。
—在一個(gè)處理器家族中,能夠在多個(gè)處理器上把經(jīng)編寫的編譯器用于中間ISA。從中間ISA至較低端機(jī)器的實(shí)際指令組的映射—具體包括在微碼中—可以獨(dú)立的層編寫,并可能避免采用編譯器,或者至少需要非常簡單的編譯器。進(jìn)一步說,這樣的映射可能很少采用,因?yàn)橹虚gISA不會(huì)暴露給用戶,并且不必按照HLL可能演化的那種方式演化。一些語言編譯器目前采用中間語言形式(例如Pascal的P代碼或Java的虛擬機(jī))以及一個(gè)兩步—或通過解釋或兩步編譯—的過程以產(chǎn)生最終的可執(zhí)行代碼;這個(gè)過程可以簡化對接并也能夠支持針對同一ISA的多個(gè)語言—即使不涉及微碼。
·通過采用多個(gè)ISA和多個(gè)微碼組,由微碼編寫的處理器能夠在運(yùn)行時(shí)間上動(dòng)態(tài)地適應(yīng)不同的HLL,從而能夠針對以不同的語言編寫的程序?qū)崿F(xiàn)更好的執(zhí)行性能。
·對于依賴于解釋器的各種語言,對適當(dāng)?shù)闹虚gISA的形式開發(fā)以及把那個(gè)中間ISA的微碼映射至目標(biāo)ISA,能夠通過把它們的開發(fā)分為更加簡單的兩級(jí)(對于工程設(shè)計(jì)來說是一流的劃分和征服方法)而加快語言的可用性。如上所述,這可能對于在RISC上實(shí)現(xiàn)多語言支持也是一個(gè)策略,或者,對于把一個(gè)語言對接至多個(gè)處理器也是一個(gè)策略。
·正如上面所討論的,通過把實(shí)現(xiàn)一個(gè)語言編譯器的過程分為兩級(jí),就有可能為一種新的目標(biāo)機(jī)提供語言支持,較之于編寫特殊的目標(biāo)編譯器更加快。
·利用一個(gè)中間ISA指令而不是兩個(gè)或兩個(gè)以上的目標(biāo)ISA指令,代碼長度可以被減少。此外,通過從主存儲(chǔ)器減少指令抓取的數(shù)量可能改善性能。在這種情形下,中間ISA可能較之于固有的機(jī)器RISC ISA而創(chuàng)建一種CISC。
·對ISA僅僅部分支持而不是全部支持,可能簡化一種語言不常用部分的編譯器的編寫。對于支持ISA的新型處理器的硬件設(shè)計(jì)也可能在復(fù)雜性、設(shè)計(jì)努力以及項(xiàng)目風(fēng)險(xiǎn)上被減少,因此,采用經(jīng)過很好測試的微碼實(shí)現(xiàn)的執(zhí)行來實(shí)現(xiàn)某些功能,可能較之于直接硬件實(shí)現(xiàn)來說是更好的替代方法。
·這一技術(shù)如果利用更多的現(xiàn)代處理技術(shù)的優(yōu)點(diǎn)可能會(huì)更好且時(shí)鐘速率更快,以提供對較老機(jī)器以及在更新的處理器上的指令集—對較老的ISA的一種虛擬化—的后向兼容性。下一步就是在軟件上完全執(zhí)行這個(gè)轉(zhuǎn)換,而完全不涉及任何微碼,這就需要各種技術(shù)改善以提供所需要的性能。這樣的改善可能包括較高頻率、邏輯、可能的多核以及更多的嵌入式存儲(chǔ)器。
反對采用微碼的案例
微碼還具有若干缺點(diǎn):
·與具有較為簡單的ISA的機(jī)器相比,低端中間ISA機(jī)器的性能常常非常差,因?yàn)橹虚gISA機(jī)器的分層常常證明并不是最優(yōu)化地使用計(jì)算資源。
·與針對真實(shí)的目標(biāo)機(jī)器能夠?qū)崿F(xiàn)的根本簡單的ISA的編譯器相比,在中間ISA上生成代碼的編譯器無法做到同一程度的最優(yōu)化。對編譯的最優(yōu)化只能在兩個(gè)獨(dú)立的層面上完成。瞄準(zhǔn)一個(gè)家族中直接實(shí)現(xiàn)中間ISA的高端處理器的HLL編譯器無法為該家族中的低端處理器進(jìn)行最優(yōu)化,除非為它們做特別的修改,這樣會(huì)打消它們的一些優(yōu)點(diǎn)。
·為了滿足若干不同的語言的要求,一種針對若干不同ISA的機(jī)器可能結(jié)合不穩(wěn)定的設(shè)計(jì)折中,從而為所有的目標(biāo)語言提供差的性能。
·微碼編譯器、翻譯器或生成器(把固定的中間ISA翻譯為根本的目標(biāo)、簡單的ISA)可能極度簡單或者難以適應(yīng),因?yàn)樗⒉淮蛩泐l繁地運(yùn)行。此外,微碼可能難以改變,特別是如果被存儲(chǔ)在ROM之中的話(當(dāng)然一些機(jī)器在片上RAM存儲(chǔ)的部分微碼允許改變)。
中間ISA概念的一些領(lǐng)先的支持者把它們具體表達(dá)在Burroughs處理器中(如上所述),但是,在文獻(xiàn)中可以發(fā)現(xiàn)許多其它的努力,由多年來構(gòu)建的許多不同的微可編程計(jì)算機(jī)的可用性來支持。Carlson2討論的一種微編程Fortran計(jì)算機(jī)代表了Fortran語言的接近直接實(shí)現(xiàn),并且僅僅需要一個(gè)簡單的翻譯器,此外,他還討論了一種微編程的EULER處理器(EULER是Algol 60的變種)。Hassitt、Lageschulte和Lyon3討論的APL機(jī)器就采用了微編程。
在上世紀(jì)80年代,F(xiàn)lynn4調(diào)查了許多架構(gòu)方法,其中,包括微碼概念,并試圖定義直接執(zhí)行HLL的理想的語言機(jī)器。Moulton5研究了支持HLL編譯和執(zhí)行的微編程及其的一般設(shè)計(jì)。在用微編程支持的許多其它HLL當(dāng)中(見前一節(jié)更多的討論)有LISP6和Prolog7??赡苷f明這一概念的最早代表就是Burroughs機(jī)器的B1700/1800系列,它支持面向Cobol、Fortran和RPG8的中間ISA。最近,我們已經(jīng)看到這一方法的元素被用于解釋方法之中,如具有P代碼的Pascal和具有其虛擬機(jī)的Java;盡管具有足夠的動(dòng)機(jī)來改善性能并且經(jīng)過足夠的時(shí)間,但是,這些語言的固有編譯器仍然會(huì)出現(xiàn)。在任何情況下,這些方法可能不必要采用在現(xiàn)代處理器上的微碼。
過去殘留下來的概念
你可能會(huì)推想,上世紀(jì)80年代VLSI的出現(xiàn)已經(jīng)縮減了微編程。的確,行業(yè)標(biāo)準(zhǔn)微處理器ISA的出現(xiàn),那些ISA的多個(gè)世代的實(shí)現(xiàn),以及利用現(xiàn)代IC制造工藝可用純晶體管數(shù)的增加,似乎已經(jīng)減少了微碼方法的應(yīng)用。然而,這一技術(shù)的幾個(gè)發(fā)育不全的殘跡已經(jīng)在最近幾年浮出表面。例如,在上世紀(jì)80年代末,Unisys推出了所謂的單芯片A系列主機(jī)處理器(SCAMP)9,其中結(jié)合的相對低端的RISC處理器類似于該公司在小型、低端的A3和A4主機(jī)上采用的處理器,它里面采用的幾百K微碼就是沿用從上世紀(jì)50年代以來在最初的B5000出現(xiàn)時(shí)所采用的Burroughs "E-model"指令集。SCAMP被用于"Micro-A"計(jì)算機(jī),在此,SCAMP芯片利用許多微碼ROM芯片被匯編至2英寸×2英寸的多芯片模塊之中。
這一方法的另一個(gè)有趣的遺跡以及這一問題的一個(gè)反例就是在從AMD K610開始的、現(xiàn)在的奔騰級(jí)處理器之中發(fā)現(xiàn)的問題。在這些處理器中,以前x86處理器世代的CISC指令利用RISC指令集實(shí)現(xiàn)。處理器的指令解碼單元把CISC指令分解為RISC操作,然后,匯編并把這些更為簡單的操作按組流出至處理器的并行執(zhí)行單元。它并不是嚴(yán)格的微碼,但是,它在一定程度上明顯從微碼而來。
這種設(shè)計(jì)方法還減輕了為更新的處理器創(chuàng)建新的CISC指令。它創(chuàng)建了一種混合CISC/RISC架構(gòu)。顯然,微架構(gòu)/微碼機(jī)器仍然具有一定的作用和位置,它隨著半導(dǎo)體技術(shù)和處理器架構(gòu)的不斷演化而興衰?;蛟S,這一蜥蜴類家族樹的遺跡將在當(dāng)今更為敏捷的哺乳類機(jī)器上延續(xù)下去。
盡管依然存在一些中間ISA的殘留應(yīng)用,如上所述,微碼已經(jīng)證明在進(jìn)化上走入了死胡同,因?yàn)樗蝗缰苯佑糜布咝У貓?zhí)行一個(gè)ISA。一旦硬件電路豐富,微碼的硬件效率就會(huì)由它的執(zhí)行低效而超越。在當(dāng)今的處理器設(shè)計(jì)中,讓大量比較簡單的機(jī)器通過微碼仿效更為復(fù)雜的機(jī)器顯然應(yīng)用不廣泛,盡管存在偶然的例外。新的編程語言常常最初通過比較簡單的中間表示法進(jìn)行解釋,但是,如果該語言普及并且如果性能成問題,那么,不可避免地會(huì)出現(xiàn)針對“裸金屬”處理器的有效的編譯器,因此,仍然需要采用微編程。(本文譯自《微處理器報(bào)告》)
參考文獻(xiàn):
1. Jari Nurmi編, Processor Design: System-On-Chip Computing for ASICs and FPGAs, ,Springer, June 2007
2. M.V. Wilkes和J. B. Stringer, Microprogramming and the Design of the Control Circuits in an Electronic Digital Computer, Proc. Cambridge Phil. Soc 49 (pt. 2), April 1953, pp. 230–238
3. Yaohan Chu 編,High-Level Language Computer Architecture第三章,New York, 1975. Carl R. Carlson, A survey of high-level language computer architecture.
4. A. Hassitt, J. W. Lageschulte和L.E. Lyon, Implementation of a High Level Language Machine, Communications of the ACM, April 1973, Volume 16, Number 4, pp. 199–212
5. Michael J. Flynn, Directions and Issues in Architecture and Language, IEEE Computer, October 1980, pp. 5–22.
6. Peter Moulton, Microprogrammed subprocessors for compilation and execution of high-level languages, 7th annual workshop on Microprogramming, Palo Alto, California, United States, 1974, pp. 74–79.
7. Skef Wholey和Scott F. Fahlman, The Design of an Instruction Set for Common Lisp, ACM Symposium on LISP and Functional Programming, 1984, pp. 150–158
8. 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, December 1985
9. Elliott I. Organick和James A. Hinds, Architecture and Programming of the B1700/B1800 Series, North-Holland, New York, 1977
10. Reuters press release, "Unisys Introduces Micro A Computer", January 19, 1989. http://query.nytimes.com/gst/fullpage.html?res=950DE2DE113AF93AA25752C0A96F948260
11. Tom Halfhill, AMD K6 Takes On Intel P6, BYTE, January 1996. http://www.byte.com/art/9601/sec7/art1.htm/
評論