狗剩2号最后的流片将以全定制为主。 狗剩2号的设计包括结构设计、逻辑设计以及物理设计三个阶段,这三个阶段互相重叠,其中结构设计阶段和狗剩1号的设计也有所重叠。狗剩2号的结构设计断断续续地进行了好几个月。刚开始是在2002年四、五月份在进行狗剩1号物理设计的同时对狗剩2号的系统结构进行了初步的考虑。在对市场上的主流处理器如Alpha21264、MIPSR10000、UltraSparcIII、PowerIII、HPPA8700、PIV、IA64等及学术界的主要工作进行调研的基础上基本确定了狗剩2号的寄存器重命名、动态调度以及运算部件的架构。到六、七月份随着狗剩1号物理设计和系统开发工作的展开,狗剩2号的结构设计几乎停了下来。那时候我们组一共只有二、三十号人,很多人员的工作都是重叠的,根本没有力量同时做两件事情。 在2002年7月中旬狗剩1号tapeout之后,利用等待芯片回来的时间把狗剩2号的结构设计再次提上日程。7月15日研究生部的靳晓明老师打电话叫我到在四川广元召开的研究生学术研讨会上做个特邀报告,本来应该是徐志伟老师做的报告,徐老师临时有事去不了因此派我救场。唐志敏已经告诉靳老师我刚tapeout一个芯片,应该有空,所以推也推不掉。开完会后还要去九寨沟,需要三、四天才能回来。我走之前临时决定把狗剩2号的部分设计人员带到广元,准备在路上对狗剩2号的结构进行讨论。我和中科院研究生院的两位老师一起坐火车头天走,安虹老师、张福新和范东睿坐飞机第二天走,几乎同时到的广元。那时候我女儿正在放暑假,我爱人在狗剩1号tapeout之后刚到一个公司上班,因此我把6岁的女儿也一起带上了。 后来的事实证明我临走前做的决定是十分正确的,在广元和九寨沟的几天效率极高,基本确定了狗剩2号的结构框架。那几天我们白天根据会务组的安排活动,晚上讨论狗剩2号的结构,并且根据讨论结果形成狗剩2号结构设计的初步文档,每天都到凌晨一、二点。由于处理器的寄存器重命名以及动态调度结构已经基本确定,因此讨论的重点是取指和访存部件的结构。 在从广元去九寨沟的路上我和范东睿坐在汽车的最后一排讨论狗剩2号的取指和译码部分的结构,汽车在路上颠簸了一整天,我们也讨论了一整天。取指与译码部分的设计空间很大,包括采用何种转移猜测算法、多发射情况下如何消除转移指令后面的延迟槽、取指及转移猜测是以指令为单位还是以发射块(四条指令)为单位、转移猜测是在取指还是在译码阶段进行、修正 BHT和BTB的时机、如何提高指令CACHE的性能、以及指令TLB和数据TLB的关系等。其中如何消除转移指令后面的延迟槽讨论的时间最长,主要是对传统的BTB方法和Alpha21264中采用的lineprediction方法进行反复的比较和分析。我从小就喜欢坐比较颠簸的汽车,汽车越颠精神越好,范东睿精神也不错,因此一路上效率极高。晚上8点汽车到达九寨沟时,狗剩2号的取指部分架构已基本确定。 访存部分的结构比取指部分复杂。一方面,它是与操作系统关系最密切的部分,其功能是否完善是支持通用操作系统的关键因素;另一方面,它是提高处理器性能的核心部件之一。如果CACHE访问效率不高,流水线的其它部分设计得再好也没有用。这一点在狗剩1号中我们已经有所体会。学术界与企业界都对如何提高访存性能作了大量研究,设计空间很大,核心问题包括如何降低流水线延迟、如何提高CACHE命中率和降低由于CACHE不命中引起的等待延迟、以及如何解决访存的RAW、WAR、和WAW相关等等。 在随后的几天中,我们对这些方面进行了反复的权衡和讨论。直到在回北京的火车上才有比较粗的思路。 有意思的是,一路下来,我女儿看我们的工作,耳濡目染,对CPU设计也有了自己的心得。直到今天我问她什么是CPU,她还说“CPU就是在一张纸上画些方框,然后用线和箭头把这些方块连起来,再涂上点颜色,写上一些字,最后一烧,烧出一个亮晶晶的小方块”。 最近我女儿经常在用狗剩2号做的LinuxPC上玩游戏。我告诉她这就是我们在九寨沟画的方框“烧”出来的,她感到很诧异。在 2002年8月10日狗剩1号首片调试成功之后,狗剩2号的设计工作又慢了下来,全组的主要力量放在了狗剩1号的系统开发上面。虽然由于狗剩1号的系统开发和性能分析耽误了一些时间,但我自己在狗剩1号上玩了近一个月后有很大的收获。尤其是对性能和主频的关系有了更深入的认识。比如,对于有一些访存密集的应用,主板频率83MHz而CPU频率250MHz时的性能还不如主板频率100MHz而CPU频率200MHz的性能。现在想起来,一个处理器的性能就象一个城市的交通系统的吞吐率,可能由于某几处的堵塞而影响整个城市的吞吐率,只要把这几处疏通了,虽然花的力气不大,但吞吐率会极大地提高。2002年 9月28日狗剩1号发布会后,狗剩2号的设计工作全面展开。10月2日,我带着张福新和李祖松到母校中国科大利用十一长假进行狗剩2号的C模拟器封闭开发,顺便向母校报告一下我们的工作。在科大借了半间原来的库房呆了一个多星期,基本完成了C模拟器的代码编写。在对结构进行细化的过程中发现了好多原来没有考虑到的问题。对于这些问题我们有时候争辩得很激烈。例如在转移猜错取消时需要判断正在执行的指令中哪些是该转移指令前面的,哪些是该转移指令后面的,张福新和李祖松的观点是参照MIPSR10000使用的方法,而我觉得那个方法太麻烦,希望有更简洁的方法。我们一直争论了两天,在争论的过程中互相启发,终于找到了一种简洁而高效的方法。 |