原创
龙芯,牛!(4)
2008-10-6 23:48
2654
1
1
分类:
汽车电子
龙芯,牛!(4)
作者:moto 2006-09-14 10:12:00
由于龙芯2号A方案的流片失败,我们更加迫切地等待B方案流片的结果。这种等待有时候让我坐卧不宁,必须时时刻刻地找事情做心里才好受一些。因此在这个阶段我们对龙芯2号B方案的结构和RTL继续进行优化(真算是化悲痛为力量)。不仅延迟又降低了0.5ns,而且通过对存储层次的改进,相同主频下性能也提高了很多。
在SMIC完成流片后,我们得到了封装厂家的大力支持,以最快的速度完成了封装。我又派专人去上海立等芯片的封装结束并把芯片直接取回来,这种在煎熬中等待的日子我是一刻也不想过了。好在天道酬勤,在拿到芯片的40分中内我们就用龙芯2号把操作系统启动了起来。此后,我们又化了大约三个礼拜针对龙芯2号虚地址CACHE和猜测执行的特点把操作系统搞稳定。
现在,基于龙芯2号的Linux-PC已经稳定运行了一个多月。目前的龙芯2号最高频率为300MHz,功耗1W-2W,成品率约为80%左右。在性能方面,在联调的第一天我们只把龙芯2号的主频调到133MHz时已经明显感觉到比266MHz的龙芯1号还要快很多。龙芯1号不能胜任的许多应用,包括流媒体的软解压、GNU 2.4的支持、Mozilla浏览器、Open Office办公软件等重量级的应用,在龙芯2号中都能比较流畅地运行。尤其是流媒体的软解压,我曾经化了三天三夜进行软件优化来提高龙芯1号软解压的效果,但最后还是差一点;把龙芯1号勉强能软解压播放的一个mpeg文件在200MHz的龙芯2号上播放,只要23%的CPU。而对于标准的MP3播放,龙芯2号只要不到1%的CPU就应付裕如了。通过使用SPEC CPU2000对龙芯2号的性能分析表明,相同主频下龙芯2号的性能已经明显超过PII的性能,是龙芯1号的3-5倍。
我曾经终日坐在用龙芯2号做的计算机前,玩着各种游戏,使用各种重量级的软件来感受龙芯2号的性能。虽然对于有些大型的应用软件还感到有些迟钝,但我们的龙芯2号已经明显表现出她作为PC机中使用的CPU的资格和风范。每当我在龙芯2号上玩着LINUX PC中的各种游戏,想想一年前玩龙芯1号时觉得性能不理想时的郁闷心情,真是我这一年来最爽的体验。
龙芯2号的性能提高主要来自先进的结构设计,包括四发射和乱序执行结构的设计。而乱序执行的关键技术是龙芯2号结构设计的重点和难点,四发射的RISC结构如果没有乱序执行技术的支持是发挥不出效率的。例如典型的定点程序中平均每六、七条指令就有一条转移指令,意味着在四发射结构中每两拍就有一条转移指令。如果等转移指令的目标地址确定再进行后面的取指,意味着每取两拍指令就得等五、六拍甚至更多才能继续后面的取指。又如,做一个简单的加法需要两个操作数,而如果这两个操作数都需要从内存中(即主板上的内存条)取回来,那么在做这个加法之前,需要至少上百拍的时间为这个加法准备数据。指令乱序执行的核心思想就是减少各种相关引起的等待,充分发挥处理器的效率。
主要做法包括:(1)转移猜测,即在转移指令目标尚未确定的时候,根据过去转移指令执行的历史猜测该转移指令的转移方向和转移目标,并根据猜测的结果进行后续指令的取指,为处理器提供连续稳定的指令流。如果最后发现猜测错误,则取消猜错的转移指令后面的指令。(2)动态调度,即在前面的指令由于操作数未准备好而等待时,后面的操作数已经准备好的指令可以越过前面的指令先执行。(3)寄存器重命名,即指令运算后先写到一个临时的寄存器,等确定该指令不会被取消后再写到真正的目标寄存器中去。这样做的好处除了便于前面指令发生例外或转移猜错时取消外,还避免了由于两条指令写同一个寄存器时的等待。
此外,访存指令的乱序执行又有新的特征。除了通过增大CACHE和对CACHE进行有效的组织尽量提高CACHE命中率并降低CACHE访问的延迟外,还需要对访存指令进行乱序执行以提高效率。访存指令乱序执行的关键技术包括:(1)Non-blocking技术,即在前面的访存指令由于CACHE不命中进行长延迟的存储访问时,后面的指令可以继续访问CACHE。(2)Memory Disambiguation技术,即在存数和取数指令都乱序执行的情况下,保证取数指令都能取回它前面的最近一条对同一地址的存数指令所存的值。比如如果一条取数指令在一条存数指令之后且两条指令的地址相等,但取数指令先访问CACHE,也要保证取数指令取回该存数指令的值;又如如果一条取数指令在一条存数指令之前且两条指令的地址相等,但存数指令先访问CACHE,也要保证取数指令取回原来CACHE中的值,而不是存数指令新存的值。(3)Load Speculation技术,即在取数指令访问CACHE后,它前面的存数指令地址还没有确定(即取数指令从CACHE中取回的值有可能是错误的),先把取数指令从CACHE中取回的值送给后续的指令用,如果后来发现它前面的存数指令和该取数指令访问的是同一个单元,再取消该取数指令后面的指令。(4)Write Buffer技术,由于存数指令也是乱序执行的,存数指令所存的值不能立即写到CACHE或内存,而是要根据存数指令在程序中的次序写到CACHE或内存。
在乱序执行的结构中,虽然指令执行是乱序的,但开始和结束是有序的。指令在译码和寄存器重命名后就放在一个有序的队列中,由该队列来记录每一条指令的执行阶段并有序地结束指令。即指令在流水线中是有序进入、乱序执行、有序结束。
龙芯2号的主要结构特点包括,64位设计,7-10级流水线,包括取指、译码、重命名、发射、读寄存器、执行写回、提交等,其中乘除、浮点操作、以及访存操作在执行写回阶段需要多拍。四发射结构,最多可以有64条指令乱序执行。共有5个功能部件,包括定点ALU1(完成定点加减、逻辑、移位、转移),定点ALU2(完成定点加减、逻辑、移位、乘除),浮点ALU1(完成定点加减、转换、转移),浮点ALU2(完成乘除、开方),以及访存部件(完成访存、系统管理、数据传送)。通过对浮点指令fmt域的简单扩充,浮点部件可以执行完整的定点指令以及4路SIMD的媒体指令。在乱序执行方面,转移猜测使用混合预测+Gshare + BTB + RAS的转移猜测方式;通过物理寄存器到逻辑寄存器映射进行寄存器重命名,定点浮点寄存器堆各为64项;动态调度方面定点和浮点保留站各16项,Reorder Buffer为64项。
在存储管理方面,TLB为64项全相联,每项两页,页大小在4KB-4MB之间可变。此外,有一个独立的8项的指令TLB是数据TLB的子集。与龙芯1号一样,在TLB中增加可执行位,防止缓冲区溢出攻击。数据CACHE和指令CACHE各为32KB,二路组相联。最多允许32个访存操作的Non-blocking访问,访存相关在访存队列中通过全相联的查找解决,避免了象Alpha21264或MIPS R10000中碰到访存相关时需要重新发射。实现load-speculation,允许前面的store操作未确定的情况下执行load操作并返回结果。Cache失效时实现关键字优先访问,以减少访存等待,Uncached操作实现uncached accelerate算法加速I/O访问。
目前的龙芯2号只是我们所承担的项目的阶段性成果。它的作用主要体现在四个方面。一是对目前的处理器核设计进行验证;二是用于进行性能分析以及对性能分析方法的改进;三是验证新的物理设计方法和生产厂家;四是提前提供软件开发平台,为LINUX PC的正式推出做好准备。现在看来,这几个目的都达到了。
我们的下一步目标是在目前龙芯2号的基础上把性能再提高到现在的3-5倍,并利用明年完成的龙芯2号做一台每秒运算一千亿次的计算机。我还是博士生时唐志敏曾经带我到中科院网络中心去算题,有一次他隔着玻璃指着一台计算机对我说,这台就是从日本引进的计算机,现在系统管理的权限还在日本人手里,增加一个用户都要它们批准,什么时候我们自己做一台比它还快的计算机,就放在这台计算机边上,告诉它们这台机器就是用来做核模拟的。所以做一台自己的高性能机是我学生时期的梦想,虽然现在国内最快的高性能机已经达到每秒几万亿次,但我一定要圆这个梦。
计算所的一位研究员曾经说过,创新工作一个重要特征就是这个工作让人感到“狠”。我觉得,龙芯1号“狠”的地方就是进度快,从零开始,用了不到一年半的时间完成一个通用处理器的设计;而目前的龙芯2号“狠”的地方就是在结构上对性能的大幅提高。我相信,更“狠”的还在后头。
2003年11月30日于中国科大
文章评论(0条评论)
登录后参与讨论