“能。”温卿回答得毫不犹豫。
“算法优化本身就是为科研服务的。我研究非平衡态模型遇到的问题,正是算法需要解决的典型问题。两边可以互相促进。”
钱老批准了这个计划。
在给温卿的批示中,他写道:“科学计算是科研的翅膀。翅膀硬了,才能飞得高远。放手去干。”
算法优化组很快成立,包括温卿在内共五人。
除了老王这个“编外顾问”,其他三人都是数学系出身,对计算数学有一定了解。
温卿把第一个攻坚目标定为:稀疏线性方程组的快速求解。
这是科学计算中最常见、最耗时的核心问题。
流体力学、结构分析、电磁场计算……几乎所有工程问题最后都归结为求解大型方程组。
“目前我们用的方法主要有两种。”
温卿在第一次组会上讲解。
“直接法,以高斯消元为代表;迭代法,以雅可比迭代、高斯-赛德尔迭代为代表。但都有严重缺陷。”
她在黑板上画出计算复杂度曲线:
“直接法计算量大,存储需求高,不适合大规模问题。传统迭代法收敛慢,甚至可能不收敛。”
“那国际上用什么方法?”
年轻组员小陈问。
他是清北数学系毕业的,理论基础扎实。
“预处理迭代法。”温卿写下几个关键词。
“不完全分解预处理、多重网格法、区域分解法。还有专门针对对称正定矩阵的共轭梯度法。”
她调出几篇英文文献的摘要:
“这些方法在理论上已经成熟,但实现起来很复杂,需要大量的数值实验和参数调优。”
“我们能看懂这些文献吗?”
另一名组员小李有些担心。他的英语水平一般。
“我来翻译和讲解。”温卿早有准备,“但更重要的是,我们要自己动手实现和测试。从最简单的共轭梯度法开始。”
接下来的一个月,算法组进入了疯狂的学习和编程状态。
白天,温卿讲解算法原理,带着大家读论文、推导公式。
晚上,所有人泡在计算机房,在“曙光-1”上编写和调试代码。
最大的挑战不是理解算法,而是如何在高性能计算机上高效实现。
“曙光-1”虽然比djs-130快得多,但内存依然有限,只有512kb。
而一个中等规模的三维流场计算,生成的稀疏矩阵就可能需要几兆甚至几十兆的存储。
“必须用压缩存储格式。”
温卿决定采用csr(压缩稀疏行)格式。
“只存储非零元素的值和位置信息,能节省80以上的内存。”
她亲自编写了核心的数据结构和基本运算函数。
这是她在末世时掌握的技能——那时的计算机资源比现在更紧张,高效的内存管理和算法优化是生存的基本功。
第一版共轭梯度法程序在一个月后完成。
“十七分钟!”小陈盯着屏幕上的计时结果,不敢相信,“速度提升了十倍!”
“还不止。”温卿指着收敛曲线,“你们看,迭代了120次就达到了精度要求。如果预处理做得好,迭代次数还能减少。”
“预处理”成了下一个攻坚目标。
温卿选择了不完全分解预处理——这是相对简单但效果显着的方法。
原理很简单:对系数矩阵做近似的分解,用分解后的矩阵作为预处理器,能极大改善迭代法的收敛性。
但实现起来很复杂。
不完全分解要控制填充量,否则预处理本身的计算量就太大了。
温卿又熬了几个通宵。
她发现自己进入了一种奇妙的状态:
当集中全部精神力思考算法问题时,脑海中的思维速度会极大提升,能在短时间内遍历多种可能性,找到最优解。
这让她想起了末世时的一种说法——“思维超频”。
少数经过特殊训练或天生精神力强大的人,能在短时间内达到远超常人的思维速度。
她一直以为那只是一种夸张的说法,但现在,她似乎真的摸到了那个门槛。
两周后,不完全预处理共轭梯度法程序完成。
同样的测试矩阵,这次只迭代了25次,用时四分钟。
从三小时到四分钟,45倍的效率提升!
整个算法组沸腾了。
稀疏矩阵求解的突破,证明了算法优化的巨大潜力。
温卿乘胜追击,开始系统性地重构“曙光-1”的整个软件栈。
她将目标分解为五个层次:
第一层,基础数学库。包括基本的向量和矩阵运算、快速傅里叶变换、特殊函数计算等。这些是所有科学计算的基础。
第二层,线性代数库。在共轭梯度法的基础上,扩展到更一般的krylov子空间方法,如gres、bicgstab等,用于求解非对称矩阵问题。
第三层,数值积分和微分方程求解库。针对常微分方程和偏微分方程,开发高效的数值解法。
第四层,应用专用库。针对流体力学、结构力学、电磁学等特定领域的专用算法。
第五层,并行计算框架。虽然“曙光-1”的并行能力很弱,但温卿还是设计了一个简单的多任务框架,能让多个程序交替运行,提高机器利用率。
这是一个庞大的工程。
算法组五人根本不够。
温卿打报告申请扩充队伍。
钱老特批,从全国各大高校和研究所抽调了十二名计算数学和软件工程方面的骨干。
新队伍里有个特别的人物——周若兰,中科院计算所的研究员,三十出头,是国内少数专门研究数值算法的专家。
周若兰第一天报到时,直接找到温卿:
“温总设计师,我看过你写的共轭梯度法代码。有些地方我不太理解,比如这个预处理矩阵的填充控制策略……”
温卿知道,这是来“考校”的。
一个二十二岁的年轻人,领导一群三四十岁的专家,难免有人不服。
她耐心解释了算法思路,从矩阵条件数讲到预处理原理,从存储优化讲到收敛性分析。
不仅讲懂了,还指出了现有算法的一个潜在缺陷。
“……所以你的填充策略虽然节省内存,但可能破坏预处理矩阵的正定性,在极端情况下会导致迭代失败。”
温卿在白板上画出一个反例,“我建议加入对角线补偿,虽然增加一点计算量,但能保证鲁棒性。”
周若兰盯着那个反例看了很久,终于点头:“你说得对。这个缺陷我都没注意到。”
从那天起,周若兰成了温卿最得力的助手。