1976 年,迪斯科還大行其道,冷戰(zhàn)正處于高潮,而我要到 9 年之后才出生。那年,正是 Cray-1 在計算機領域大顯身手之際,個人計算當時還處于發(fā)展的初期(MITS Altair 一年前剛剛推出),同時 Control Data 和 IBM 等公司統(tǒng)領高端市場。Cray-1 是人們印象中用于定義“超級計算機”的傳奇機器之一。其采用獨特的 C 型結構,運行速度高達驚人的 80 MHz,桌面電腦直到 20 年之后才能達到這樣的速度。Cray 速度快,也極富吸引力。 現(xiàn)在,讓我們把時間快進到 33 年后,那是 2009 年初的一個清晨,我起床后也想擁有一臺 Cray 超級計算機。 我首先要回顧一下基于 FPGA 的復古計算機技術。我 2007 年 12 月從南加州大學畢業(yè)并獲得 BSEE 學位,當時我把它稱作“計算機招魂術”。作為新生代電子工程師,我對神秘的計算機架構特別感興趣,覺得正好可以借此提高我的 Verilog 水平。我畢業(yè)時為自己買了一套 Digilent 公司的 Spartan®-3E 1200 開發(fā)板當禮物。我的第一臺計算機則是 1980 年代的老古董 NonVon-1。它屬于首批“大型并行”機之一,類似于同樣古老但更為成功的 Connection Machine 系列(不過主要用于數據庫)。這是一臺非常有趣的設備,采用 8 位處理器的二進制樹狀結構(帶 1 位 ALU)。 Cray-1 是人們印象中用于定義“超級計算機”的傳奇機器之一。其采用獨特的 C 型結構,運行速度高達驚人的 80 MHz,桌面電腦直到 20 年之后才能達到這樣的速度。 經過幾個月的折騰,我總算造出了一臺 31 節(jié)點的超級計算機,不過其計算能力還比不上現(xiàn)今任何一塊手表。雖然這東西沒什么用處,卻讓我明白了摩爾定律的巨大作用,也激發(fā)我進一步動手的欲望。 首臺 NonVon-1 獲得成功后,我又開始尋找新的項目(我的 Verilog 技能仍比較欠缺)。我認識到,低端 FPGA 已經能夠處理一些比較高級的硬件了,目前甚至 32 位軟處理器都比較常見了。我努力尋找一個能煥發(fā)新生的新目標,也考慮了不少選擇,包括 UNIVAC 這臺有趣的設備,不過它確實有點太老了。 Digital Equipment 公司的 PDP 系列已經被硬件仿真過。Z80 設備的軟件仿真器也非常常見。因此,我想到了 Cray。 Cray-1 是什么? Cray-1 是 Seymour Cray 于 20 世紀 70 年代初離開 Control Data 后所成立新公司 Cray Research 推出的首臺設備。當時該設備計算能力強大,需要占用整個房間來放置計算機和磁盤才能保證數據接收。此外,它還擁有一個全職工程師團隊來確保正常運行,甚至還需要自備發(fā)電設備才能確保加電啟動。該設備重新定義了當時的“超級計算機”(畢竟這是 Cray),而且幸運的是它的設計美妙而簡單,相關資料也非常齊備(圖 1 所示)。Cray-1 硬件參考手冊(在因特網上很容易找到)非常詳細,現(xiàn)在的用戶往往只能拿到黑盒子,看到這么詳細的說明肯定會感到震驚。幾乎所有運算代碼、寄存器及時序圖都得到了妥善而詳盡的保留。 這臺計算機本身是一款64 位流水線處理器,順序指令發(fā)送,只有 128 條獨特指令。它采用類似 RISC 的指令集,所有指令都既可在存儲器和寄存器(加載或存儲指令)之間,也可在兩個操作數寄存器和一個目的地寄存器之間(全部算術/邏輯指令)。指令為 16 位或 32 位長。該設備使用三種不同類型的寄存器:地址、標量和矢量寄存器。地址寄存器為 24 位寬,并能夠讓設備對高達 4 Megaword (32 MB) 的主存儲器進行尋址。標量寄存器為 64 位寬,用于計算。每個矢量寄存器包括 64 個 64 位寄存器,從而能夠在進行大矩陣科學計算時確保出色的性能。 ![]() 圖 1 — 讓計算機愛好者感到幸運的是,Cray 的架構設計美妙而簡單,而且相關資料保存完好。 在 CPU 中,指令可發(fā)送給 13 個獨立的全流水線“功能單元”。高強度的流水線功能對實現(xiàn) Cray 當時極高的 80MHz 時鐘頻率而言至關重要。不同的功能單元處理邏輯操作、移位、乘法等。比方說,一個浮點乘法指令需要 7 個周期才能完成,但計算機每個周期都能發(fā)出一條新的乘法指令(假定不存在寄存器沖突)。該設計會產生一種有趣的情況,即沒有“除法”指令,而是采用倒數近似值除法。也就是說,我們不是計算 X / Y,而是計算 (1 / Y) * X。單獨的浮點“倒數近似值”函數單元可在 14 個時鐘周期內計算出倒數。 馬拉松 我剛開始著手這一項目時,并不完全確定是否能靠自己的力量重新構建如此復雜的計算設備。原始的 Cray-1 花了整個工作團隊多年的時間才設計和構建完成。我有無足夠的決心做下去呢?(結果是我確實做下去了。)我的 FPGA 能否真的滿足要求?(結果是不能滿足。)即便設計比較簡單而直接,但設計規(guī)模仍然較大(目前需要約 5,600 行 Verilog 代碼,而且數量還在不斷增多)。我必須要保持信念。構建自己的超級計算機是一場馬拉松,而不是一場沖刺賽。我只能一步步穩(wěn)扎穩(wěn)打地前進。 我開始逐一創(chuàng)建功能單元。就像改裝汽車一樣,構建完整的計算機也必須熟悉設計的各個方面,這是一種全新的體驗。我探索乘法器和加法器設計。我重新打開教科書研究浮點算法。我學習如何使用 Newton Raphson 法三次迭代計算 30 位精度的倒數近似值。(我前面提到過硬件參考手冊的詳細度吧?) 功能單元逐一成型。這完全是一項業(yè)余時間的項目,因此項目只能一點點地慢慢推進。我從最簡單的模塊開始,很輕松地就完成了兩個地址功能單元(一個簡單的加法器和一個乘法器)。進入標量函數單元時(一個加法器、一個邏輯單元、一個移位器和一個總體 (population)/前導零計數 (leading zero count)),進度就放緩了。處理三個浮點函數單元(一個加法器、一個乘法器和麻煩的倒數近似值單元)時,我已經感到動力不足了。如前所述,這就是一場馬拉松,不是一場沖刺賽。我 2009 年初開始著手 Cray-1 項目,可能在這個項目上總共花了 19 到 20 個月的時間。 隨后我的工作進度再度加快,開始接近浮點單元設計的尾聲,在矢量單元方面的推進速度也開始加快。如前所述,Cray-1 設計作為一款具有高計算強度的巨型機,擁有 8 個矢量寄存器,每個都包含 64 個 64位寄存器。矢量指令執(zhí)行時,比方說進行加法計算,每個運算對象錄入后每個周期都添加并存儲在第三個矢量上(結果矢量)。 Cray-1 支持一個出色的特性,即“矢量鏈”。比方說,矢量加法單元只需三個周期即能生成首個結果。如果我們將兩個含有 64 個條目的矢量相加,我們希望在所有 64 個條目都完成加法計算前就可以對結果進行操作。矢量鏈使我們能夠將加法器單元的結果直接“鏈接”到另一個單元的輸入,不必等待操作結束。我們可在獲得首個結果的兩個周期后讓結果與第三個矢量相乘。對于一些大型矩陣計算而言,在 80 MHz 頻率上我們幾乎可以保持每個時鐘周期兩次浮點操作,也就是峰值速率達 160 MFLOPS!直到 20 世紀 90 年代中期,普通臺式電腦還不及 Cray-1 的水平。 有了功能單元,我已經能看到長夜將近的黎明曙光了。顯然,只需添加一些膠合邏輯就差不多完工了。是的,確實接近完工了。不過我發(fā)現(xiàn),膠合邏輯的工作量其實很大。盡管 Cray-1 的相關存檔非常齊備,但齊備的程度還不夠。我非常清楚,我在一些不大不小細節(jié)的逆向工程方面遇到了困難,如指令發(fā)布、冒險檢測以及矢量鏈等。有些問題,比如較寬的 64 位數據總線可用分立式邏輯芯片更方便地解決,而不必使用面向較窄數據路徑的FPGA。矢量寄存器在布線時總是讓我頭疼。 此外,我還要修改一些特性。Cray-1 采用 16 組全 SRAM 存儲器系統(tǒng),體積跟我的冰箱差不多大,其 4 Megaword 存儲器可實現(xiàn)每秒 640MB 的帶寬,我開發(fā)工具套件所用的簡陋的 DDR 存儲器芯片肯定達不到這樣的性能。我使用幾乎所有的 FPGA 片上 BRAM 也只能獲得 4 kiloword 的存儲器空間,這是我的 Cray 目前面臨的最大瓶頸。而且我也必須忽略掉一些特性:用于與磁盤驅動器和“主機式”微型計算機進行通信的 DMA 類 I/O 通道和快速上下文切換支持。我要是能找到設備可用的存儲器和相關軟件,或許可以再添加進這些特性。 硬件障礙 我在此簡要介紹一下在設計過程中遇到的一些與 FPGA 相關的難題。首先,我最初的 Spartan-3E 1200 芯片已經證明不能滿足要求。我在設計中添加了 Cray 的龐大矢量寄存器后,芯片有限的邏輯資源就不夠用了。這時我開始有些犯憷,因為這時我的項目已經推進了 1 年多時間了,而且較大型 FPGA 的價格看似貴了很多。更大的 Virtex® 芯片能方便地滿足我的設計要求,但開發(fā)板的成本已經超出了我?guī)啄昱d趣愛好所能承受的預算范疇。幸運的是,Digilent 還出售了一款稍大型的 Spartan-3E 1600 開發(fā)板,價格對業(yè)余愛好者來說還能承擔。實踐證明,這塊開發(fā)板對滿足整個系統(tǒng)要求已經足夠了(顯著擴展了我所使用 BRAM 的容量)。 我遇到的另一個問題就是速度問題。盡管摩爾定律發(fā)展了 30 多年,但 Cray-1 原始的80MHz 設計對我可憐的 Spartan-3E 而言還是太高了。我的原始設計最高速度大約為 33 MHz,關鍵路徑在級聯(lián)加法器中,那是用在我簡陋的浮點乘法器實施方案中的。幸運的是,Spartan-3E 配套提供眾多 18 位硬件乘法器,能夠將速度提升到近 50 MHz(面積卻節(jié)省了 5%),但這時設計的其它部分又遇到了麻煩。Cray-1 具有大量 64 位數據路徑,以及復雜的指令發(fā)布邏輯,這將 Spartan-3E 上的周期時間限制在 20 納秒左右。目前我還算滿意,而且較新的 Spartan-6 芯片將能滿足 8-0 的水平要求。 外殼構造 硬件已經基本可以正常工作了,我開始投入一項有趣的工作,進行外殼構造。當然,電路設計是所有工程師都感興趣的部分,不過我也要讓自己的 Cray-1 看上去像個 Cray-1 的樣子,這同樣有趣。打造外殼的工作正好也讓我的朋友 Pat 能試試他的新型 CNC 銑床。我去了幾趟 Home Depot,在 Pat 的車庫里度過了一個繁忙的周六(見圖 2),總算獲得了一個很像小型 Cray 的外殼。開發(fā)板為方形,我必須在基座方面多些創(chuàng)意(方形和 C 形不太搭配),不過該板尺寸很小,也就是說我設計的 Cray-1 的尺寸正好是正常 Cray-1 的十分之一。 我接下來又花了幾周的時間去打磨、噴漆和拋光,最后還去了趟當地的織物店,以讓我的小型 Cray-1也跟原型機一樣有了特色化的內置仿皮座了,這樣 Mattel 的新計算機工程師芭比娃娃終于有個地方歇腳了! ![]() 圖 2 — 把標志性的 C 型外殼做好還真要花些功夫,當然也少不了老友的鼎力相助。 軟件 CPU 基本可以正常工作了,外殼也已經就位,我準備宣布勝利了。我能夠毫無問題地執(zhí)行一些簡單的指令回環(huán)和程序。不過能不能使用真正的軟件呢?我全新的 Cray-1 有一大遺憾,就是完全缺乏軟件,而且沒有軟件的計算機著實沒什么價值。不幸的是,Cray-1 就誕生在一個沒有因特網的時代,主要出售給一些聽起來冠冕堂皇的政府機構。我花了幾個月的時間在因特網上尋找軟件,但還是一無所獲。我給一些在國家實驗室工作的朋友發(fā)了電子郵件,甚至還根據信息自由法案 (Freedom of Information Act) 向國家核安全機構(此處是指政府嚴密監(jiān)察的名單)發(fā)函,但還是一無所獲。 感到自己確實需要更多幫助,我最終決定在互聯(lián)網上求助。我在自己網站的 micro-Cray 頁面上發(fā)出了求助呼吁(同時展示我可愛的比例僅為正常 Cray-1 十分之一的外殼),而且還通過 Twitter 賬戶向一些朋友介紹該項目,通過因特網資源尋找?guī)椭。幾天之后,一些新聞站點都得知了我的故事,從全球各地給我發(fā)來大量電子郵件。不少電子郵件都是同情我經歷的Cray愛好者發(fā)來的懷舊信。然而,最終有人表示有大摞大摞紙質版的幾十年前的源代碼,九軌磁帶,甚至還有微縮膠片。有人還發(fā)電子郵件給我提供一份 20 年前的博士論文,包括一種少見的編程語言的Cray 兼容編譯器的源代碼(當然,需要在同樣少見的編程語言中編寫)?磥砣藗儽4孢^時軟件和文檔以備今后之需,還真能應不時之需啊。 未來 我的縮微版大型機今后該怎么辦呢(圖 3)?我還想解決這臺設備的一些故障并添加缺失的特性。我還沒有完全解決軟件問題,不過情況已經有所改觀。一位熱心網友找到了 20 世紀 80 年代末基于 DOS 的 Cray 仿真器,它同時也可作為簡單的匯編程序(在 Windows 7 中也能正常運行)。相比直接使用 8 位機器碼,用 Cray 匯編語言編程簡直是一個夢想。如果我能讀取老式介質,我或許就能獲得源代碼,運行至少一種操作系統(tǒng),并使用真正的 Fortran 編譯器。 另外,我的冷門愛好還引發(fā)了計算機歷史博物館 (http://www.computerhistory.org/) 的興趣,或許我的微縮版 Cray 有朝一日會歸隱于加利福尼亞的山景城。不過同時我也開始設想下一個項目了。 ![]() 圖 3 — 基于 Spartan-3E 的微縮版大型機的最終成型圖 |