1月13日晨會。
陳茂林、汪涵、呂辰、秦無功四人圍著長條桌坐下,面前各放著一杯熱茶。牆上的介面對照表已經打了將近三分之一。電源和儲存兩列幾乎全綠,像是兩塊整齊的麥田。
“第三輪,I/O機櫃。”陳茂林用手指點著黑板上那條時間線,“兩臺滿配,通訊協議棧、中斷處理、DMA驅動。目標是中斷響應延遲小於10微秒,外設聯調成功。”
汪涵翻開本子:“I/O通訊協議棧還有兩個bug,昨天晚上已經改完了。DMA驅動今天上午能在模擬臺上跑通。”
“那就上架。”陳茂林說。
I/O機櫃比儲存機櫃淺一些,標準深度350毫米。兩臺機櫃被叉車推進機房,靠在最右側的位置。
宇文坤德開始上架抽屜。I/O抽屜的種類比儲存多得多,有通訊介面抽屜、通道控制器抽屜、DMA抽屜、外設介面卡抽屜,一共十幾個型號。他一邊推一邊在本子上記編號,每推一個就打一個勾。
中午十二點,兩臺I/O機櫃全部上架完畢。
汪涵親自載入I/O微程式包。終端機咔嗒咔嗒地響了十幾分鍾,螢幕上終於跳出一行字:
I/O MICROCODE LOADED. 87 CHANNEL CONTROLLER ONLINE. DMA ONLINE.
“驅動載入成功。”汪涵說。
“測中斷響應。”呂辰說。
這是I/O子系統的核心指標。外部裝置發起中斷請求,到主控核心響應並跳轉到中斷服務程式,這段時間不能超過10微秒。
錢蘭用訊號發生器模擬外部中斷,示波器的探頭夾在主控核心的中斷響應引腳上。
波形跳出來。
吳國華盯著螢幕:“從中斷請求到響應,大約15微秒。”
超過指標。
陳茂林的眉頭皺了一下。
汪涵走到終端前,調出中斷響應的微程式清單,一行一行地看。看了大約五分鐘,他的手指停在其中一行上。
“這裡。”他用鉛筆點著螢幕,“中斷響應路徑中,微程式做了一次多餘的暫存器備份。這是為了通用性設計的,但加在中斷路徑裡太耗時間。”
他刪除了那三個微指令,重新編譯、載入。
再測。
示波器螢幕上的時間標尺縮短了將近一半。
吳國華讀資料:“8微秒。達標。”
呂辰在筆記本上記了一筆。
汪涵沒說話,把修改後的微程式清單簽了字,遞給衛知南歸入《功能微程式包V1.0》。
外設聯調是第三輪最有視覺衝擊力的環節。
第一個接上的是讀卡機。
吳國華把一張刻著“HELLO KUNLUN”的二維卡塞進讀卡槽,讀卡機開始咔嗒咔嗒地響。
終端機上,螢幕跳出了那行字:
HELLO KUNLUN
汪涵盯著那行字看了兩秒,嘴角微微動了一下。
第二個接上的是顯示器。
那是崑崙-0機上已經驗證過的字元顯示器,能顯示24行80列英文字元和數字。
顯示控制晶片是呂辰他們設計的,現在已經第二版了,顯示更穩定。
他敲了一行命令,螢幕上跳出一個游標。再敲了幾個字母,螢幕上顯示出“KUNLUN-1 I/O TEST”。
第三個接上的是鍵盤。
陳茂林親自走到鍵盤前面,伸出食指,一個鍵一個鍵地敲:1 + 1 =
顯示器上出現了“2”。
他沒說話,又敲 * 1024 =
顯示器上出現了“”。
他退後一步,看著那個數字:“鍵盤能用。”
故障注入升級版在這一輪正式亮相。
鄭長楓從工具箱裡拿出一個小盒子,開啟,裡面是一塊自制的“故障注入板”,幾根導線、幾個電阻、一個訊號發生器,焊在一塊萬用板上。
他把這塊小板子串聯在I/O匯流排上,然後擰動了訊號發生器的頻率旋鈕。
匯流排上開始出現偶發的位翻轉:資料線上的某個位元,在極短的時間內從0變成1,又從1跳回來。
螢幕上的字元開始出現亂碼,但很快恢復了正常。
汪涵盯著終端機的輸出日誌,看了幾秒:“ECC糾正了。記錄在這裡——匯流排位翻轉,地址0x3F2A,檢測到一位錯誤,已糾正。”
他在筆記本上記下了時間和故障型別。
第二個故障更復雜。
錢蘭取出一塊燒錄好的只讀儲存器晶片,換下了微程式中的某一塊。
新晶片裡,有一條微程式指令被人為跳過了,地址0x1F8處的指令被改成了空操作。
系統執行了大約兩分鐘後,診斷系統報出了警告:
INSTRUCTION CHECKSUM ERROR AT 0x1F8. EXPECTED 0x7E, GOT 0x00.
MICROCODE MODULE 23 RESET.
診斷系統不僅發現了異常,還自動復位了出錯的那個微程式模組,系統沒有崩潰。
汪涵站了起來,走到機櫃前面,看著數碼管上顯示的錯誤程式碼。
他看了很久,然後轉過身,看著鄭長楓。
“這個故障注入板,做一套標準版的。發給所有測試組。”
鄭長楓點了點頭。
呂辰在本子上記下了這輪故障注入的所有資料和對應的微程式診斷邏輯。
這些東西,將來都會進入故障模式庫。
跨子系統協同,I/O+主控。
錢蘭在鍵盤上敲了一行命令,觸發了一個外部中斷。
中斷訊號透過I/O通道控制器傳遞給主控核心,主控核心響應中斷,呼叫已經上架的運算板,做一次浮點加法,結果透過I/O輸出到顯示器。
整個過程不到2毫秒。
顯示器上出現了“3. + 2. = 5.”。
呂辰站在顯示器前面:“I/O通了。第三輪完成。”
秦無功拿著綠色記號筆走到介面對照表前,在“I/O子系統”那一列下面,一口氣打了九個勾。
打完最後一個,他退後兩步,看了看整張表。
電源、儲存、I/O,三列幾乎全綠。
還剩下最大的兩列,運算和主控。
1月16日下午,陳茂林在機房門口貼了一張紙:“第三輪完成,1月17日上午第四輪啟動。”
1月17日,天氣陰沉,預報說要下雪。
第四輪是最大的一輪,21臺運算機櫃加第二臺主控機櫃,要佔滿機房的剩餘全部空間。
早上七點,運輸隊開始運送抽屜。
一車一車的抽屜從貨箱裡卸下來,一個一個地推進機房。
21臺運算機櫃,每臺6個抽屜,一共126個抽屜,加上第二臺主控機櫃的9個抽屜,135個抽屜,每一個都要推到位、鎖緊、確認。
一直到深夜12點,最後一個抽屜推完的時候,呂辰手指都在發抖。
他用力甩了甩手,從兜裡掏出煙,點了一根,深深地吸了一口。
檢測完成,已經是第三天下午。
“上電!”
21臺運算機櫃的開關被依次推上。
電磁接觸器的“嘭嘭”聲像一場急促的鼓點,從機房的這頭傳到那頭。
綠色的指示燈一排一排地亮起來,最後連成一片,把整面牆照得通亮。
吳國華站在機房中間,轉了一圈,看著那些指示燈。他沒說話,但他的嘴唇在微微發抖。
汪涵在終端上敲了一行命令:
STATUS ALL
螢幕上開始滾動每臺機櫃的狀態:
UNIT 01 ONLINE.
UNIT 02 ONLINE.
...
UNIT 21 ONLINE.
MASTER UNIT 01 ONLINE.
MASTER UNIT 02 ONLINE.
最後一行:
ALL 23 UNITS ONLINE. MICROCODE LOADED. READY.
第四輪的第一個硬指標:加速比。
單機櫃內多運算板並行跑矩陣乘法。
汪涵選了一個1024×1024的矩陣乘法。
先測單塊運算板的時間。
錢蘭敲了命令,運算板開始計算。
終端機上跳出一個計時器,二十幾秒後顯示結果:“23.4秒。”
然後測全機櫃21塊運算板並行。汪涵載入了任務排程微程式,把矩陣拆分成21個區塊,分配給21塊運算板同時計算。
終端機上的計時器重新開始,數字跳動得比剛才快得多。
“秒。”吳國華讀出資料。
加速比:23.4除以,約倍。
陳茂林的聲音從身後傳來:“再測一次。”
又測了一次。倍。
再測一次。倍。
三次平均超過11.8倍,略優於設計指標的11倍。
理想情況下,21個單元並行,任務平均分配、無通訊開銷,崑崙1的加速比應當是21倍。
但這是不可能的,因為還存在通訊開銷、匯流排競爭、負載不均等損耗。
雙核心冗餘測試緊隨其後。
兩臺主控機櫃,一臺是主核心,一臺是輔核心。兩臺機器跑著同樣的微程式,結果實時比對。
呂辰走到陳茂林面前:“陳工,請您下令‘模擬主核心故障’。”
陳茂林看了他一眼,走到主控機櫃前面,伸出手,按住了第一臺機櫃的電源開關。
“嘭”的一聲,第一臺主控機櫃斷電了。所有指示燈瞬間熄滅。
幾乎在同一瞬間,第二臺主控機櫃的黃色“接管”指示燈亮了,綠色的“執行”燈沒有滅。
終端機螢幕上的任務輸出沒有中斷,連游標都沒有閃爍一下。
示波器捕捉到了切換的時間波形。
吳國華看著螢幕:“切換時間約0.7毫秒,在1毫秒以內。”
陳茂林把第一臺機櫃的電源重新推上,它重新啟動,黃色指示燈變成了“待命”狀態。
整個過程,正在執行的矩陣乘法任務沒有報錯,沒有中斷,甚至沒有延遲。
宇文坤德站在機櫃後面,手裡攥著螺絲刀,指節發白。
他看著那臺被斷電機櫃重新亮起來的指示燈,長長地吐了一口氣。
最後的考驗:全系統滿負荷執行。
這是崑崙1機第一次以完整形態亮相。
35臺機櫃全部線上,顆晶片同時工作,500多塊板卡各司其職。
其中儲存系統由6臺機櫃、48個抽屜、6144顆KL-SRAM晶片構成,總主存容量28MB。
算例是魏知遠教授團隊提前準備好的:一個大型熱傳導方程的數值模擬,網格規模128×128×128,需要做三維FFT、矩陣求逆、1500次迭代求解。
這個算例如果在數字孿生實驗室的機房跑,16臺午馬機組成的叢集一起發力,以單臺午馬機每秒5萬次的算力,通訊瓶頸限制,30%效率下,耗時四天左右。
今天要在崑崙1上跑。
衛知南把二維卡塞進讀卡機。
讀卡機開始咔嗒咔嗒地響,微程式被一行一行地載入到主控核心。
“載入完成。開始執行。”
終端機螢幕上開始滾動迭代步數。
第1步、第10步、第50步、第200步……
數字跳得很快,快到肉眼幾乎跟不上。
呂辰看了一眼牆上的掛鐘,下午五點二十三分。
機房的空調負荷驟增,散熱風扇的嗡鳴聲比平時大了許多。
秦無功走到機櫃後面,用手背試了試水冷板的溫度,回頭朝呂辰點了點頭。
迭代步數在滾動,所有人都沒有說話,只是看著螢幕。
汪涵坐在終端前面,搬了把椅子,就那麼坐著,一動不動。
宇文坤德靠在牆角,煙叼在嘴裡沒點。
吳國華站在機櫃前面,雙手插在褲兜裡,眼睛盯著那排綠色的指示燈。
呂辰站在機房中央,看著35臺機櫃全部亮著燈,綠色的、黃色的,像一座不夜的城市。
他的手插在褲兜裡,攥著那個黑皮本子,本子的封皮已經被磨得起了毛邊。
“兩分鐘了。”衛知南說。
“三分鐘了。”
“四分鐘。”
“五分鐘。”
沒有故障,沒有報錯,沒有中斷。
終端機螢幕上跳出最後一行字:
SIMULATION COMPLETE. ELAPSED TIME
5分45秒。
是16臺午馬機群的950倍!
汪涵從椅子上站起來,走到終端前面,把那一行字看了一遍,又看了一遍。然後他轉過身,看著呂辰。
“崑崙1,活了。”
他沒有笑,但眼睛裡有光。
呂辰翻開本子,在第四輪任務下面寫了一行字:“1月25日,全系統滿負荷執行透過。5分45秒。”
然後把本子遞給陳茂林。
陳茂林接過本子,看了很久,然後簽了字。
他把筆帽擰上,放回兜裡。
“明天開始跑24小時穩定性測試。”他的聲音沙啞,“今天,先下班。”
沒有人動。
陳茂林又說了第二遍:“下班。”
還是沒有人動。
陳茂林無奈地搖了搖頭,從兜裡掏出煙,給每人發了一根。
機房裡的煙味和松香氣味混在一起,在日光燈下慢慢飄散。
1月30日,第二階段最後一天。
三份報告整整齊齊地碼在長條桌上。
《功能微程式包V1.0》,藍色封面,432條核心微程式,每條都有功能描述、測試用例、驗證人簽字。汪涵在扉頁上籤了名,字跡工整,力透紙背。
《子系統聯調報告》,灰色封面,記錄了電源、儲存、I/O、運算、主控五個子系統獨立測試的全部原始資料。溫度、電壓、電流、時序、頻寬、延遲,每一項都有實測值和簽字。
還有一份“軟硬體介面對照表”的影印件,縮小到A3大小,折了幾折。
展開後能看到三百多個格子,每一個都填滿了綠色的勾。
陳茂林站在長條桌前面,手裡拿著三份報告。
“第二階段,今天結束。”他的聲音不大,但每個字都很清楚。
“電源、儲存、I/O、運算、主控,五大子系統全部透過獨立測試。跨子系統協同,儲存+運算、I/O+主控,全部透過。全系統滿負荷跑通,加速比超過11.8倍,雙核心切換時間0.7毫秒,中斷響應8微秒,全部達到設計指標。”
鍾漢成給每人發了一條中華、一個搪瓷缸子。
宇文坤德把搪瓷缸子舉起來看了看。缸子上印著“崑崙1機整合組·1970.1”,紅字。
“這個好,比獎狀實用。”他把缸子放在桌上,發出清脆的一聲響。
汪涵拿著那條煙,沒拆,放進了公文包裡。
呂辰站在靠窗的位置,看著窗外。
雪已經停了,天邊透出一線灰白色的光。
他把黑皮本子合上,拉鍊拉到頭,塞進帆布包裡。
陳茂林最後說了一句:“第三階段,整機穩定性考核和全系統聯調認證,年後開始。”
他頓了頓,聲音提高了一些:“但我不建議全休。該補覺補覺,該陪家人陪家人。年後,還有硬仗。”
沒有人說話,但有人笑了。
呂辰拎著帆布包走出機房。
走廊裡很安靜,陽光從西邊的窗戶斜射進來,把整條走廊染成一片金黃。