2017年6月16日 星期五

淺談古代CPU:副處理器的故事(1)

很久很久以前,有個「寸gate寸金」的時代,一顆IC如果有上萬個電晶體,會被冠上「 超大型積體電路( VLSI)」的神聖稱號;在那個時代之前,一台電腦是一個房間裡的一堆機櫃,「一個CPU」是一塊甚至好幾塊電路板,直到1971年,有家公司叫Intel,把很多元件都塞在一個有2300顆電晶體的IC裡面,做出了史上第一個微處理器4004。

在那個年代,能夠把基本的整數運算功能放到CPU晶片裡,已經是很了不起的成就,不過隨著微處理器的演進,很快的,有很多客戶希望這些新一代的微處理器為中心的系統,可以把本來是「大型電腦」才有的運算能力放進去,問題是,買微處理器的客戶中,有這種需求的可能只有一小部份,可是又不能為這一小部份把這些要耗費大量電晶體的電路做進去,畢竟一片晶片做好以後是沒辦法加裝的,所以唯一的方法,就是另外做一種專用的元件,但是這種元件不能自己獨立運作,必須配合一般的微處理器,這種元件稱為副處理器,不需要的客戶不用多花錢,需要副處理器的客戶可以另外花錢加裝,兩全其美。

首先被規劃做成副處理器功能的是浮點運算,這裡先簡單的解釋一下,所謂的浮點數是一種特別的數字表示法,用來在一定的資料長度內,表示出精確度有限,但是大小範圍很大的數字,在科學運算上常常被用到,在微處理器出現前,很多大型電腦都有浮點運算的能力,不過大家各自有其浮點表示方式;1976年,Intel發表8086之後,就著手設計一款可以跟8086/88搭配的浮點運算器,這個計劃的主持人John Palmer 提議將這顆浮點運算器的數字格式和運算規則公開出來變成一個標準,於是Intel聘請加州大學柏克萊分校的教授William Kahan 作為顧問,向IEEE提交了第一個浮點運算標準,就是現在的IEEE-754,William Kahan教授也因為對於浮點運算標準化的貢獻,得到1989年的Turing Award。

Prof. William "Velvel" Morton Kahan
IEEE-754背後的八卦頗為精采;一開始制定時,主要成員都是當時開始做微處理器的新秀,除了主角Intel以外,Zilog、Motorola也都趕快過來參一腳,另外還有一個做「小型電腦」的 迪吉多(Digital Equipment Corporation,簡稱DEC) ,但是當時幾家大型和超級電腦的巨頭,像是Cray、CDC,根本看不起這些小角色,所以缺席了;雖然草案是Intel提議的,但是當時擁有廣大電腦市場的DEC也不是省油的燈,也根據他們現有的VAX上的浮點運算機制提出了一套草案,兩方以及其他搖擺不定的小廠就這樣開始大亂鬥,從1977年一直吵到1981年,最後剩下一個主要的爭論焦點: Denormal number。

一個「正規」浮點數基本上分成三個部份,首先是1 bit的正負號,接下來兩個部份稱為指數和尾數,指數用來表示數字的大小範圍,尾數則是數字的精確度,如果這兩個欄位都是0,就是「絕對0」,指數部份如果全部是1,表示是無限大或者「不是數字」,其他狀況下,指數基本上最小就是1(0x01),問題來了,有時候計算時會出現這種情況:指數是0,後面尾數卻不是0,這種情況稱為underflow,其實意思是:運算出來的這個數字非常接近0,近到無法用正規的浮點數來表示,這時候該怎麼處理呢?DEC的方法是直接當作0,Intel則是提出了一個很麻煩的方案:把這類數字特別處理,讓它可以表示比正規浮數字更接近0的範圍,這樣的數字就稱為Denormal number。(underflow會有什麼麻煩呢?明明 A>B,但是 A-B卻是0,這樣了解嗎?)

32 bit 浮點數格式


DEC的方法稱為abrupt underflow,而Intel的提案稱為gradual underflow,當時大部份電腦其實都用DEC的方法,因為比較快,但是Intel這方覺得這樣讓0到最小非0浮點數之間的差距太大;雙方各持己見,最後是在1981年,DEC聘請一位馬里蘭大學的錯誤分析專家 G.W. (Pete) Stewart III 教授替他們的方案辯護,但是仔細研究後,Stewart教授認為gradual underflow是較好的方法,勸DEC放棄,爭論總算平息下來,於是在1985年,IEEE-754-1985正式通過,成為浮點運算標準,但是在此之前Intel其實就已經先偷跑, Intel在1980年發表了8087,1983年發表了配合286的80287,這兩款浮點運算器其實還不是完全符合IEEE-754,直到1987年的80387才是第一個真正完全符合IEEE-754-1985標準的浮點運算器。


沒有留言: