六点半,天已经大亮。
陆沉睁开眼,脑海中的倒计时刚好归零四个小时的睡眠,足够恢复精力了。
林枫还在睡,呼吸均匀。
昨晚他在终端前待到十一点,反复熟悉BESM—6的指令集,最后是被值班老师赶回来的。
陆沉没有叫醒他。他安静地洗漱,然后坐在床边,闭上眼睛。
意识沉入那片他称之为“构建空间”的领域。
这是他的超算大脑真正施展威力的地方。
在他的感知中,BESM—6的硬件结构象一张三维蓝图般展开。
寄存器组、内存标签页、指令预取队列、微码存储器—每一个模块都清淅可见,每一个信号传递的时序都精确到时钟周期。
他开始构建优化版数学库。
标准库的浮点乘法子程序需要147个时钟周期。
他的目标是:89个。
方法很简单—至少原理上很简单。标准库为了兼容所有数据类型和边界情况,添加了大量判断分支。而他只需要针对团体赛可能的计算场景,裁剪掉不需要的通用性,用最直接的寄存器操作完成运算。
但这需要精确到每一个微码步骤的调度。
如果调度错一个周期,乘法的部分积就会错位。如果寄存器冲突没处理好,流水线就会空转。
他需要同时考虑:
指令发射顺序寄存器依赖关系内存访问延迟微码跳转的预判惩罚这些变量互相耦合,构成一个极其复杂的优化问题。
但对于他而言—
这只是一道有趣的题。
七点十五分,林枫醒了。
他看到陆沉坐在床边,双眼微闭,以为他在打坐。
“修仙呢?”林枫揉着眼睛坐起来。
陆沉睁开眼。
“写完了。”
“啊?”
“数学库。”陆沉说,“乘除法、浮点运算、矩阵基本操作,大概四十几个函数,比赛的时候直接用就行。”
林枫沉默了五秒钟。
“————你一早上写的?”
“恩。”
“在脑子里?”
陆沉想了想,觉得解释起来太复杂,于是只说:“差不多。
林枫张了张嘴,最终什么也没说,默默起床洗漱去了。
八点整,中国队集合完毕,前往计算中心。
团体赛的算法设计模块在主赛场进行。
十二支代表队各占据一片局域,每队一台BESM—6终端,配发题目和参考手册。
陆沉注意到,苏联队坐最前排,东德队和波兰队分列两侧。
中国队的位置在第三排左侧,旁边是匈牙利队。
落座时,一个戴眼镜的匈牙利男生朝他们点了点头,用口音浓重的英语说:“祝好运”
。
陆沉点头回礼。
八点三十分,主考官走到讲台前。
那是位五十多岁的苏联教授,灰白的头发梳得一丝不苟,他用俄语宣读比赛规则,旁边有翻译用英语复述。
“本次算法设计模块的题目,由苏联科学院计算中心提供。”
“限时四小时。”
“可以使用任何程序语言,但评测将在BESM—6实机上运行。”
“现在,分发题目。”
题目是密封在牛皮纸袋里的。陆沉拆开,抽出里面的纸张。
只有一页纸。
上面是一段简短的描述,和一组数学公式。
陆沉的目光扫过题目。
然后,他的瞳孔微微收缩了一下。
不是因为难。
是因为他见过这道题。
准确地说,是前世见过。
这道题的内核,是求解大规模稀疏线性方程组的预条件共轭梯度法—一种在计算数学中极其重要的迭代算法。
预条件技术还处于萌芽阶段。
共轭梯度法虽然在五十年代就被提出,但因为数值稳定性和收敛速度的问题,一直没能在实际工程中广泛使用。
直到七十年代末,预条件技术的突破才让这个方法真正实用化。
而这道题,恰恰要求选手设计一个预条件子,并实现完整的求解流程。
陆沉放下题目。
他知道这道题的标准解法一不完整的Cholesky分解作为预条件子,结合共轭梯度迭代。这是他前世做数值计算时烂熟于心的东西。
但问题在于——
1988年,不完整的Cholesky分解的论文还没有发表。
原始论文是1990年才出现的。
如