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