20060725

[轉貼存檔] x86真能無所不在?

本文僅供個人備份存檔,如果有侵犯版權之虞,請e-mail告知,感謝。
本文原載自iThome產品技術報 2006.07.25,網頁連結為ithomeonline所有。
還好電子版總算出現了,不然這一篇文章真的會打到死。

x86真能無所不在?

所 謂的「計算機結構(Computer Architecture)」,是由IBM在1964年創造給S/360大型主機用的名詞,用來表示「程式設計者可以看到的指令集 (Instruction Set)」,指令集如同「電腦的語言」,指令集架構相同的不同電腦可以執行相同的軟體,像英特爾和AMD的x86處理器都可以執行由x86指令集所撰寫出 來的程式碼。

因回朔相容之故,指令集架構的良窳 和新增指令的方式,深深影響著處理器與電腦整體系統架構的後繼發展。如何針對不同的需求, 設計出可長可久,利於實作產品,又兼備導入新技術彈性的指令集,是計算機結構教科書的作者念茲在茲的議題。但是,十多年來這些計算機組織結構教科書中的標 準錯誤示範-x86 指令集,卻長期支配個人電腦與低階伺服器市場。

x86先天不良,後天失調的原罪

AMD 負責K5處理 器設計的總工程師Mike Johnson,曾在1994年講過一句被後人經常引用的名言:「x86不只複雜,它根本毫無道理可尋。X86的複雜性並非不可克服......x86最 大的弱點是缺乏足夠的暫存器與難以處理的複雜定址模式」,一語道破最普及的指令集架構,實際上卻充滿缺陷的設計。

為 了彌補缺陷,新型 x86處理器都普遍導入了大量加速機制,暫存器更名(Register Renaming)減輕了暫存器不足的影響,大型化快取記憶體彌補了x86指令集記憶體存取密集(Memory Intensive)的行為模式,而所謂「將複雜的CISC指令轉譯為數個簡單的RISC微指令」更被視為拯救x86的「仙丹良藥」。

但 這些解決問題了嗎?其實不然。指令集編碼長度不一、格式混亂與定址模式複雜,影響的並非僅限於指令解碼器及指令擷取單元。設計一顆處理器,最困難的部分是 產生控制訊號的控制單元,特別是中斷(Interrupt)與例外(Exception)處理機制,例如系統外部周邊單元,藉由產生中斷讓處理器先執行輸 出入動作,或者是發生算術溢位時,讓處理器產生例外,再讓作業系統的設陷(Trap)機制取得處理器控制權。發生中斷或例外之類的事件,處理器都必須事先 儲存執行狀態,以確保結束後可以恢復正常的程式流程。

換言之,假如今天一個指令集架構,指令編碼長度從1到17位元組不等,定址模式極為複雜,運算元同時包含記憶體與暫存器,該指令集的控制單元就非常難設計,更罔論「追求高效能」。歷史上成功的x86處理器,清一色皆有漫長的開發時程與天文數字般的研發成本,其因在此。

指令集架構的複雜性直接影響可靠性技術的導入度

所 謂的「高階伺服器」並不是處理器數量多就可了事,處理器與系統架構所需的可靠性功能(RAS, Reliability/Availability/Serviceability)才是重點,如此才能確保系統的穩定度,越高階的伺服器越沒有停止服務 的本錢,這時指令集架構越單純、越易於設計製造,就有更多的空間去實作RAS機制,反之亦同。



RISC指令集對高階伺服器最重要的價值,就是利於設計與製造,便於導入更完整的系統RAS功能。資料來源:Fujitsu。

像 標榜「和大型主機同等級RAS」的Fujitsu SPARC64系列處理器,整顆處理器的所有電路均受到ECC/Parity保護,超過90%的面積可承受單位元錯誤,兼具指令執行錯誤重試功能,這都是 任何一顆x86處理器所遠遠不及的能力。臺灣Fujitsu系統工程師吳明宗即表示,「指令集換成x86,幾乎不可能做到」,IBM和Sun也保持相同的 觀點。值得一提的是,Fujitsu內負責研發SPARC64的人數,僅有三百人,隨便一顆x86處理器都遠超過這個數字,以Pentium 4為例,英特爾就動員了5000人以上。

臺 灣Sun技術副總戴碧勳表示,RISC處理器因設計簡單,自然有較大的餘裕去改進可靠度, SPARC這點凌駕Opteron,後者其實並未達到「Service Grade」的等級。「曾經有某晶圓廠用x86伺服器計算光罩模擬,算出來導線竟然少兩根,最後只好購置四套來自不同廠商的同規格伺服器,用來比對執行結 果」。關於Sun剛發表的8路Opteron伺服器X4600,他也表示,其產品定位仍僅限中小企業,而一年之內Sun並沒有開發更大型Opteron伺 服器的計畫,高階系統仍以SPARC處理器為主力。

