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