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 INStRUctIoNS. 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 * 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.
第四轮的第一个硬指标:加速比。
单机柜内多运算板并行跑矩阵乘法。
汪涵选了一个1024x1024的矩阵乘法。
先测单块运算板的时间。
钱兰敲了命令,运算板开始计算。
终端机上跳出一个计时器,二十几秒后显示结果:“23.4秒。”
然后测全机柜21块运算板并行。汪涵加载了任务调度微程序,把矩阵拆分成21个区块,分配给21块运算板同时计算。
终端机上的计时器重新开始,数字跳动得比刚才快得多。
“2.03秒。”吴国华读出数据。
加速比:23.4除以2.03,约11.55倍。
陈茂林的声音从身后传来:“再测一次。”
又测了一次。12.05倍。
再测一次。11.85倍。
三次平均超过11.8倍,略优于设计指标的11倍。
理想情况下,21个单元并行,任务平均分配、无通信开销,昆仑1的加速比应当是21倍。
但这是不可能的,因为还存在通信开销、总线竞争、负载不均等损耗。
双核心冗余测试紧随其后。
两台主控机柜,一台是主核心,一台是辅核心。两台机器跑着同样的微程序,结果实时比对。
吕辰走到陈茂林面前:“陈工,请您下令‘模拟主核心故障’。”
陈茂林看了他一眼,走到主控机柜前面,伸出手,按住了第一台机柜的电源开关。
“嘭”的一声,第一台主控机柜断电了。所有指示灯瞬间熄灭。
几乎在同一瞬间,第二台主控机柜的黄色“接管”指示灯亮了,绿色的“运行”灯没有灭。
终端机屏幕上的任务输出没有中断,连光标都没有闪烁一下。
示波器捕捉到了切换的时间波形。
吴国华看着屏幕:“切换时间约0.7毫秒,在1毫秒以内。”
陈茂林把第一台机柜的电源重新推上,它重新启动,黄色指示灯变成了“待命”状态。
整个过程,正在运行的矩阵乘法任务没有报错,没有中断,甚至没有延迟。
宇文坤德站在机柜后面,手里攥着螺丝刀,指节发白。
他看着那台被断电机柜重新亮起来的指示灯,长长地吐了一口气。
最后的考验:全系统满负荷运行。
这是昆仑1机第一次以完整形态亮相。
35台机柜全部在线,颗芯片同时工作,500多块板卡各司其职。
其中存储系统由6台机柜、48个抽屉、6144颗KL-SRAm芯片构成,总主存容量28mb。
算例是魏知远教授团队提前准备好的:一个大型热传导方程的数值模拟,网格规模128x128x128,需要做三维FFt、矩阵求逆、1500次迭代求解。
这个算例如果在数字孪生实验室的机房跑,16台午马机组成的集群一起发力,以单台午马机每秒5万次的算力,通信瓶颈限制,30%效率下,耗时四天左右。
今天要在昆仑1上跑。
卫知南把二维卡塞进读卡机。
读卡机开始咔嗒咔嗒地响,微程序被一行一行地加载到主控核心。
“加载完成。开始运行。”
终端机屏幕上开始滚动迭代步数。
第1步、第10步、第50步、第200步……
数字跳得很快,快到肉眼几乎跟不上。
吕辰看了一眼墙上的挂钟,下午五点二十三分。
机房的空调负荷骤增,散热风扇的嗡鸣声比平时大了许多。
秦无功走到机柜后面,用手背试了试水冷板的温度,回头朝吕辰点了点头。
迭代步数在滚动,所有人都没有说话,只是看着屏幕。
汪涵坐在终端前面,搬了把椅子,就那么坐着,一动不动。
宇文坤德靠在墙角,烟叼在嘴里没点。
吴国华站在机柜前面,双手插在裤兜里,眼睛盯着那排绿色的指示灯。
吕辰站在机房中央,看着35台机柜全部亮着灯,绿色的、黄色的,像一座不夜的城市。
他的手插在裤兜里,攥着那个黑皮本子,本子的封皮已经被磨得起了毛边。
“两分钟了。”卫知南说。
“三分钟了。”
“四分钟。”
“五分钟。”
没有故障,没有报错,没有中断。
终端机屏幕上跳出最后一行字:
SImULAtIoN pLEtE. ELApSEd tImE: 00:05:45
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”,红字。
“这个好,比奖状实用。”他把缸子放在桌上,发出清脆的一声响。
汪涵拿着那条烟,没拆,放进了公文包里。
吕辰站在靠窗的位置,看着窗外。
雪已经停了,天边透出一线灰白色的光。
他把黑皮本子合上,拉链拉到头,塞进帆布包里。
陈茂林最后说了一句:“第三阶段,整机稳定性考核和全系统联调认证,年后开始。”
他顿了顿,声音提高了一些:“但我不建议全休。该补觉补觉,该陪家人陪家人。年后,还有硬仗。”
没有人说话,但有人笑了。
吕辰拎着帆布包走出机房。
走廊里很安静,阳光从西边的窗户斜射进来,把整条走廊染成一片金黄。