市 場需求更是關鍵性的因素。x86處理器之所以給人「便宜」的印象,不外乎市場規模夠 大,攤平天文數字般的研發成本,這是x86藉由成本優勢站穩低階伺服器市場的基礎:個人電腦所使用的桌上型處理器和伺服器處理器採用相同的核心。但這也是 一把雙面刃:x86伺服器處理器就從此受制於個人電腦,不能充分滿足高階伺服器的需要。

RISC享有經過歷史驗證的大型多路處理器架構

目 前市面上唯二可以見到的大型多路x86伺服器,僅有IBM X3與Unisys ES7000,數量及歷史均無法與RISC相提並論。除了x86處理器限於市場定位,遲遲未有廠商發展大型多路x86架構外,指令集的缺陷也是一個主因。 在十幾年前,當時的製程技術與設計能力都無法實作大型化快取記憶體及高效率的系統連結架構,x86特別記憶體存取密集的特性,就成為一大瓶頸。

會 有人這樣想:那廠商大可以重新開始研發新的多路x86處理器架構,不就得了?問題是,高階伺服器的系統架構都需要漫長的時間來驗證改進,今天站上檯面的高 階RISC伺服器,其系統架構無一不是擁有十多年的累積經驗,才證明是極為可靠的產品。IBM X3和Unisys ES7000也都奠基於大型主機的基礎,而且因市場規模不大,所費不貲,相較於高階RISC系統,並無價格優勢。

x86指令集甩不掉的歷史包袱

很 多人應該還記得,多年前英特爾曾爆發震驚全球的Pentium處理器浮點臭蟲事件,讓不少人首度意識到,原來看似高深莫測的「高科技結晶」,也是有可能因 設計上的失誤,導致程式執行錯誤。事實上,不分指令集,在處理器的電晶體數目動輒以上億為基本單位的今天,處理器技術規格資料中的勘誤表,發布數十、甚至 上百個臭蟲,早已司空見慣。Itanium 2也累積了111個臭蟲,AMD K8家族則達155個。

有臭蟲倒還不是大問題,修正就可以 了(多數處理器都提供微碼修補能力)。問題是:為了相容「利用」這些處理器臭蟲的應用程式,無法修正,那該怎麼辦?偏偏x86累積下來的應用程式又如此之 多,所以才曾有人這樣開玩笑,開發一顆x86處理器,最大的挑戰是:你要如何確定它可以相容所有的舊程式?特別是早期的x86處理器,很多未定義的運算碼 並沒有遮蔽掉,假設被人發現,又拿來用了,以後的處理器就只好乖乖的作進去。由此可知,對一個指令集來說,缺乏應用程式是個問題,但應用程式太多,更是一 種負擔。

最有名的案例,莫過於「Bubble Bobble(泡泡龍)」這個遊戲,在486上會因計時迴圈溢出(Timing Loop Overflow)無法執行,但又在Pentium 4「復活」了。在x86的歷史上,此類看似不可思議的案例可謂不勝枚舉。尤其x86處理器經歷過太多世代,指令集從16位元、24位元、32位元疊床架屋 至64位元,連帶混亂的記憶體定址模式。

另一個隨處可見的例子,很多人可以在電腦的BIOS中看到,為了相容過去8086應用程式的 「A20 Gate」選項。8086處理器的定址模式,是藉由16位元的節區(Segment)位址與另一個16位元的節區內(Offset)位址,組成20位元和 1MB的定址空間。在1986年,Quarterdeck與微軟的程式設計師發現,一旦打開80286/386/486的A20(第21條定址線)邏輯 閘,假使將程式碼放在960kB與1024kB之間,就多出1024kB之後的一個64kB空間。簡而言之,DOS可透過特殊的設計來使用這塊多餘的 64kB記憶體,就是微軟HMA(高記憶體區)與HIMEM.SYS驅動程式的由來,源自80286與更高階x86處理器的臭蟲。

問題來 了,80286以後的處理器就算是8086真實模式,A20邏輯閘可能因節區和節內組成位址超過1MB而啟動,無法正常相容8086應用程式,因此IBM 想到利用8042鍵盤控制器上的某訊號腳位,作為控制A20邏輯閘的開關。打開的話,就可相容8086,但不打開的話,又會因少一條定址線,讓保護模式的 可定址記憶體空間少掉一半。這就是該功能的用途,導至今日的所有x86作業系統也必須保留打開該功能的程式碼。

