編者:本文作者為“龍芯2號”主要研發(fā)人員,本文是他在BBS上發(fā)表的一篇文章。
2003年10月16日深夜,喧囂了一天的計算所北樓終于沉寂了下來,我獨自坐在北樓105房間忐忑不安地等待著。剛才還有鄭為民和一個學(xué)生跟我在一起,幾分鐘前我派他們到后面的芯片小樓取邏輯分析儀去了。與北樓隔著一個籃球場的芯片小樓里還有10來個課題組的弟兄,他們都象我一樣忐忑不安地等待著。
17日凌晨0點30分,樓道里傳來了有節(jié)奏的腳步聲,在空曠而寂靜的樓道里顯得特別有力。腳步聲越來越近,我的心一下子提了起來,咚咚的腳步聲象敲在我的心上,因為我知道,我們的狗剩2號回來了。
105房間的門被推開,張珩風(fēng)風(fēng)火火地闖了進來,手里抱著一個方盒子。他是我專門派到上海去封裝廠家取狗剩2號芯片回來測試的。我們小心翼翼地打開盒子,幾十片狗剩2號芯片象等待檢閱的士兵一樣整齊地排列在專用的包裝盒里。一個電話撥到芯片小樓,不到兩分鐘,105房間就聚集了六、七個人,他們都是下午剛剛成立的聯(lián)調(diào)組的成員。
我挑了幾個芯片,在用萬用表對芯片進行一些簡單的靜態(tài)測試后,從中選了一個芯片放到子卡的插槽中蓋好,并把子卡插到主板上。小心地按了一下電源開關(guān),顯示屏上沒有動靜,心里一陣緊張。試了幾次后,換一個子卡,放上芯片后插到主板上,一按電源開關(guān),顯示屏一陣跳動,串串字符如約而至。我們一陣歡呼,剛才提到嗓子眼的心放回到心窩里先。
在啟動了一個簡單的BIOS系統(tǒng)以后,開始啟動LINUX操作系統(tǒng),一切都很順利。1點10分,屏幕上出現(xiàn)了LINUX操作系統(tǒng)的登錄提示符“l(fā)ogin:”。在拿到芯片的40分鐘后,剛才等待時的緊張心情一掃而光。我們趕快打電話到芯片小樓告訴在那里等候的其他同學(xué)。鐘石強還給我的妻子發(fā)了個短信,今晚她也在等待我們的消息。幾分鐘后狗剩2號收到了出世后的第一個祝福。
4點30分,狗剩2號通過了其他的測試。我們用裝有狗剩2號的計算機在我們CPU組的內(nèi)部BBS上灌了狗剩2號出世后的第一瓢水,并發(fā)了幾封EMAIL。我決定狗剩2號的第一次聯(lián)調(diào)先告一段落,拿出放了很久的硅谷的一個朋友送的一瓶XO在芯片小樓的會議室里每人半紙杯慶祝了一下。喝完酒后大家興致不減,根據(jù)事先的約定又打車到天安門廣場看升國旗并去毛主席紀念堂向毛主席報告。今年是毛主席誕辰110周年,我們這款芯片的名字就叫MZD110。
6點25分,我們又一次站在天安門前的國旗桿下,看著紅彤彤的國旗在國歌聲中冉冉升起。去年在接受《東方之子》節(jié)目采訪時,他們曾問我在狗剩1號研制成功后看升國旗時心里想什么,我那時真忘了想什么了。這次我試圖去想一些有意義的事情,比如什么豪言壯語之類的。可是面對國旗,腦袋里一片空白,只是在國旗猛地串上桿頂?shù)哪且粍x那,24小時前楊利偉走出神舟5號艙門沖大家揮手的畫面突然出現(xiàn)在我腦海中,以至于在去前門吃早飯的路上這個畫面還久久浮現(xiàn)在面前,揮之不去。
在2002年9月28日龍芯1號的發(fā)布會上,李國杰所長曾經(jīng)引用《易經(jīng)》中的話說:“萬物生于有,有生于無”。如果說狗剩1號解決的是從0到1的問題的話,那么狗剩2號要解決的是從1到10的問題,即狗剩2號的性能至少是狗剩1號的10倍以上。事實上這也是我們在申請 中科院知識創(chuàng)新工程重大項目和863計算機軟硬件主題重點項目時唐志敏提的指標(biāo)。在這 兩個項目厚厚的申請書和合同書中,我只記住了兩個數(shù)字,一個是主頻500MHz以上,一個 是SPEC CPU2000的值達到300分以上。從承擔(dān)項目之日起,這兩個數(shù)字就象兩個緊箍咒一 樣緊緊地箍在我的頭上(我一直認為這個項目是863項目中立得最成功的項目之一,只用 兩個數(shù)字就把要做的事情表達得足夠清楚了)。
從現(xiàn)在看來,主頻500MHz以上還好辦一些,下死工夫總是可以做到的,用0.13微米的工藝 更是容易做到。難的是SPEC CPU2000的分值達到300分以上。所謂SPEC CPU2000,就是一 組國際公認的標(biāo)準測試程序,用這組程序在目標(biāo)機器上運行,根據(jù)實際運行時間算出該計 算機的運行速度指標(biāo)。這種標(biāo)準測試程序從SPEC CPU89、SPEC CPU92、SPEC CPU95、到 SPEC CPU2000已經(jīng)發(fā)展了好幾期。其中SPEC CPU2000覆蓋的應(yīng)用面最廣,包括文件壓縮、 FPGA布局布線、編譯器、組合優(yōu)化、國際象棋、文字處理、計算機視覺、編程語言、解釋 器、數(shù)據(jù)庫、布局布線模擬器、量子動力學(xué)、淺水模型、三維勢場求解、偏微分方程、三維圖形庫、計算流體動力學(xué)、圖象識別/神經(jīng)網(wǎng)絡(luò)、地震波傳播模擬、計算化學(xué)、數(shù)論/素數(shù)測試等等,光源代碼就有上百萬行。打分的標(biāo)準是把這組程序在Sun公司一臺300MHz的四發(fā)射Untra Sparc II 上運行的時間做為標(biāo)準運行時間,其分值為100分,其它機器運行時間跟標(biāo)準時間相比算出相應(yīng)的分值。一般來說,現(xiàn)在較流行的四發(fā)射的主流RISC處理器象Alpha 21264、MIPS R12000、IBM Power III等在400MHz到500MHz的情況下SPEC CPU2000的分值可以達到300分左右,而Pentium III在800MHz時SPEC CPU2000的浮點分值 才200多分。狗剩2號要達到300分,至少要與1GHz以上的PIII或PIV的性能相當(dāng)。因此,雖然做500MHz雖然也不容易,但更難的是SPEC CPU2000的分值達到300分以上。
提高處理器的性能,提高主頻和優(yōu)化軟硬件結(jié)構(gòu)不可偏廢,光強調(diào)主頻和光強調(diào)結(jié)構(gòu)都是不行的。就象要把100根木頭從A地扛到B地,甲每10分鐘一個來回,每次扛1根木頭;乙每20分鐘一個來回,每次扛4根木頭;丙60分鐘一個來回,每次扛6根木頭。我們不能根據(jù)甲跑得快(主頻高)就說甲的性能最高,也不能根據(jù)丙每次扛得最多(每拍執(zhí)行的指令多)就說丙的性能最高,性能是一個綜合的東西。當(dāng)然,還有其它要考慮的因素,如甲乙丙三人每小時的報酬(處理器的功耗、面積)等。雖然狗剩1號的成功對我們來說是一個巨大的進步,但有一件事我一直深引以為恨,那就是狗剩1號的性能沒有達到預(yù)想的目標(biāo)。
雖然主頻不低,但跑起程序來比起類似結(jié)構(gòu)的RISC處理器以及相同主頻的PII還有一些差距。SPEC CPU2000的分值也不高。我曾經(jīng)整日整夜地泡在機房運行各種測試程序,并試圖通過軟件優(yōu)化的方法提高性能。雖然取得了一些效果,但不理想。后來的性能分析表明,有些狗剩1號性能瓶頸其實完全是可以通過簡單的優(yōu)化克服的,可惜當(dāng)時項目推進得太快,沒有時間做充分的性能分析和優(yōu)化。這件事使我極其郁悶,因此把性能分析不夠作為狗剩1號設(shè)計過程的一個重要教訓(xùn),并發(fā)誓在狗剩2號的設(shè)計中要一血前恥。知恥近乎勇,后來狗剩2號步步為營的性能分析果真為狗剩2號提高性能發(fā)揮了巨大作用。在中科院領(lǐng)導(dǎo)對我們承擔(dān)的龍芯2號重大項目進行立項審查的會上,李老師、唐志敏和我在向院黨組匯報后準備離開時,江院長追出來跟李老師說:“李院士,我就把寶壓在你身上了”。在863計算機軟硬件主題專家對我們承擔(dān)的龍芯2號項目進行立項審查的會上,我做完報告后,專家組組長懷進鵬老師曾聲色俱厲地說:“胡偉武,這個項目是863計算機軟硬件主題最大的項目,完不成任務(wù)提頭來見!”這兩件事給我很大的觸動,讓我想起上甘嶺戰(zhàn)役前夕彭德懷曾對秦基偉說:“我們要對朝鮮的歷史負責(zé)”。
狗剩2號的設(shè)計在狗剩1號tapeout前就開始籌劃,主要是唐志敏和我圍繞我們申請的中科院和863的項目進行調(diào)研并確立在2004年項目結(jié)束時SPEC CPU2000的分值達到300分的目標(biāo) ,并在此基礎(chǔ)上確定64位結(jié)構(gòu)和4發(fā)射的目標(biāo)。根據(jù)項目目標(biāo)及狗剩1號研制的經(jīng)驗和教訓(xùn) ,我們確定了狗剩2號研制的如下三條設(shè)計原則。
一是充分發(fā)揮結(jié)構(gòu)設(shè)計優(yōu)勢和軟硬件協(xié)同的設(shè)計原則。即通過處理器中各個層次的并行性開發(fā)來提高性能。這些并行性包括指令級并行、數(shù)據(jù)級并行以及線程級并行。其中指令級并行主要是四發(fā)射結(jié)構(gòu)的實現(xiàn),即在指令流水線的任何一個階段每拍都執(zhí)行四條以上的指令。為了有效發(fā)揮多發(fā)射通路的效率,必須實現(xiàn)充分的亂序執(zhí)行技術(shù),減少指令間的互相 等待。數(shù)據(jù)級并行性的開發(fā)主要是通過SIMD的技術(shù)實現(xiàn)向量指令。線程級并行性包括單處理器的多線程技術(shù)以及多處理器的多線程技術(shù)。狗剩2號在并行性開發(fā)上主要開發(fā)指令級并行技術(shù),并通過把浮點部件與媒體處理共用的方法實現(xiàn)數(shù)據(jù)級并行的SIMD技術(shù)。軟硬件協(xié)同主要指通過編譯優(yōu)化及硬件對編譯器的支持提高性能,既不片面追求復(fù)雜的硬件大包大攬,也不把沉重的優(yōu)化負擔(dān)完全壓在編譯器身上。編譯器對提高性能十分重要,我們曾有這樣的體會:在同一臺機器上,用不同編譯器編譯出來的同一個程序,運行時間竟相差75%。
二是以物理設(shè)計指導(dǎo)結(jié)構(gòu)設(shè)計的原則 首先,流水線的最大邏輯路徑不是由體系結(jié)構(gòu)設(shè)計的需要來確定,而是由物理設(shè)計的要求來確定。即先確定每一級流水線的最大延遲并在此約束下進行結(jié)構(gòu)設(shè)計。其次,在做結(jié)構(gòu)設(shè)計時,心中要有物理設(shè)計的概念,即要明白相應(yīng)的邏輯在物理上是什么樣的。在狗剩2號設(shè)計過程中,結(jié)構(gòu)設(shè)計人員至少做到網(wǎng)表級。三是設(shè)計和實現(xiàn)方法上穩(wěn)扎穩(wěn)打的原則 首先,重視Cycle-by-Cycle的C模擬器的設(shè)計并把C模擬器作為詳細結(jié)構(gòu)設(shè)計的文檔是我們在狗剩1號開發(fā)過程中形成的一條最重要的經(jīng)驗,即“可執(zhí)行的結(jié)構(gòu)設(shè)計”的概念。在設(shè)計初期就通過充分的仿真與驗證不僅不會影響進度,而且會加快進度。此外,狗剩2號的功能設(shè)計和物理設(shè)計也分成幾步。第一步,還是采用標(biāo)準單元設(shè)計,只在很有限的局部做全定制(如寄存器堆),主頻200-300MHz以上,功能上不實現(xiàn)二級CACHE,爭取盡快完成流片。第二步,功能上增加二級CACHE接口或/及DDR接口等,物理設(shè)計上使用更多的宏單元,但設(shè)計方法還是基于標(biāo)準單元的方法,主頻在300-400MHz以上。第三步,功能上增加對多處理器系統(tǒng)的支持,在更多的地方使用全定制單元或使用全定制流程,主頻爭取在400-500MHz以上。狗剩2號最后的流片將以全定制為主。
狗剩2號的設(shè)計包括結(jié)構(gòu)設(shè)計、邏輯設(shè)計以及物理設(shè)計三個階段,這三個階段互相重疊,其中結(jié)構(gòu)設(shè)計階段和狗剩1號的設(shè)計也有所重疊。狗剩2號的結(jié)構(gòu)設(shè)計斷斷續(xù)續(xù)地進行了好幾個月。剛開始是在2002年四、五月份在進行狗剩1號物理設(shè)計的同時對狗剩2號的系統(tǒng)結(jié)構(gòu)進行了初步的考慮。在對市場上的主流處理器如Alpha 21264、MIPS R10000、Ultra Sparc III、Power III、HP PA8700、PIV、IA64等及學(xué)術(shù)界的主要工作進行調(diào)研的基礎(chǔ)上基本確定了狗剩2號的寄存器重命名、動態(tài)調(diào)度以及運算部件的架構(gòu)。到六、七月份隨著狗剩1號物理設(shè)計和系統(tǒng)開發(fā)工作的展開,狗剩2號的結(jié)構(gòu)設(shè)計幾乎停了下來。那時候我們組一共只有二、三十號人,很多人員的工作都是重疊的,根本沒有力量同時做兩件事情。
在2002年7月中旬狗剩1號tapeout之后,利用等待芯片回來的時間把狗剩2號的結(jié)構(gòu)設(shè)計再次提上日程。7月15日研究生部的靳曉明老師打電話叫我到在四川廣元召開的研究生學(xué)術(shù)研討會上做個特邀報告,本來應(yīng)該是徐志偉老師做的報告,徐老師臨時有事去不了因此派我救場。唐志敏已經(jīng)告訴靳老師我剛tapeout一個芯片,應(yīng)該有空,所以推也推不掉。開完會后還要去九寨溝,需要三、四天才能回來。我走之前臨時決定把狗剩2號的部分設(shè)計人員帶到廣元,準備在路上對狗剩2號的結(jié)構(gòu)進行討論。我和中科院研究生院的兩位老師一起坐火車頭天走,安虹老師、張福新和范東睿坐飛機第二天走,幾乎同時到的廣元。那時候我女兒正在放暑假,我愛人在狗剩1號tapeout之后剛到一個公司上班,因此我把6歲的女兒也一起帶上了。
后來的事實證明我臨走前做的決定是十分正確的,在廣元和九寨溝的幾天效率極高,基本確定了狗剩2號的結(jié)構(gòu)框架。那幾天我們白天根據(jù)會務(wù)組的安排活動,晚上討論狗剩2號的結(jié)構(gòu),并且根據(jù)討論結(jié)果形成狗剩2號結(jié)構(gòu)設(shè)計的初步文檔,每天都到凌晨一、二點。由于處理器的寄存器重命名以及動態(tài)調(diào)度結(jié)構(gòu)已經(jīng)基本確定,因此討論的重點是取指和訪存部件的結(jié)構(gòu)。
在從廣元去九寨溝的路上我和范東睿坐在汽車的最后一排討論狗剩2號的取指和譯碼部分 的結(jié)構(gòu),汽車在路上顛簸了一整天,我們也討論了一整天。取指與譯碼部分的設(shè)計空間很大,包括采用何種轉(zhuǎn)移猜測算法、多發(fā)射情況下如何消除轉(zhuǎn)移指令后面的延遲槽、取指及轉(zhuǎn)移猜測是以指令為單位還是以發(fā)射塊(四條指令)為單位、轉(zhuǎn)移猜測是在取指還是在譯碼階段進行、修正BHT和BTB的時機、如何提高指令CACHE的性能、以及指令TLB和數(shù)據(jù)TLB 的關(guān)系等。其中如何消除轉(zhuǎn)移指令后面的延遲槽討論的時間最長,主要是對傳統(tǒng)的BTB方法和Alpha 21264中采用的line prediction方法進行反復(fù)的比較和分析。我從小就喜歡坐比較顛簸的汽車,汽車越顛精神越好,范東睿精神也不錯,因此一路上效率極高。晚上8點汽車到達九寨溝時,狗剩2號的取指部分架構(gòu)已基本確定。
訪存部分的結(jié)構(gòu)比取指部分復(fù)雜。一方面,它是與操作系統(tǒng)關(guān)系最密切的部分,其功能是否完善是支持通用操作系統(tǒng)的關(guān)鍵因素;另一方面,它是提高處理器性能的核心部件之一。如果CACHE訪問效率不高,流水線的其它部分設(shè)計得再好也沒有用。這一點在狗剩1號中我們已經(jīng)有所體會。學(xué)術(shù)界與企業(yè)界都對如何提高訪存性能作了大量研究,設(shè)計空間很大,核心問題包括如何降低流水線延遲、如何提高CACHE命中率和降低由于CACHE不命中引起的等待延遲、以及如何解決訪存的RAW、WAR、和WAW相關(guān)等等。在隨后的幾天中,我們對這些方面進行了反復(fù)的權(quán)衡和討論。直到在回北京的火車上才有比較粗的思路。
有意思的是,一路下來,我女兒看我們的工作,耳濡目染,對CPU設(shè)計也有了自己的心得 。直到今天我問她什么是CPU,她還說“CPU就是在一張紙上畫些方框,然后用線和箭頭把這些方塊連起來,再涂上點顏色,寫上一些字,最后一燒,燒出一個亮晶晶的小方塊”。
最近我女兒經(jīng)常在用狗剩2號做的Linux PC上玩游戲。我告訴她這就是我們在九寨溝畫的 方框“燒”出來的,她感到很詫異。在2002年8月10日狗剩1號首片調(diào)試成功之后,狗剩2號的設(shè)計工作又慢了下來,全組的主要力量放在了狗剩1號的系統(tǒng)開發(fā)上面。雖然由于狗剩1號的系統(tǒng)開發(fā)和性能分析耽誤了一些時間,但我自己在狗剩1號上玩了近一個月后有很大的收獲。尤其是對性能和主頻的關(guān)系有了更深入的認識。比如,對于有一些訪存密集的應(yīng)用,主板頻率83MHz而CPU頻率250MHz時的性能還不如主板頻率100MHz而CPU頻率200MHz的性能。現(xiàn)在想起來,一個處理器的性能就象一個城市的交通系統(tǒng)的吞吐率,可能由于某幾處的堵塞而影響整個城市的吞吐率,只要把這幾處疏通了,雖然花的力氣不大,但吞吐率會極大地提高。2002年9月28日狗剩1號發(fā)布會后,狗剩2號的設(shè)計工作全面展開。10月2日,我?guī)е鴱埜P潞屠钭嫠傻侥感V袊拼罄檬婚L假進行狗剩2號的C模擬器封閉開發(fā),順便向母校報告一下我們的工作。在科大借了半間原來的庫房呆了一個多星期,基本完成了C模擬器的代碼編寫。在對結(jié)構(gòu)進行細化的過程中發(fā)現(xiàn)了好多原來沒有考慮到的問題。對于這些問題我們有時候爭辯得很激烈。例如在轉(zhuǎn)移猜錯取消時需要判斷正在執(zhí)行的指令中哪些是該轉(zhuǎn)移指令前面的,哪些是該轉(zhuǎn)移指令后面的,張福新和李祖松的觀點是參照MIPS R10000使用的方法,而我覺得那個方法太麻煩,希望有更簡潔的方法。我們一直爭論了兩天,在爭論的過程中互相啟發(fā),終于找到了一種簡潔而高效的方法。
2002年10月8日回北京時狗剩2號的C模擬器已經(jīng)基本成型。我們繼續(xù)在我的辦公室進行半封閉式的開發(fā),主要是繼續(xù)完善C模擬器并開始調(diào)試。那段時間我們每周只有二、四、六晚上休息,其它時間都在調(diào)試。調(diào)試過程中也調(diào)動組里的其它人寫了不少測試向量。11月中旬在C模擬器中成功啟動LINUX操作系統(tǒng),開始對C模擬器進行性能優(yōu)化以加快模擬速度并用C模擬器對狗剩2號的結(jié)構(gòu)進行性能分析。
在此期間以及以后的幾個月內(nèi),我們在C模擬器上運行了完整的SPEC CPU2000的幾乎所有程序以及八十年代比較流行的性能測試程序dhrystone和whetdstone等,對狗剩2號的性能進行初步的分析。在運行上述程序過程中還發(fā)現(xiàn)了不少設(shè)計上的bug和考慮不周的地方。印象比較深刻的是由于訪存操作的亂序執(zhí)行導(dǎo)致兩個或多個訪存操作之間互相替換CACHE 塊并引起死鎖。另外一件印象比較深刻的是MIPS指令系統(tǒng)規(guī)定轉(zhuǎn)移指令的延遲槽指令不能是轉(zhuǎn)移指令,否則處理器的行為不確定,但我們在C模擬器中發(fā)現(xiàn)在我們的設(shè)計中如果轉(zhuǎn)移指令的延遲槽指令也是轉(zhuǎn)移指令時也會導(dǎo)致處理器死鎖。雖然這是由錯誤的程序引起的,但也是結(jié)構(gòu)設(shè)計考慮不周的地方,對于錯誤的程序我們可以給出錯誤的結(jié)果,但不能把機器搞死。
由于張福新和李祖松的加入,狗剩2號的C模擬器比狗剩1號完善很多,包括checkpoint在內(nèi)的很多功能都加到模擬器中,此外,C模擬器的運算速度也大大提高了。張福新還順手開發(fā)了不少小工具。
2002年11月底,我覺得C模擬器已經(jīng)基本穩(wěn)定,就召開了狗剩1號總結(jié)以及狗剩2號部署的會議,全面部署狗剩2號的RTL設(shè)計工作。
2002年12月初我們組建了RTL設(shè)計的隊伍,由于我們?nèi)耸钟邢蓿琑TL編寫的人員都是從各組抽調(diào)的,我自己也負責(zé)寄存器重命名和幾個隊列模塊。狗剩2號的RTL設(shè)計大致可以分為三個階段。
第一階段為設(shè)計階段。從12月初開始大家花了約半個月的時間了解狗剩2號的結(jié)構(gòu),同時我開始進行頂層模塊的設(shè)計,主要是每個模塊的互連關(guān)系、接口總線及觸發(fā)器的定義。12月28日完成頂層模塊的設(shè)計并啟動各模塊RTL的編寫。由于有Cycle-by-Cycle的C模擬器作為參照,2003年1月14日就完成所有模塊RTL的編寫并編譯通過,1月21日成功運行第一條指令。在此基礎(chǔ)上,經(jīng)過三天三夜的努力,到1月25日成功運行狗剩1號中使用的包括所有MIPS指令的一段功能測試程序。由于2002年春節(jié)沒有放假,因此1月25日后全組放假。
第二階段為聯(lián)調(diào)階段。春節(jié)后開始在RTL仿真環(huán)境上運行LINUX操作系統(tǒng)。經(jīng)過連續(xù)一個多星期的努力,2月18日成功運行LINUX操作系統(tǒng)。在狗剩1號的聯(lián)調(diào)過程中,在運行LINUX后,整個流水線的設(shè)計就基本上沒有發(fā)現(xiàn)什么問題,只發(fā)現(xiàn)了部分與浮點有關(guān)的問題。但在狗剩2號中,運行LINUX后試圖運行whetdstone時碰到了巨大的困難,甚至一度出現(xiàn)停滯不前的情況。因為錯誤出現(xiàn)在調(diào)用動態(tài)庫的過程中,而且沒有動態(tài)庫的源代碼無法調(diào)試。不得已我組織RTL編寫人員于3月7日和8日進行了兩天的封閉式自查。通過自查發(fā)現(xiàn)了大大小小20多個錯誤,使運行whetdstone的聯(lián)調(diào)取得突破性的進展。后來我們又進行了兩次封閉自查,只發(fā)現(xiàn)一、二處小錯誤。