處理器設計的謬誤—第二部分
摘要:本系列文章深度調查了各種失敗的處理器種群。每一篇文章探索了造成一種特殊的處理器種群消亡的重大設計錯誤。每一種重大的設計錯誤還用一個或兩個以上的例子來進行說明。
關鍵詞:處理器;設計;ISA;HLL;微碼
本文第一部分討論了支持特定語言或語言域的高級計算機指令集架構(ISA)的發(fā)展,并把那個種群稱為Myopisaur。本系列文章將來會討論其它的處理器種群以及跟那個種群相關的設計錯誤。
在那個年代所采用的一種主要方法就是實現(xiàn)針對HLL的處理器,正如在本系列文章第一部分所討論的那樣,就是把一個中間ISA裁剪為一種HLL,然后,采用或開發(fā)類似的處理器硬件以通過微編程來仿效經定義的ISA。在上世紀50年代,微碼首次被劍橋大學在EDSAC項目中由Maurice Wilkes實現(xiàn),人們最初開發(fā)它是為計算機控制邏輯而開發(fā)一種更為簡單的方法1。微碼由實現(xiàn)中間ISA的基本處理器指令序列組成。它或者由一些簡化的中間語言進行編譯,或者以匯編形式進行手工編寫。微匯編程序然后把匯編代碼轉換為可執(zhí)行代碼,這些可執(zhí)行代碼然后被存儲在片上本地存儲器或快速訪問、低延遲存儲器上。在上世紀70年代和80年代,設計工程師把微碼存儲在由分立存儲器芯片或存儲器模塊實現(xiàn)的外部存儲器上。在當今的IC集成水平上,處理器微碼幾乎總是存儲在片上RAM或ROM之上。
微碼盡管曾經獲得了普及應用,但是,本質上已經從現(xiàn)代的處理器設計消失了,因為片上可用硬件快速增加、硬件成本的關聯(lián)下降以及廣泛的采用邏輯綜合來進行芯片設計。所有這些發(fā)展使得ISA的直接硬件實現(xiàn)更加容易并且更加在經濟上有吸引力。
贊成采用微碼的案例
微碼提供的若干優(yōu)點:
·目標碼在一個家族之內與其它處理器兼容或與以前一代的處理器兼容;
—以各種價格-性能特性能夠創(chuàng)建一個家族的待構建的處理器。在該家族中的高端處理器實現(xiàn)中間ISA更為直接或者甚至通過多功能單元而加速它,以開發(fā)指令級并行化(ILP)。在該家族中的低端處理器把中間ISA映射至更為有限的硬件上,從而使得程序的執(zhí)行更慢但是也成本更低。
—在一個處理器家族中,能夠在多個處理器上把經編寫的編譯器用于中間ISA。從中間ISA至較低端機器的實際指令組的映射—具體包括在微碼中—可以獨立的層編寫,并可能避免采用編譯器,或者至少需要非常簡單的編譯器。進一步說,這樣的映射可能很少采用,因為中間ISA不會暴露給用戶,并且不必按照HLL可能演化的那種方式演化。一些語言編譯器目前采用中間語言形式(例如Pascal的P代碼或Java的虛擬機)以及一個兩步—或通過解釋或兩步編譯—的過程以產生最終的可執(zhí)行代碼;這個過程可以簡化對接并也能夠支持針對同一ISA的多個語言—即使不涉及微碼。
·通過采用多個ISA和多個微碼組,由微碼編寫的處理器能夠在運行時間上動態(tài)地適應不同的HLL,從而能夠針對以不同的語言編寫的程序實現(xiàn)更好的執(zhí)行性能。
·對于依賴于解釋器的各種語言,對適當的中間ISA的形式開發(fā)以及把那個中間ISA的微碼映射至目標ISA,能夠通過把它們的開發(fā)分為更加簡單的兩級(對于工程設計來說是一流的劃分和征服方法)而加快語言的可用性。如上所述,這可能對于在RISC上實現(xiàn)多語言支持也是一個策略,或者,對于把一個語言對接至多個處理器也是一個策略。
·正如上面所討論的,通過把實現(xiàn)一個語言編譯器的過程分為兩級,就有可能為一種新的目標機提供語言支持,較之于編寫特殊的目標編譯器更加快。
·利用一個中間ISA指令而不是兩個或兩個以上的目標ISA指令,代碼長度可以被減少。此外,通過從主存儲器減少指令抓取的數量可能改善性能。在這種情形下,中間ISA可能較之于固有的機器RISC ISA而創(chuàng)建一種CISC。
·對ISA僅僅部分支持而不是全部支持,可能簡化一種語言不常用部分的編譯器的編寫。對于支持ISA的新型處理器的硬件設計也可能在復雜性、設計努力以及項目風險上被減少,因此,采用經過很好測試的微碼實現(xiàn)的執(zhí)行來實現(xiàn)某些功能,可能較之于直接硬件實現(xiàn)來說是更好的替代方法。
·這一技術如果利用更多的現(xiàn)代處理技術的優(yōu)點可能會更好且時鐘速率更快,以提供對較老機器以及在更新的處理器上的指令集—對較老的ISA的一種虛擬化—的后向兼容性。下一步就是在軟件上完全執(zhí)行這個轉換,而完全不涉及任何微碼,這就需要各種技術改善以提供所需要的性能。這樣的改善可能包括較高頻率、邏輯、可能的多核以及更多的嵌入式存儲器。
反對采用微碼的案例
微碼還具有若干缺點:
·與具有較為簡單的ISA的機器相比,低端中間ISA機器的性能常常非常差,因為中間ISA機器的分層常常證明并不是最優(yōu)化地使用計算資源。
·與針對真實的目標機器能夠實現(xiàn)的根本簡單的ISA的編譯器相比,在中間ISA上生成代碼的編譯器無法做到同一程度的最優(yōu)化。對編譯的最優(yōu)化只能在兩個獨立的層面上完成。瞄準一個家族中直接實現(xiàn)中間ISA的高端處理器的HLL編譯器無法為該家族中的低端處理器進行最優(yōu)化,除非為它們做特別的修改,這樣會打消它們的一些優(yōu)點。
·為了滿足若干不同的語言的要求,一種針對若干不同ISA的機器可能結合不穩(wěn)定的設計折中,從而為所有的目標語言提供差的性能。
·微碼編譯器、翻譯器或生成器(把固定的中間ISA翻譯為根本的目標、簡單的ISA)可能極度簡單或者難以適應,因為它并不打算頻繁地運行。此外,微碼可能難以改變,特別是如果被存儲在ROM之中的話(當然一些機器在片上RAM存儲的部分微碼允許改變)。
中間ISA概念的一些領先的支持者把它們具體表達在Burroughs處理器中(如上所述),但是,在文獻中可以發(fā)現(xiàn)許多其它的努力,由多年來構建的許多不同的微可編程計算機的可用性來支持。Carlson2討論的一種微編程Fortran計算機代表了Fortran語言的接近直接實現(xiàn),并且僅僅需要一個簡單的翻譯器,此外,他還討論了一種微編程的EULER處理器(EULER是Algol 60的變種)。Hassitt、Lageschulte和Lyon3討論的APL機器就采用了微編程。
在上世紀80年代,F(xiàn)lynn4調查了許多架構方法,其中,包括微碼概念,并試圖定義直接執(zhí)行HLL的理想的語言機器。Moulton5研究了支持HLL編譯和執(zhí)行的微編程及其的一般設計。在用微編程支持的許多其它HLL當中(見前一節(jié)更多的討論)有LISP6和Prolog7??赡苷f明這一概念的最早代表就是Burroughs機器的B1700/1800系列,它支持面向Cobol、Fortran和RPG8的中間ISA。最近,我們已經看到這一方法的元素被用于解釋方法之中,如具有P代碼的Pascal和具有其虛擬機的Java;盡管具有足夠的動機來改善性能并且經過足夠的時間,但是,這些語言的固有編譯器仍然會出現(xiàn)。在任何情況下,這些方法可能不必要采用在現(xiàn)代處理器上的微碼。
過去殘留下來的概念
你可能會推想,上世紀80年代VLSI的出現(xiàn)已經縮減了微編程。的確,行業(yè)標準微處理器ISA的出現(xiàn),那些ISA的多個世代的實現(xiàn),以及利用現(xiàn)代IC制造工藝可用純晶體管數的增加,似乎已經減少了微碼方法的應用。然而,這一技術的幾個發(fā)育不全的殘跡已經在最近幾年浮出表面。例如,在上世紀80年代末,Unisys推出了所謂的單芯片A系列主機處理器(SCAMP)9,其中結合的相對低端的RISC處理器類似于該公司在小型、低端的A3和A4主機上采用的處理器,它里面采用的幾百K微碼就是沿用從上世紀50年代以來在最初的B5000出現(xiàn)時所采用的Burroughs "E-model"指令集。SCAMP被用于"Micro-A"計算機,在此,SCAMP芯片利用許多微碼ROM芯片被匯編至2英寸×2英寸的多芯片模塊之中。
這一方法的另一個有趣的遺跡以及這一問題的一個反例就是在從AMD K610開始的、現(xiàn)在的奔騰級處理器之中發(fā)現(xiàn)的問題。在這些處理器中,以前x86處理器世代的CISC指令利用RISC指令集實現(xiàn)。處理器的指令解碼單元把CISC指令分解為RISC操作,然后,匯編并把這些更為簡單的操作按組流出至處理器的并行執(zhí)行單元。它并不是嚴格的微碼,但是,它在一定程度上明顯從微碼而來。
這種設計方法還減輕了為更新的處理器創(chuàng)建新的CISC指令。它創(chuàng)建了一種混合CISC/RISC架構。顯然,微架構/微碼機器仍然具有一定的作用和位置,它隨著半導體技術和處理器架構的不斷演化而興衰。或許,這一蜥蜴類家族樹的遺跡將在當今更為敏捷的哺乳類機器上延續(xù)下去。
盡管依然存在一些中間ISA的殘留應用,如上所述,微碼已經證明在進化上走入了死胡同,因為它不如直接用硬件高效地執(zhí)行一個ISA。一旦硬件電路豐富,微碼的硬件效率就會由它的執(zhí)行低效而超越。在當今的處理器設計中,讓大量比較簡單的機器通過微碼仿效更為復雜的機器顯然應用不廣泛,盡管存在偶然的例外。新的編程語言常常最初通過比較簡單的中間表示法進行解釋,但是,如果該語言普及并且如果性能成問題,那么,不可避免地會出現(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/
評論