苏联撤专?我反手掏出人工智能! 第222节
陈序年没有再多待,退出计算室,回了自己的办公室。
笔记本锁进抽屉之前,他又翻了翻后面几页,定点数溢出的处理技巧写在第五页,状态方程查表的插值子程序优化写在第六页。
这些东西他不打算一次全抛给梁启明,等他撞上了再给,记得才牢。
接下来三天,陈序年办公室的门几乎没关过。
梁启明每隔几个小时就派小周或者老李过来问一个问题。
问题杂七杂八,从指令编码格式到地址计算规则,从纸带输入输出的控制字符到子程序调用时堆栈指针怎么保存。
陈序年一个一个答,该讲透的讲透,该让他们回去自己试的就丢一句你试试看。
有些问题陈序年当场就能回答,有些他会让小周等一下,自己先在草稿纸上画一遍逻辑,确认没有歧义之后再把结论写给他带回去。
他不能出错,梁启明的编程能力在快速增长,如果他给的提示本身有误,梁启明排查的时候反而会浪费更多时间。
第四天,梁启明的第一批程序上了纸带。
何建军操作打孔机,梁启明念二进制码,何建军按键打孔。
一条指令十六位,念一遍打一遍,念错了就废一段纸带重来。
整个过程需要两个人配合的严丝合缝,念的人不能含糊,打的人不能走神,一千多条指令念下来,嗓子都是哑的。
第一盘纸带打了四个小时。
下午两点,梁启明把纸带装进读入设备,按下运行键。
纸带哒哒哒的被吞进去,控制面板上的指示灯开始闪烁。
闪了四十下,全暗了。
“停了。”
王德明凑过来看面板上的程序计数器。
“跑到第四十一条指令的时候停的。”
梁启明扒开纸带输出端,撕下一小段结果带,对着灯光辨认孔位。
“第四十一条是个跳转指令,跳转地址算错了。”
梁启明脸色发青。
“我把子程序的起始地址写成了十进制,忘了转成十六进制。”
他回到桌前,在草稿纸上重新算了一遍地址,改了三条指令,让何建军重新打孔。
第二次运行,跑到了第一百二十条停住,存储器访问越界。
一个变量的地址偏移量多算了两个字,程序直接读进了未初始化的空间,取出来的数据完全没有意义。
梁启明查了偏移量计算表,找到了那个多余的加法,改掉,重新打孔。
第三次,跑到了第二百八十条,停在迭代子程序的入口,原因是寄存器分配冲突。
主程序和子程序用了同一个寄存器暂存中间结果,子程序一进去就把主程序存在那个寄存器里的值给覆盖了,等子程序跑完返回主程序,主程序拿到的已经是一个被篡改过的数。
梁启明趴在桌上查了整整一个下午,他把十七个子程序的寄存器使用情况全部列出来,画了一张汇总表,逐个子程序重新分配寄存器,确保没有冲突。
这张表画了三遍才定稿,前两遍都发现有交叉的地方。
第四次,程序跑通了整个主循环的第一步。
“第一步出来了!”
小周从纸带输出端撕下结果,用铅笔飞快的把二进制转成十进制,又翻出手算的验证数据对照。
“温度、密度、压力都对上了!辐射通量偏了百分之二!”
“百分之二在容许范围内。”
梁启明长出一口气,靠在椅背上揉了揉太阳穴。
“继续跑,看后面会不会发散。”
程序往下跑了二十步,在第二十一步崩了。
梁启明盯着纸带输出的数据看了半天。
“温度值溢出了。”
他回头看陈序年,陈序年站在门口,手里端着一只搪瓷杯。
“定点数溢出。”
陈序年走进来,把搪瓷杯放在桌上。
“温度从几千度跳到几万度,数值量级变了四个数量级,你的标度因子没跟着调。”
“标度因子?”
陈序年从口袋里掏出笔记本,翻到第五页,放在梁启明面前。
“十六位定点数,有效数字只有四到五位,你要表示的物理量跨了十几个数量级,一个固定的标度因子根本兜不住,每一步运算结束后,要检查结果的量级,如果超出了当前标度因子的表示范围,就要做一次重新定标。”
梁启明看着笔记本上的内容,额头上青筋跳了一下。
“这就是说,每一条乘法和除法指令后面,都要跟一段定标检查的代码?”
“对。”
“那程序长度至少要翻一倍。”
“所以我一开始估计一千二百条。”
第201章 第一次计算结果
陈序年把笔记本收回来,翻到之前记录程序指令规模的那一页,在旁边添了几个数字。
“你原来写的那版大概七百条,加上定标代码,差不多就是一千二百条。”
梁启明闭了下眼又睁开,抓起了铅笔。
“我重写。”
重写用了五天。
这五天里梁启明几乎没离开过计算室,他让小周从宿舍把行军床搬了过来,靠在墙角,上面铺了一条毛毯。
困的撑不住了就趴在桌上睡半个小时,闹钟一响立刻爬起来接着写,有时候闹钟还没响他就醒了,盯着天花板发几秒呆,又低下头继续。
小周和老李两人轮班,一个帮着校对地址,一个帮着核对二进制码。
校对地址的工作量比写代码还大,梁启明重写了内存分配方案,所有子程序的入口地址全部变了,调用关系要重新理一遍。
小周用一张大纸画了一棵调用树,贴在墙上,每改一处就用红笔标注,改完再用蓝笔确认。
何建军守在打孔机旁边,随时准备上纸带,梁启明改一段代码,他就打一段,两人之间的配合已经很默契。
念码的语速越来越快,何建军的手指跟的上。
有几次梁启明念到一半停下来,何建军就等着,手悬在打孔机上方不动,等对方想清楚了再继续念。
整个过程里何建军从不催,也不问。
陈序年每天去看两次进度,早上一次,晚上一次,每次过去都带一个窝头或者半杯热水,放在梁启明桌角。
梁启明有时候根本没注意到,等回过神来窝头已经凉透了,水也凉了,陈序年也不说什么,下一次去的时候把凉窝头收走,再放一个新的。
第三天的时候碰到了一个棘手的问题。
定标代码里有一段循环,需要反复读取存储器里同一块区域的数据,读一次、算一次、写回去、再读出来,这个过程对存储器的时序要求很高,梁启明在纸上摹拟了好几遍,总觉得在某些极端情况下可能出现读写冲突。
他去找陈序年讨论。
陈序年看了时序图,沉吟了一会儿,提了一个建议,在读和写之间插入两个空指令周期,让存储器有时间完成前一次写入的全部动作。
梁启明回去改了,问题解决了。
第十二天,程序第一次完整跑通了小规模测试算例。
网格减半,径向十格,轴向十五格,一百五十个网格点,程序从头跑到尾,没有崩溃,没有溢出,纸带输出了一长串数据。
梁启明和小周、老李三个人花了一整天时间,把数据翻译成物理量,跟手算的抽查点逐一对照。
“十五个抽查点,十三个完全吻合,两个偏差在千分之三以内。”
梁启明把对照表放在陈序年面前。
陈序年扫了一眼那两个偏差点的位置,都在边界附近。
“边界条件的离散精度不够,网格加密之后会改善。”
他说。
“可以上正式算例了。”
“明天开始。”
梁启明说完,忽然靠在椅背上,嘴巴张了张,没说出声,眼皮一合,当场睡了过去。
小周赶紧把他扶到旁边的行军床上,梁启明倒下去就没了动静,鼾声很响。
陈序年给他盖了条毯子,走出计算室。
上一篇:在自由美利坚冒充气功大师
下一篇:开局召唤康娜,你告我雇佣童工?