先天架構不良的原罪,進而 限制x86引進虛擬化等新技術的可能性。當初VMWare等虛擬化軟體廠商在x86上吃足苦頭,因為x86無法透過設陷機制攔截每個指令的動作,只能土法 煉鋼,讓每個指令後面都接著一個中斷,代價就是犧牲效能,這到了英特爾的Vanderpool和AMD的 Pacifica後才解決。當其他RISC陸續支援條件執行機制(Conditional Execution),x86卻受限幾無餘裕的指令編碼,僅能新增幾個簡單的指令。

那 是不是代表,RISC指令集就沒有這些問題?答案當 然是否定的,但對於同步發展處理器與作業系統的RISC/Unix廠商而言,卻容易解決。像 IBM第一代的Power處理器也曾留下不少不合時宜、後來在PowerPC取消的指令,Power4以後的系統,只要執行到這些指令,即可透過處理器的 設陷機制,呼叫AIX內的模擬軟體執行,毋需讓新的Power處理器繼承這些包袱,「封閉」系統的先天優勢,可見一斑。

戴 碧勳坦言,一個 系統的可靠度是需要軟硬體彼此高度配合,這是x86平臺的弱點。身為電腦的語言,指令集的「穩定度」也是關鍵,像SPARC V9指令集已經相當完備,數年來一直無須改版新增指令,但x86處理器廠商卻樂此不疲,從MMX、3DNow!、SSE、SSE2到SSE3,英特爾近期 又增加16個SSE4指令,英特爾與AMD的新增指令集並不完全相容。同樣是虛擬化技術,英特爾的Vanterpool和AMD的Pacifica就截然 不同,增加發生軟體相容性問題的機率。

臺灣Fujitsu產品經理張仲秋對此也表示,x86平臺本來就缺乏高穩定性的作業系統,又欠缺具備軟硬體整合能力的系統廠商,市場仍需要RISC處理器與Unix作業系統。

隱 而不現的是,x86指令集先天的複雜性,使得實作高效能x86處理器的廠商多半都採用極為特殊的微架構(如驚世駭俗的英特爾 NetBurst),效能延展性不佳,微架構的壽命也不長。但其他RISC處理器,無論IBM的Power4、Sun的UltraSPARC III和Fujitsu的SPARC64V,都是一個微架構「一路用到底」,頂多小幅改良。本來不是說RISC處理器易於設計嗎?為何如此?道理很簡單, 這樣會比較穩定,避免更換微架構造成的潛在風險。

邁向未來:指令集架構將決定多核心處理器的發展潛力

在邁向多核心架構的 路上,無可避免的,要縮小單一核心的晶粒面積,放棄追求高時脈的超深指令管線,進一步精簡處理器的核心複雜度。這時處理器所採用的指令集架構就扮演著舉足 輕重的角色,指令集架構越易於實作與驗證,越不需要複雜的核心就可達到合理的效能,就越適合多核心處理器,導入更完善的可靠性機制與省電功能,更可縮短產 品研發的時間。

這也是Sun Niagara支援4執行緒的單一處理器核心,可以簡單到僅有4萬個邏輯閘,英特爾會大費周章發展IA-64指令集與Itanium處理器,IBM想用 Power取代S/360的主因。在處理器與半導體製程研發成本如火箭般一飛沖天的時代,相較於CISC,RISC指令集在這裡就佔了很大的便宜。但在沒 有導入極為複雜的實作加速機制之前,x86處理器的效能表現都慘不忍睹。x86在嵌入式處理器市場沒有地位,都是RISC的天下,連英特爾的嵌入式與網路 處理器產品線都是ARM指令集,而不是x86,其理至明。

更重要的是,伺服器處理器逐步走向多執行緒的省電架構,開始與桌上型處理器的需求分道揚鑣,失去龐大個人電腦市場的保護傘,x86伺服器處理器是否有足夠的市場規模,去分擔開發x86核心的高昂成本與漫長時程,仍是一個問號。

回 顧今日Itanium、RISC與x86伺服器處理器的現況,即可發現,多年來眾多「先賢先烈」所預期的技術發展趨勢,似乎紛紛一語成讖。我們有充分的理 由相信,x86仍將在低階伺服器與個人電腦市場扮演主角,只是要站上高階市場,完全取代RISC,依舊遍地荊棘,困難重重。也許假以時日,這並非不可能的 任務-但絕對不是現在。文⊙劉人豪

沒有留言: