《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 業(yè)界動(dòng)態(tài) > 獨(dú)霸市場(chǎng)數(shù)十年,X86處理器究竟難在哪里?

獨(dú)霸市場(chǎng)數(shù)十年,X86處理器究竟難在哪里?

2020-10-08
來(lái)源:半導(dǎo)體行業(yè)觀察
關(guān)鍵詞: X86 處理器 AMD 英特爾

  這些年來(lái),相信各位閑閑沒(méi)事,就會(huì)在網(wǎng)路各角落看到,不同領(lǐng)域的各路英雄好漢一直有相同疑惑:為何今天的x86 處理器市場(chǎng),臺(tái)面上只剩下英特爾AMD 兩家美國(guó)公司?頂多再加個(gè)存在感稀薄的臺(tái)灣VIA,和少人知悉的俄羅斯Elbrus?對(duì)技術(shù)有點(diǎn)基礎(chǔ)認(rèn)知的人,多少會(huì)直接想到「x86 指令集很復(fù)雜很難搞,又有英特爾的授權(quán)問(wèn)題,所以x86 處理器非常不好做」之類的標(biāo)準(zhǔn)答案。

  當(dāng)然,更不乏某些夜郎自大的高論,像「就算x86 指令集再?gòu)?fù)雜,控制單元也還是很好設(shè)計(jì)」、「微指令轉(zhuǎn)譯早就克服了所有x86 指令集的瓶頸」等。拜托,「做出勉強(qiáng)能動(dòng)的東西」和「開發(fā)出有市場(chǎng)競(jìng)爭(zhēng)力的產(chǎn)品」完全是天差地別的兩件事,要不然你以為英特爾和AMD 天文數(shù)字般的產(chǎn)品開發(fā)經(jīng)費(fèi),都拿去填海了嗎?

  總之,高效能x86 處理器之所以難做,混雜了諸多技術(shù)和商業(yè)因素,暗藏在臺(tái)面下的細(xì)節(jié)非外人足以道也。但我們可以回到x86 處理器最重要的歷史轉(zhuǎn)捩點(diǎn):1993 年P(guān)entium 處理器,抽絲剝繭一般人難以察覺(jué)到的蛛絲馬跡。

  以「唯偏執(zhí)狂得以生存」(Only the Paranoid Survive)留名于世的英特爾創(chuàng)辦人之一Andy Grove 曾經(jīng)說(shuō),2003 年的Centrino 是英特爾的「第二個(gè)兒子」與「十年來(lái)最重要的品牌」 ,那「第一個(gè)兒子」和「十年前最重要的品牌」,想當(dāng)然爾就是1993 年的Pentium 了。

  Pentium 之名起源于希臘文的Penta(意思是「五」),再加上拉丁文的ium 結(jié)尾,意指「第五代x86 處理器」,英特爾自此也不再使用80×86 來(lái)定義處理器世代(要不然現(xiàn)在還真的講不出來(lái)到底是「幾86」)。而Pentium 也在不知不覺(jué)中,一步步轉(zhuǎn)型為入門級(jí)低價(jià)處理器品牌,更不再受限于1993 年的P5,進(jìn)而橫跨歷代英特爾的超純量(Superscalar)x86 微架構(gòu)。

  原始Pentium 里的P5 處理器微架構(gòu),并沒(méi)有像后繼Pentium Pro 的P6 活得如此之長(zhǎng),影響又如此深遠(yuǎn)(到2011 年Sandy Bridge 才結(jié)束)。但Pentium 問(wèn)世的時(shí)機(jī),卻是眾多歷史機(jī)運(yùn)的集大成:

  「x86 處理器走向高效能化」。

  「x86 開始與RISC 正面競(jìng)爭(zhēng)」。

  「x86 指令集的缺陷讓廠商感到棘手」。

  「x86 處理器進(jìn)軍多處理器平臺(tái)」。

  「?jìng)€(gè)人電腦市場(chǎng)因Windows 95 的問(wèn)世而蓬勃成長(zhǎng)」。

  「筆記型電腦即將逐漸普及」。

  「英特爾默默埋下讓擅長(zhǎng)改良的以色列海法研發(fā)團(tuán)隊(duì),主導(dǎo)x86 處理器技術(shù)發(fā)展」。

  「x86指令集的相容性,成為其他競(jìng)爭(zhēng)者的潛在障礙,也造成軟件開發(fā)商的困擾」。

  這些因素交錯(cuò),奠定了之后25 年技術(shù)演進(jìn)與市場(chǎng)發(fā)展的基礎(chǔ)邏輯,連時(shí)下「AMD 處理器的核心太多,竟然造成Windows 操作系統(tǒng)的大麻煩」,也和Pentium 留下的遺產(chǎn),多少有些千絲萬(wàn)縷的糾結(jié)。

  既然連AMD Zen成功的背后,都有這么多不為人知的故事,了解英特爾「Landmark」芯片Pentium的軌跡,將有助跳脫琳瑯滿目的技術(shù)營(yíng)銷名詞,重新建立屬于自己的「x86處理器世界觀」 ,值得各位細(xì)細(xì)品味。

  x86 指令集先天不足后天失調(diào)的原罪

  催生「計(jì)算機(jī)結(jié)構(gòu)」(Computer Architecture)一詞的「指令集架構(gòu)」(Instruction Set Architecture),為「電腦的基礎(chǔ)語(yǔ)言」與「軟硬件中間的介面」(Interface Between Hardware and Software),相同指令集的電腦理應(yīng)可執(zhí)行一樣軟件,具備彼此相容性,對(duì)電腦與處理器微架構(gòu)(Microarchitecture)的未來(lái)發(fā)展有舉足輕重的影響力。

  不同的時(shí)空背景,也會(huì)產(chǎn)生相異的指令集設(shè)計(jì)理念,沒(méi)有絕對(duì)的優(yōu)劣對(duì)錯(cuò)──x86算是少見(jiàn)的例外,另一個(gè)則是DEC VAX,兩者的共同點(diǎn)只有「著毋庸議」的糟糕,英特爾IA-64(Itanium)和DEC Alpha的激烈反動(dòng),足以證明連生父都如此厭惡小孩。

  說(shuō)到指令集架構(gòu)如何影響處理器微架構(gòu)的設(shè)計(jì),這幾年來(lái)最有名的實(shí)例,就是蘋果利用充分掌握封閉平臺(tái)的優(yōu)勢(shì)在「最短時(shí)間內(nèi)驅(qū)逐32位元應(yīng)用程序」,掌握ARM指令集邁向64位元的過(guò)程帶來(lái)的改革與機(jī)會(huì),讓A7之后的自家ARM處理器,徹底為64位元的ARMv8-A量身訂做,研發(fā)出一系列能同時(shí)有效處理更多指令的先進(jìn)微架構(gòu)。

  所謂的CISC(復(fù)雜指令集)出自記憶體容量稀少、缺乏成熟的高階語(yǔ)言編譯器、大多數(shù)人使用語(yǔ)言撰寫程序的時(shí)空背景,程序設(shè)計(jì)者寄望直接用透過(guò)微碼(Microcode)組成功能強(qiáng)大的單一指令,像十進(jìn)位數(shù)字和復(fù)雜字串處理等,撰寫應(yīng)用程序。

  相較之下,RISC(精簡(jiǎn)指令集)則是在「萬(wàn)事皆備」的環(huán)境,追求更快更便宜的電腦,將電晶體預(yù)算砸在「最經(jīng)常被使用的簡(jiǎn)單指令和運(yùn)算元定址模式」的刀口上,盡量用硬件線路去取代微碼,并藉由強(qiáng)制僅載入(Load)/儲(chǔ)存(Store)指令可存取記憶體,搭配大型化的資料暫存器與快取記憶體,填補(bǔ)處理器和記憶體之間越來(lái)越大的效率鴻溝。

  時(shí)過(guò)境遷,在x86 主宰云端資料中心、中低階伺服器、工作站、桌機(jī)一路到筆電的今日,可能已經(jīng)沒(méi)有多少人能回想起「RISC 與CISC 之爭(zhēng)」曾發(fā)生在1990 年代初期的史跡,但畢竟x86 指令集公認(rèn)是充滿缺陷的產(chǎn)物,連當(dāng)代最偉大的計(jì)算機(jī)結(jié)構(gòu)教科書都「白紙黑字」并「燒錄」于無(wú)數(shù)莘莘學(xué)子的腦中,而AMD K5 的創(chuàng)造者更是用一句「毫無(wú)道理可循」(it just doesn't make a lot of sense)一錘定音,幾無(wú)爭(zhēng)議空間。

  讓人滿臉黑線的,只有動(dòng)輒揮出「逆向思考全壘打」的大恩大德,將x86 的市場(chǎng)勝利,視為「x86 指令集架構(gòu)優(yōu)良」佐證的天真論點(diǎn),并時(shí)有所聞,連ARM 都比x86 更「記憶體存取密集」(Memory-Intensive)這種話都講得出口。

  我們先來(lái)瞧瞧當(dāng)年AMD K5 的總工程師Mike Johnson 怎么評(píng)論x86 指令集,由設(shè)計(jì)x86 處理器的大師級(jí)人物(他本人的確是超純量管線技術(shù)的先驅(qū)者,那份變成首本超純量技術(shù)專書的史丹佛大學(xué)博士論文非常有名,附錄更深度分析設(shè)計(jì)超純量x86 處理器的困難點(diǎn))寫出來(lái)的批評(píng),特別有說(shuō)服力,也一再被后人引述:

  The complexity of the x86 is not an impassable barrier. The x86 really isn't all that complex—it just doesn't make a lot of sense… The biggest weakness in the x86 instruction set is the lack of registers coupled with an extremely painful addressing scheme.

  從這短短一段話,可看到幾個(gè)重點(diǎn):

  「毫無(wú)道理可循」(doesn't make a lot of sense):相較于指令編碼程度統(tǒng)──4 Bytes(32 bits)的多數(shù)RISC體系,x86指令集的格式和編碼極度混亂,長(zhǎng)短粗細(xì)肥瘦不一,從1~17 Bytes都有可能。影響所及,遍及所有的環(huán)節(jié),從快取記憶體擷取指令、實(shí)作指令管線化,到處理器發(fā)生中斷例外時(shí)要迅速儲(chǔ)存執(zhí)行狀態(tài)并盡快回復(fù)等,都造成非常嚴(yán)重的后遺癥,激增研制高效能x86處理器的門檻,也增加驗(yàn)證產(chǎn)品的時(shí)間與成本。

  「缺乏足夠的暫存器」(the lack of registers):一般RISC指令集都會(huì)定義32個(gè)通用資料暫存器(講的精確一點(diǎn)是31個(gè))或浮點(diǎn)運(yùn)算暫存器,但x86在64位元和AVX之前,怎么樣都只有少少的8個(gè)(因?yàn)橐鄣鬍SP和EBP,說(shuō)6個(gè)或許比較貼切)。當(dāng)引進(jìn)指令管線化和更先進(jìn)的超純量管線后,自然就激增了暫存器沖突的機(jī)率,這也是激發(fā)x86處理器擁有強(qiáng)大非循序指令執(zhí)行(暫存器重新更名)與高效率記憶體子系統(tǒng)的主因。

  「讓人感到極度痛苦的定址模式」(extremely painful addressing scheme):定址模式講得白話一點(diǎn)是「存取所需運(yùn)算元(運(yùn)算的目標(biāo),例如某個(gè)暫存器或某個(gè)記憶體位址)的方式」,歷經(jīng)多年疊床架屋的x86定址模式,尤其是惡名昭彰的節(jié)區(qū)記憶體(Segmentation),不只加重產(chǎn)生有效位址的工作負(fù)荷,也激增整數(shù)邏輯運(yùn)算(ALU)和控制單元的復(fù)雜度,「副作用」跟第一項(xiàng)「毫無(wú)道理可尋」可謂不相上下。

  這些燙手山竽,就是1980 年代末期和1990 年代初期,眾多企圖研制高效能x86 處理器的有志之士,包含不小心制造出這些「炸彈」的英特爾,不得不面對(duì)并設(shè)法克服的挑戰(zhàn),身為x86 世界首顆「超純量(Superscalar)管線」處理器的Pentium,則是第一個(gè)提出的「有效解決方案」,英特爾為此付出了不小代價(jià)。

  一個(gè)時(shí)脈周期執(zhí)行一個(gè)以上指令的「超純量管線」

  近似近代工業(yè)生產(chǎn)線的概念,讓所有人都「閑閑有事做」的管線化(Pipeline)一直是提高效率的最基本手段,80386 的預(yù)先指令擷?。≒refetch)已有雛型,而80486 是x86世界首款真正達(dá)成指令管線化的處理器,為了確保記憶體跟得上運(yùn)算需求,也配置指令/資料共用的第一階快取記憶體,雖然真正「每個(gè)時(shí)脈周期都可穩(wěn)定輸出」者,也只限于簡(jiǎn)單的整數(shù)邏輯運(yùn)算指令。

  套句臺(tái)灣某前領(lǐng)導(dǎo)被罵翻的名言:一個(gè)便當(dāng)吃不飽,你可以花錢買第二個(gè)。執(zhí)行一個(gè)指令不夠多,當(dāng)然得想出辦法硬塞第二個(gè)?!敢粋€(gè)時(shí)脈周期內(nèi)執(zhí)行一個(gè)以上指令」的超純量管線(Superscalar),早在1965 年發(fā)跡于RISC 始祖的CDC6600,1980 年代陸續(xù)出現(xiàn)在RISC 處理器,如1985 年P(guān)ower 前身的IBM「America」計(jì)畫(也是「超純量」一詞由來(lái))、1988 年Motorola MC88100、1989 年英特爾i960CA、1990 年AMD 29050 等。各位絕對(duì)沒(méi)看錯(cuò),英特爾、AMD 也做過(guò)RISC 處理器。

  指令管線化、超純量管線、非循序指令執(zhí)行、大型化快取記憶體等常見(jiàn)的效能加速手段,清一色優(yōu)先降臨RISC 處理器的原因,也很簡(jiǎn)單:RISC 指令集的單純性與簡(jiǎn)潔性,讓設(shè)計(jì)者更輕易導(dǎo)入這些技術(shù),并用更短的時(shí)間完成產(chǎn)品開發(fā)與驗(yàn)證。

  1990 年代上半期,一提到高效能處理器,幾乎都由RISC 獨(dú)領(lǐng)風(fēng)騷,像至今碩果僅存的IBM Power、HP 的PA-RISC、SGI 的MIPS、Sun 的UltraSPARC、Fujitsu 的SPARC64 及充滿傳奇色彩的DEC Alpha 等,這也是「RISC 優(yōu)于CISC」的理論基礎(chǔ)。

  但「理論」是一回事,不代表CISC 的x86「實(shí)務(wù)上」做不到,更何況又是擁有一整支龐大「研發(fā)軍隊(duì)」的英特爾,革命性的第五世代x86 處理器Pentium 在1993年3 月22 日登上歷史舞臺(tái),不只要迎擊來(lái)自AMD、Cyrix、NexGen(被AMD 購(gòu)并,Nx686 變成K6)的競(jìng)爭(zhēng)產(chǎn)品(之后還多出Centaur 和Transmeta),更要面對(duì)AIM 聯(lián)盟(Apple、 IBM、Mororola,不是美國(guó)的空對(duì)空飛彈)PowerPC 的挑戰(zhàn),后者享有威鎮(zhèn)四方的「RISC 王者」IBM Power 當(dāng)強(qiáng)大后盾,市面更不乏「專書」鼓吹PowerPC 相對(duì)x86 的優(yōu)越性,把Pentium 批評(píng)得一文不值。

  更扯的是,意圖搶奪英特爾勢(shì)力范圍的IBM 還開發(fā)了「腳位與Pentium 相容,可以同等效率硬件執(zhí)行x86 程序碼,并兼具32 / 64 位元PowerPC 指令集相容性」的PowerPC 615,要不是微軟可能覺(jué)得難搞,不符成本效益,拒絕支援這顆處理器,導(dǎo)致永遠(yuǎn)無(wú)法量產(chǎn),英特爾的處境會(huì)更危險(xiǎn)。至于PowerPC 615 取消后,研發(fā)團(tuán)隊(duì)就投靠Transmeta,接著就無(wú)疾而終了。

  也許各位難以想像「為什么x86 會(huì)受PowerPC 威脅,不是屬于不同市場(chǎng)嗎」,但此時(shí)此刻,沒(méi)半個(gè)正常人會(huì)將連伺服器市場(chǎng)邊都沾不上的x86 和「高效能」三個(gè)字聯(lián)想在一起,甚至連那時(shí)候英特爾內(nèi)部,都很少人愿意相信x86 還有未來(lái)性,否則也不會(huì)出現(xiàn)IA-64 指令集和Itanium 處理器了。況且微軟1993 年7 月發(fā)表未來(lái)操作系統(tǒng)基礎(chǔ)的Windows NT,打從一開始就同時(shí)支援x86、MIPS 和Alpha 三版本,之后還加碼PowerPC 和IA-64,「不將雞蛋放在同一個(gè)籃子里」意圖太明顯了。

  換句話說(shuō),英特爾當(dāng)時(shí)的戰(zhàn)略地位,并不像今天如此牢不可破,更早在1990 年同步啟動(dòng)第六世代Pentium Pro 研發(fā)案,完全沒(méi)有承受失敗的本錢與余裕。

  天底下沒(méi)有白吃的午餐

  Pentium 是如假包換的x86 世界首款超純量處理器,可在同一個(gè)時(shí)脈周期內(nèi)執(zhí)行最多兩個(gè)指令,整體結(jié)構(gòu)近似雙重管線的「放大發(fā)展版」80486,但也因扛著x86指令集的原罪,由外到內(nèi)付出了不少代價(jià)。爬文至此,建議各位回頭復(fù)習(xí)一次Mike Johnson 評(píng)論的3 個(gè)重點(diǎn),你一定會(huì)更有感觸。

  我們光從初代Pentium(P5)的晶粒圖,即可清楚看到x86 相容性的代價(jià):大型化的快取記憶體(盡管實(shí)質(zhì)容量不高,但內(nèi)部結(jié)構(gòu)卻出奇復(fù)雜)、巨大的指令擷取單元、解碼與復(fù)雜指令微碼控制單元(Complex Instruction Support),這也是日后所有高效能x86 處理器的共同特色。

  指令/資料分而治之的第一階快取記憶體:x86指令集因缺乏足夠的資料暫存器,且包含了大量「暫存器/記憶體互通有無(wú)」與直接以記憶體為運(yùn)算目標(biāo)的指令,不像RISC的「載入/儲(chǔ)存」架構(gòu)「一次從記憶體抓了大量資料進(jìn)來(lái),算完后再一次性丟回記憶體」,特別需要強(qiáng)力的記憶體子系統(tǒng),所以采用指令/資料分開的第一階快取記憶體,確保兩邊足以喂飽個(gè)別的需求。而Pentium的指令快取和資料快取,更是各自大有文章。

  前面有提及「x86 指令最大長(zhǎng)度是17Bytes」,Pentium 第一階指令快取的內(nèi)部結(jié)構(gòu),是以兩個(gè)最小存取單位16Bytes 區(qū)塊,組成單一32Bytes 的快取線(Cache-Line),假若發(fā)生最糟糕的情況,17Bytes 長(zhǎng)度的指令「橫跨」了兩條32Bytes 快取線,但仍希望一次擷取到指令管線,那該怎么辦?Pentium 導(dǎo)入跨指令線分離式擷?。⊿plit Fetch),可連續(xù)讀取橫跨邊界的兩條16Bytes 最小區(qū)塊,而指令讀取緩沖區(qū)也是4 倍于80486 的128Bytes,以確保擷取指令的效率可「喂飽」兩條管線的指令解碼器。

  順便對(duì)照一下從NexGen Nx686 發(fā)展而來(lái)的AMD K6。AMD 取消了兩倍核心時(shí)脈的第一階快取記憶體,但除了既有的預(yù)先解碼位元(Pre-decoded Bits)用來(lái)標(biāo)定指令邊界,再追加第二個(gè)指令存取埠,以應(yīng)付這種狀況。反正各家廠商都各顯神通,直到可降低指令解碼器使用率的微指令快?。╱Op cache)同時(shí)成為英特爾和AMD 的制式武裝為止。

  資料快取亦不遑多讓,資料快取具備3 個(gè)存取埠,可同時(shí)應(yīng)付來(lái)自快取資料一致性協(xié)定與雙重執(zhí)行管線的需要,更進(jìn)一步將每條32Bytes 快取線,切成彼此交錯(cuò)的8 個(gè)獨(dú)立4Bytes「Bank」,只要兩個(gè)資料存取需求不會(huì)同時(shí)使用同一個(gè)Bank,即可在單一時(shí)脈內(nèi)搞定。這是計(jì)算機(jī)工業(yè)史上的第一次嘗試,但這也大幅加重了快取記憶體的復(fù)雜度,也連帶不得不強(qiáng)化配置資料快取的虛擬/實(shí)體位址轉(zhuǎn)換緩沖區(qū)(TLB,Translation-Lookaside Buffer ),并新增判斷Bank 是否發(fā)生沖突的功能電路。

  巨大的微程序唯讀記憶體:基于「加速常用的簡(jiǎn)單指令」的理念,Pentium的指令解碼器可直接硬件解碼大多數(shù)「暫存器→記憶體」與「記憶體→暫存器」之類的「相對(duì)簡(jiǎn)單」運(yùn)算指令,但x86歷代累積下來(lái)的龐大復(fù)雜指令,還是需要?jiǎng)佑梦⒋a組成微程序產(chǎn)生控制訊號(hào)。

  Pentium 的單一微碼字元長(zhǎng)度是92Bits,總共存放了4K 數(shù)量。換言之,產(chǎn)生了高達(dá)47kB 容量的唯讀記憶體(ROM)空間,還遠(yuǎn)多于第一階快取記憶體的容量(8kB+8kB),相當(dāng)驚人,老舊指令相容性帶來(lái)的巨大負(fù)擔(dān),由此可見(jiàn)一斑,這就是維持回溯相容性,所必須付出的昂貴代價(jià)。

  4個(gè)輸入的位址計(jì)算單元:一套所謂「復(fù)雜」的指令集,除了不規(guī)則的指令編碼長(zhǎng)度,亂無(wú)章法的運(yùn)算元定址模式和記憶體定址,更是必備的條件(可回顧一下AMD Mike Johnson講過(guò)的話)。實(shí)現(xiàn)高效能的超純量管線化x86處理器,并非只需弄好管線前端的指令擷取、解碼,與執(zhí)行階段的存取記憶體,高效率的有效位址計(jì)算(Address Calculation)能力,更是x86有別于RISC體系的一大差異點(diǎn),坊間人云亦云、積非成是的「x86處理器只有指令解碼器比較難做」完全是大錯(cuò)特錯(cuò)的誤解。

  為了加速記憶體位址計(jì)算,讓執(zhí)行單位盡快得到「運(yùn)算目標(biāo)」,Pentium 的兩條指令管線個(gè)別有一套4 個(gè)輸入值的加法器(4-Input Address Adder),對(duì)應(yīng)x86 指令集產(chǎn)生有效位址的4 個(gè)數(shù)字:

  節(jié)區(qū)描述器(Segment Descriptor)提供的基底值(Base)。

  來(lái)自通用暫存器的基底位址(Base Address)。

  取自通用暫存器的索引值(Index,再加上scale)。

  指令編碼附上的的移位值(Displacement)。

  因此部分僅支援3 個(gè)輸出值的486,需耗費(fèi)兩個(gè)時(shí)脈周期完成位址計(jì)算的復(fù)雜指令,Pentium 只需一個(gè)時(shí)脈周期即可,更利于管線化執(zhí)行指令。

  但慘劇尚未劃下句點(diǎn),x86 的節(jié)區(qū)記憶體(Segment),必須強(qiáng)制檢驗(yàn)每個(gè)節(jié)區(qū)的大小,確保記憶體運(yùn)算元落在節(jié)區(qū)描述器所定義的記憶體范圍內(nèi)。80286 時(shí)代的保護(hù)模式,節(jié)區(qū)描述器會(huì)影響節(jié)區(qū)位置與體積的參數(shù),總計(jì)有:

  32 位元基底值(Base)。

  20 位元范圍值(Limit)。

  范圍值單位Page 或Byte(前者上限4GB,后者則1MB)。

  針對(duì)堆疊(Stack)資料結(jié)構(gòu)的向下擴(kuò)展(Expand-Down)欄位。

  處理器需采取不同的方式計(jì)算最高與最低位址,結(jié)果Pentium 的兩條指令管線,為此個(gè)別又得「再」加上一套4 個(gè)輸入值的加法器(4-Input Segment-Check Adder) ,為檢查節(jié)區(qū)正確性之用,而486 的情況如上述位址產(chǎn)生器,須耗費(fèi)更多時(shí)脈周期做這件事。

  為何「位址計(jì)算單元」一向是歷代x86 處理器增加執(zhí)行單元的重頭戲,原因就在此。Windows 95 刺激個(gè)人電腦普及的年代,「32 位元最佳化」的Pentium Pro 被批評(píng)「16 位元效能不佳」就因動(dòng)到資料節(jié)區(qū)暫存器的指令,無(wú)法被非循序預(yù)測(cè)執(zhí)行,會(huì)讓隨后的指令上演大塞車,到了Pentium II 才修正。即使假以時(shí)日,這些老舊包袱的使用率只會(huì)越來(lái)越低,也早不再是改善效能的重點(diǎn),但也沒(méi)人膽敢冒著犧牲軟件相容性的風(fēng)險(xiǎn),根除這些歷史遺跡。

  正面對(duì)決PowerPC 且落居下風(fēng)

  相較于同時(shí)期且較早推出的超純量RISC 處理器,就可明顯看出x86 指令集的復(fù)雜度造成的負(fù)面影響。

  以1993 年秋季上市的IBM PowerPC 601 為例,電晶體數(shù)目?jī)H280 萬(wàn),采用0.6um(600nm)制程時(shí)的晶粒面積僅121 平方公厘,卻有比電晶體310 萬(wàn)的Pentium 更高的80MHz時(shí)脈、更大一倍的32kB 指令/資料共用式第一階快取記憶體,與1.5 倍的指令執(zhí)行能力,而采用0.8um(800nm)制程的初代Pentium 是一顆16.7×17.6mm、294平方公厘的巨大芯片,完全瞠乎其后。英特爾當(dāng)時(shí)就表示,相較于同等級(jí)RISC 處理器,Pentium 有約30% 電晶體都「貢獻(xiàn)」給x86 指令集的相容性。不難想見(jiàn)那時(shí)候的「RISC 十字軍」有多high。

  而Pentium 的雙重超純量指令管線也是限制重重,只有主管線「U Pipe」可以執(zhí)行所有的x86 指令,副管線「V Pipe」僅能負(fù)責(zé)比較簡(jiǎn)單者,而要這兩條管線一起動(dòng),還需要依循指令配對(duì)規(guī)則,講白了就是「兩邊都要跑簡(jiǎn)單指令」,且涉及暫存器和記憶體兩邊資料互相搬移的指令也無(wú)能為力,就是要強(qiáng)迫其中一條管線「發(fā)呆」兩個(gè)時(shí)脈周期給你看。PowerPC 601「理所當(dāng)然」比較沒(méi)有這樣的煩惱。

  80×87 浮點(diǎn)指令集更是x86 處理器追求高效能浮點(diǎn)運(yùn)算的罩門,因「英特爾內(nèi)部溝通不良」(英特爾美國(guó)加州總部和以色列海法之間實(shí)在太遠(yuǎn)了,1970 年代末期的聯(lián)絡(luò)手段又沒(méi)像今天這么方便)誕生的「極度愚蠢」堆疊式(Stack)暫存器架構(gòu)(附贈(zèng)讓人摸不著頭緒的80 位元延伸雙倍精確度浮點(diǎn)格式),強(qiáng)迫多數(shù)浮點(diǎn)指令的運(yùn)算元,其中一個(gè)非得指定放在堆疊暫存器的頂端不可。

  英特爾在Pentium 加入FXCH 指令用來(lái)交換置頂暫存器,原本僅內(nèi)建一組浮點(diǎn)運(yùn)算單元,管線不能同時(shí)執(zhí)行兩個(gè)浮點(diǎn)運(yùn)算指令的Pentium,簡(jiǎn)單的浮點(diǎn)運(yùn)算指令可和FXCH 一同塞進(jìn)兩條指令管線,但實(shí)際上也只有執(zhí)行一個(gè)有效浮點(diǎn)運(yùn)算,況且后頭接連著的整數(shù)指令,都會(huì)被延誤最少一個(gè)時(shí)脈周期。

  判斷分支條件需「借用」整數(shù)運(yùn)算通用暫存器與執(zhí)行單元,則是80×87 另一個(gè)弱點(diǎn),從一個(gè)浮點(diǎn)運(yùn)算設(shè)定條件碼、將浮點(diǎn)運(yùn)算的執(zhí)行資訊搬移至通用暫存器、傳送至條件碼暫存器,再依據(jù)其結(jié)果,啟動(dòng)正常的分支處理流程,Pentium 整整耗時(shí)9 個(gè)時(shí)脈周期。當(dāng)然可透過(guò)「插入」其他整數(shù)指令來(lái)降低效能損失,但無(wú)法彌補(bǔ)當(dāng)執(zhí)行條件判斷密集的程序,整數(shù)浮點(diǎn)單元之間反覆「踢皮球」的傷害。

  這些在今天只會(huì)讓人覺(jué)得很荒謬的往事,讓Pentium 的浮點(diǎn)性能仍遠(yuǎn)遠(yuǎn)不及同時(shí)期的RISC 處理器,只能在x86 的世界當(dāng)大王,這宿疾到了新一代Pentium Pro 依舊無(wú)解,同期MIPS R10000 的SPECfp92 浮點(diǎn)效能還是Pentium Pro 的「3 倍」以上,還因?yàn)镻owerPC「外掛」AltiVec 而一度被拉開差距到差點(diǎn)看不見(jiàn)車尾燈的程度。

  直到Pentium III(Katmai)開始擴(kuò)充SIMD(單一指令,多重資料流)浮點(diǎn)指令集SSE、初代Pentium 4(Willamette)的SSE2 新增雙倍精確度浮點(diǎn)格式,一路到Sandy Bridge 的AVX,引入VEX (Vector Extension)標(biāo)頭,一口氣解放了過(guò)去x86 指令編碼帶來(lái)的重重枷鎖,才算功德圓滿。

  但即使看似出師不利,x86 指令集的沉重包袱,并未讓英特爾就此停下腳步,依然持續(xù)精進(jìn)Pentium 處理器,就算沒(méi)有一鼓作氣打開天堂大門,卻也讓緊閉已久的門縫滲出充滿希望的曙光。

  從企圖殺入很長(zhǎng)一段時(shí)間內(nèi)「可遠(yuǎn)觀不可褻玩焉」的伺服器市場(chǎng),預(yù)期Windows 95 激發(fā)個(gè)人電腦市場(chǎng)爆發(fā)性成長(zhǎng)時(shí),補(bǔ)足高效能桌機(jī)和筆記型電腦需要的基本功能,到迎合「多媒體」的新潮技術(shù)營(yíng)銷名詞,無(wú)不是英特爾1990 年代初期念茲在茲的技術(shù)發(fā)展重點(diǎn)。這些努力的痕跡,統(tǒng)統(tǒng)一字不漏深深刻在Pentium 和整個(gè)計(jì)算機(jī)工業(yè)的歷史上。

  原汁原味的多處理器支援性

  「多處理器支援性」是進(jìn)入工作站與伺服器市場(chǎng)的最低門檻入門票,而Pentium 則是x86 歷史上首度「原生支援(Glueless)多處理器」的先行者,但嚴(yán)格說(shuō)來(lái),這到了0.5 um 制程的第二代Pentium(P54C)才實(shí)現(xiàn),而在此之前,也并不是沒(méi)有「多處理器x86」的存在,只是需要外掛特制的系統(tǒng)芯片組,或連操作系統(tǒng)都要特殊版本。

  一個(gè)便于實(shí)作的「無(wú)需外掛額外芯片」(Glueless)的多處理器(或多核心)環(huán)境,需具以下條件:

  分配、協(xié)調(diào)各I/O 周邊裝置存取處理器需求的能力,發(fā)出中斷(Interrupt)時(shí),知道該由哪個(gè)處理器負(fù)責(zé):標(biāo)準(zhǔn)化的中斷處理機(jī)制。

  快取記憶體資料一致性協(xié)定(Cache Coherence Protocol):回寫式(Write-Back)快取記憶體常見(jiàn)的MESI(Modified, Exclusive, Shared, Invalid)協(xié)議。

  低成本多處理器系統(tǒng)的根基:可讓多處理器共享的系統(tǒng)匯流排。

  3項(xiàng)條件之一,最重要者莫過(guò)于第一項(xiàng)。1983 年,17 名因英特爾極具野心的「32 位元微電腦大型主機(jī)」iAPX432 計(jì)畫失敗而離職的員工,創(chuàng)立的Sequent Computer Systems(1999 年被IBM 購(gòu)并,研發(fā)高階英特爾處理器的系統(tǒng)芯片組) ,就曾推出一系列采用80386 與80486 的多處理器產(chǎn)品線,但這些所費(fèi)不貲的專屬方案,仰賴特制系統(tǒng)芯片組與特化過(guò)的操作系統(tǒng),才能正確的將系統(tǒng)中斷(System Interupt)傳送到各處理器,多處理器x86 平臺(tái)仍缺標(biāo)準(zhǔn)化的中斷處理機(jī)制,并非可長(zhǎng)可久的解決之道。

  1993 年10 月27 日,也是初代Pentium 發(fā)表后的半年,英特爾首度公開第一版「多處理器規(guī)范」(MPS,Multi-Processor Specification)與最重要的「處理器本地端先進(jìn)可程序化中斷控制器」(Local APIC,Local Advanced Programmable Interrupt Controller)與I/O 專屬的I/O APIC,取代老舊的8259 PIC。

  每個(gè)Pentium 或80486 處理器起碼要有一個(gè)Local APIC,與系統(tǒng)I/O 芯片組的I/O APIC,透過(guò)獨(dú)立于系統(tǒng)匯流排的3 位元APIC Bus,I/O APIC 將周邊裝置的中斷需求傳遞給處理器的Local APIC,以決定中斷服務(wù)需求該指派給那些處理器,踏出了低成本多x86 處理器系統(tǒng)的第一步。

  英特爾的競(jìng)爭(zhēng)對(duì)手并非沒(méi)有替代方案,1996 年上市的Cyrix 6×86 依據(jù)OpenPIC 規(guī)范,支援自家定義的SLiC,但也只有VIA 的Apollo 芯片組對(duì)應(yīng)此規(guī)格,基本上「有跟沒(méi)有一樣」,而AMD的x86 多處理器環(huán)境,更是要等到1999 年采用Alpha EV6 匯流排、理論上最多支援14 顆處理器的K7 了。

  不過(guò)初代Pentium 并未內(nèi)建Local APIC,同時(shí)期系統(tǒng)芯片組也沒(méi)有I/O APIC,要打造多顆Pentium 平臺(tái),每一顆Pentium 需外掛一顆單價(jià)高達(dá)26 美元、兼具Local APIC 與I/O APIC 兩者功能的82498DX,I/O 也需動(dòng)用一顆。換句話說(shuō),雙處理器系統(tǒng)就需要用到3 顆,怎么看都不算便宜,還會(huì)占用不少主機(jī)板空間。

  后來(lái)0.5um 制程的第二代Pentium(P54C)變成史上第一顆整合Local APIC 的x86 處理器,對(duì)應(yīng)的系統(tǒng)芯片組也陸續(xù)在南橋(South Bridge)內(nèi)建I/O APIC(未內(nèi)建者,可選配專用的82093AA I/O APIC),總算讓雙Pentium 搖身一變,成為「Glueless」的多處理器平臺(tái)。

  受制于缺陷重重的系統(tǒng)架構(gòu),如效率不足的系統(tǒng)匯流排、處理器缺乏非循序記憶體存取能力、處理器共享外部的第二階快取記憶體讓匯流排問(wèn)題更加雪上加霜等等,并未讓Pentium 在伺服器市場(chǎng)取得重大突破,到了Pentium Pro 面世后才迎刃而解,開啟Xeon 統(tǒng)治伺服器市場(chǎng)之路,那又是另一段截然不同的故事了。

  決定處理器核心/執(zhí)行緒上限的Local APIC 與闖禍的操作系統(tǒng)支援性

  處理器核心持續(xù)激增的今日,Local APIC 最重要的角色在于決定處理器的核心與執(zhí)行緒上限。原先最早的APIC 上限是15,2000 年P(guān)entium 4 開始出現(xiàn)的xAPIC(將APIC 的3 位元專屬匯流排直接「融入」系統(tǒng)匯流排的通訊協(xié)定,避免APIC 運(yùn)作時(shí)影響記憶體存取效能)增加到255,2008 年Nehalem 的x2APIC 更多達(dá)4294967295,可視為「無(wú)限大」。

  假如各位想多學(xué)些對(duì)親朋好友炫耀的「無(wú)用知識(shí)」,稍微花點(diǎn)腦筋,牢記一下這3 個(gè)數(shù)字的由來(lái):

  APIC:Pentium和Pentium Pro(與Pentium II、Pentium III、P6核心的Xeon)動(dòng)用Local APIC的ID暫存器24-27四個(gè)位元,16進(jìn)位的0xF(10進(jìn)位制的15)用做廣播,所以2 4 ?1=15。

  xAPIC:Pentium 4到Penryn用到Local APIC的ID暫存器24-31八個(gè)位元,16進(jìn)位的0xFF(10進(jìn)位制的255)用做廣播,所以2 8 ?1=255。

  x2APIC:Nehalem開始使用存于MSR(Model-Specific Register)的32位元x2APIC ID,16進(jìn)位的0xFFFFFFFF(10進(jìn)位制的4294967295)用做廣播,所以2 32 ?1=4294967295。

  但帳面上的「理論值」讓人看得很爽是一回事,微軟這些操作系統(tǒng)廠商是否乖乖買單又是另一回事。很不幸的,AMD Zen2 世代EPYC 與Threadripper 將單顆處理器的實(shí)體核心術(shù)/邏輯處理器,一舉推進(jìn)到64 核/128 緒,就變成微軟Windows 的災(zāi)難了。

  一臺(tái)2顆EPYC 7742 或7702 的伺服器,擁有128 個(gè)處理器核心和256 條執(zhí)行緒,但是Windows Server 2016 和2012 R2 并不支援「AMD 新型平臺(tái)的x2APIC」,無(wú)法吃下這么多邏輯處理器。

  事實(shí)上,根據(jù)微軟的EPYC 性能調(diào)校文件,Windows Server 2019 之前的舊版Windows Server,只能支援2 顆48 核心的EPYC 和192 個(gè)邏輯處理器。安裝2019 年9 月前的Windows Server 2019,也需要事先在BIOS 關(guān)閉x2APIC 和多執(zhí)行緒,安裝完畢并裝完所有的系統(tǒng)更新檔,重新開機(jī)進(jìn)BIOS 恢復(fù)功能,才能在工作管理員的效能選單看到全部CPU。

  再次同場(chǎng)加映AMD。剛好前陣子Anandtech 有特別報(bào)導(dǎo)的EPYC 在Windows 10 發(fā)生的災(zāi)情(盡管這和APIC 沒(méi)有關(guān)系)。Windows 系統(tǒng)核心會(huì)預(yù)設(shè)64 個(gè)CPU 組成一個(gè)「Windows Processor Group」,當(dāng)邏輯處理器超過(guò)64 個(gè),會(huì)將多出余數(shù)包成另一群,像一顆64 核/128 緒的Threadripper,就會(huì)變成一顆實(shí)體CPU 有「兩包」64 個(gè)邏輯處理器。

  但Windows 10 要企業(yè)版(Enterprise)才提供此功能,家用版(Home)和專業(yè)版(Professional)會(huì)將「滿出來(lái)的部分」,誤判為占用另一個(gè)處理器腳位的實(shí)體CPU,意思就是誤解成「兩顆」處理器的系統(tǒng),將誤導(dǎo)操作系統(tǒng)的執(zhí)行緒排程,降低系統(tǒng)效能,這時(shí)關(guān)掉多執(zhí)行緒,很可能表現(xiàn)還比較好。

  在計(jì)算機(jī)的世界,任何「看起來(lái)很棒」的技術(shù)和功能,無(wú)不是「軟硬兼?zhèn)洹沟某晒?,?dāng)入手頂規(guī)的硬件時(shí),也請(qǐng)多多關(guān)心手上的軟件環(huán)境是否可發(fā)揮最高效益。筆者現(xiàn)在都可以猜到花大錢買TR 3990X 的「長(zhǎng)輩」急著升級(jí)Windows 10 企業(yè)版的畫面了。

  「讓人比較有感」的指令集擴(kuò)張

  如果能讓筆者選擇,其實(shí)x86 指令集擴(kuò)張史中最重要的一幕,絕對(duì)是邁向32 位元的80386、虛擬86 模式(Virtual 8086 Mode)與具備分頁(yè)表的虛擬記憶體。但事隔多年,印象最深刻的,依舊對(duì)個(gè)人電腦市場(chǎng)規(guī)模爆炸式成長(zhǎng)、使用者急速增加的1990 年代,英特爾在Pentium 家族干的一堆好事,包括極具歷史意義的第一次SIMD 擴(kuò)張:MMX。

  相信各位不可能不知道CPUID 這經(jīng)常用來(lái)辨識(shí)處理器廠牌、功能、版本與規(guī)格的好工具,但你們知道背后作這件事的「CPUID」指令,就是從Pentium 開始登場(chǎng)的嗎?眾多程序設(shè)計(jì)師計(jì)算指令執(zhí)行周期數(shù)的RDTSC(Read Time-Stamp Counter),也伴隨著Pentium 而生。用在操作系統(tǒng)避免不同執(zhí)行緒同時(shí)對(duì)共用資源讀寫「互斥鎖」的CMPXCHG8B(Compare and Exchange 8 Bytes),也是小有名氣,Windows XP 就是因這個(gè)必備指令,無(wú)法執(zhí)行于Pentium 之前的所有x86處理器。

  前面有提到MSR(Model-Specific Register),意指在x86 架構(gòu)處理器中,一系列用于控制處理器執(zhí)行、功能開關(guān)、除錯(cuò)、追蹤程序執(zhí)行、監(jiān)測(cè)處理器效能等功能的暫存器。MSR 的雛形始于80386 和80486,到了Pentium,英特爾新增RDMSR(Read MSR)和WRMSR(Write MSR)指令用于讀寫MSR,使其真正的實(shí)用化。此外,軟件可透過(guò)前述的CPUID 指令,查詢處理器可支援的功能,并確認(rèn)這些功能對(duì)應(yīng)的MSR 是否存在。

  同時(shí)英特爾在Pentium「復(fù)刻」筆電專用的80386SL 和80486SL 處理器,那獨(dú)立于真實(shí)模式和保護(hù)模式,干了哪些好事,連操作系統(tǒng)都不知情的系統(tǒng)管理模式(SMM,System Management Mode)。英特爾制定SMM 的初衷,在于讓筆電OEM 廠商自訂必備的電源管理與周邊裝置管理,如為了省電,動(dòng)態(tài)關(guān)閉用不到的周邊設(shè)備,需要時(shí)再重新啟動(dòng)等,將SMM 從「特殊武器」提拔成「制式裝備」,暗示英特爾認(rèn)定筆電即將普及化的未來(lái)。

  順道一題,相對(duì)于x86 指令集在節(jié)區(qū)定址定義4 層權(quán)限的Ring 0 到Ring 3(數(shù)字越小權(quán)力越大),SMM 的權(quán)限經(jīng)常戲稱為Ring -2,那Ring -1 跑到哪去了?答案是x86 硬件虛擬化技術(shù)用來(lái)攔截「在使用者模式仍會(huì)更動(dòng)系統(tǒng)底層的危險(xiǎn)指令」的Hypervisor 權(quán)限。

  這些指令集擴(kuò)張看似微不足道,遠(yuǎn)不如那票SIMD(MMX、SSE、SSE2、SSE3、SSE4、AVX、AVX-512)「華麗壯大」,卻也是不可或缺的基本功,同為「高效能處理器不可被分割的一部分」。但Pentium 史上最知名的指令集MMX,就是一場(chǎng)歡樂(lè)異常的連續(xù)劇了。

  為了MMX 讓Pentium 被迫大興土木、脫胎換骨

  Windows 95 帶動(dòng)個(gè)人電腦的多媒體需求,英特爾自然不能免俗,勢(shì)必要讓處理器跟「多媒體」沾上邊,試圖推動(dòng)主機(jī)板加掛一顆來(lái)自第三方的數(shù)位訊號(hào)處理器(DSP),專門處理即時(shí)性影音應(yīng)用程序。但因?yàn)镹SP 的運(yùn)作模式是獨(dú)立于操作系統(tǒng)的化外之民,等于需要操作系統(tǒng)開后門,微軟為此拒絕買單,因此胎死腹中,才出現(xiàn)了MMX。

  打從英特爾在1996 年,拋出MMX 這從未講清楚說(shuō)明白的「無(wú)意義技術(shù)營(yíng)銷商標(biāo)」,全名一直眾說(shuō)紛紜、莫衷一是,還先后出現(xiàn)3 個(gè)版本:

  MultiMedia eXtension

  Multiple Math eXtension

  Matrix Math eXtension

  名稱怎樣不重要,各位只要記得一件事:為了操作系統(tǒng)相容性,MMX 指令集借用x87 浮點(diǎn)運(yùn)算暫存器(80 位元中的64 位元)的SIMD「整數(shù)」運(yùn)算,這樣就夠了。英特爾定義全新SIMD 暫存器,從Pentium III「Kaimai」的SSE(KNI,Katmai New Instructions)才開始。

  指令集的編碼空間畢竟有限,英特爾要從哪里擠出這57 個(gè)指令的位置?英特爾將腦袋動(dòng)到「0Fh」開頭的運(yùn)算碼(Opcode),這卻造成前所未見(jiàn)的麻煩:過(guò)去0Fh 的主要用途「當(dāng)處理器的解碼器收到時(shí),自動(dòng)將該指令執(zhí)行流程跳到外掛的輔助處理器」,當(dāng)初英特爾就靠這招來(lái)處理8087 浮點(diǎn)輔助處理器,0Fh 開頭的x86 指令都不是什么「需要追求效率」者,也因此,Pentium 的指令解碼器也沒(méi)有特別「關(guān)照」它們,意味著難以迅速完成解碼MMX 指令的重責(zé)大任。

  主導(dǎo)Pentium MMX(P55C)研發(fā)的以色列海法團(tuán)隊(duì),不得不大興土木,將指令管線深度從五階延長(zhǎng)到六階,爭(zhēng)取足夠的指令解碼時(shí)間。多這一階并非有害無(wú)益,因?yàn)閳?zhí)行單元將有更充裕的時(shí)間存取資料快取,并縮短電路的關(guān)鍵路徑,利于提高時(shí)脈,讓Pentium MMX 最終可到達(dá)300MHz,比前代P54C 多出整整50%。

  但延長(zhǎng)指令管線也帶來(lái)更嚴(yán)重的分支預(yù)測(cè)錯(cuò)誤代價(jià),英特爾索性將「管線深度長(zhǎng)達(dá)12 階」的第六世代Pentium Pro 搭載的雙層動(dòng)態(tài)分支預(yù)測(cè)與副程序返回位址緩沖區(qū)等先進(jìn)技術(shù),原封不動(dòng)的逆向移植到Pentium MMX,亦倍增快取記憶體和資料寫回緩沖區(qū),轉(zhuǎn)換虛擬和實(shí)體記憶體位址的TLB,也強(qiáng)化為可同時(shí)處理兩種不同分頁(yè)大小的版本,種種改進(jìn)項(xiàng)目仿佛威而剛,讓吃下藍(lán)色小藥丸的Pentium MMX 搖身一變成「5.5 代」x86 處理器。

  為了減少耗電與發(fā)熱,英特爾將MMX 執(zhí)行單元與實(shí)體暫存器獨(dú)立于x87 浮點(diǎn)運(yùn)算器,執(zhí)行MMX 指令時(shí),因指令集定義「邏輯上MMX 和x87 浮點(diǎn)無(wú)法同時(shí)執(zhí)行」,可關(guān)閉「吃電如喝水」般的浮點(diǎn)單元以節(jié)約電力,可是結(jié)合加倍的快取記憶體和種種增強(qiáng)方案,P55C 電晶體數(shù)從P54C 的330 萬(wàn)激增到450 萬(wàn),制程從「不計(jì)多出10%芯片面積以追求最高時(shí)脈」的350 奈米BiCMOS 改進(jìn)為「自此英特爾轉(zhuǎn)向追求更低成本并降低耗電」的280 奈米CMOS,芯片面積和制造成本仍足足比P54C 多50%。

  Pentium MMX 在1997 年1 月上市沒(méi)多久,同年5 月同樣支援MMX 的Pentium II 就以「塑膠大彈夾」外觀,現(xiàn)身于各地電腦賣場(chǎng)的玻璃柜,無(wú)論怎么看,Pentium MMX 都是過(guò)渡期強(qiáng)烈的尷尬產(chǎn)物。

  但Pentium MMX 對(duì)英特爾在以色列海法的研發(fā)團(tuán)隊(duì)而言,卻是極為重要的歷史里程碑,建立起「擅長(zhǎng)精煉現(xiàn)有架構(gòu)壓榨更多價(jià)值」的名號(hào),接連重塑P6 微架構(gòu)成為Centrino 心臟的Pentium M (Banias, Dothan)、當(dāng)英特爾在Pentium 4(NetBurst)慘遭滑鐵盧的危急存亡之秋端出Core 2(Merom, Conroe, Woodcrest)救駕成功、融合P6 與NetBurst 之長(zhǎng)的Sandy Bridge 終結(jié)AMD K8 的輝煌歲月、直到「奮六世之余烈」集大成的「終極x86 微架構(gòu)」Skylake,清一色都是出自以色列海法團(tuán)隊(duì)的不朽杰作。

  x86 指令集長(zhǎng)期欠缺標(biāo)準(zhǔn)造成競(jìng)爭(zhēng)對(duì)手與軟件開發(fā)商的困擾

  Pentium 的「歷史地位」倒是值得另外添一筆:x86 指令集欠缺公開業(yè)界標(biāo)準(zhǔn),搞死不少人的陳年舊帳,終于正式浮上臺(tái)面。

  Pentium Pro 總工程師之一的Robert Colwell 回憶錄《The Pentium Chronicles》說(shuō)過(guò),開發(fā)一顆x86 處理器,最艱巨的挑戰(zhàn)在于「如何保證可相容所有舊程序」。特別早期x86 處理器,很多未定義的運(yùn)算碼(Opcode)并沒(méi)有遮掉,被人發(fā)現(xiàn)又拿來(lái)用了,以后的處理器開發(fā)人員就只能乖乖想辦法「塞」進(jìn)去,前提是你也要知道這些陷阱到底藏在哪里。

  各位是否天真的以為所有x86 處理器廠商的產(chǎn)品,都保證彼此相容,可執(zhí)行一模一樣的軟件?很遺憾的,這種好事從來(lái)就不存在英特爾統(tǒng)治的x86 世界(最起碼,前陣子讓Linus Torvalds 大暴走的AVX-512,AMD 現(xiàn)有產(chǎn)品也是付之闕如),英特爾在Pentium 時(shí)代的所作所為就是最好例證,讓初版使用者手冊(cè)描述新增指令的「附錄H」故意保持完全空白,英特爾的競(jìng)爭(zhēng)者與軟件開發(fā)商紛紛變成倒楣的苦主。

  英特爾并不像那票會(huì)定期推出版本演進(jìn)與相關(guān)規(guī)范的RISC 指令集(有關(guān)心ARM 的讀者應(yīng)該很清楚)、積極推廣自家指令集給其他潛在競(jìng)爭(zhēng)對(duì)手,而是完全不管其他人死活。想研發(fā)x86 相容處理器的有志之士,假若沒(méi)有跟英特爾簽訂互相授權(quán)協(xié)議,只有兩條路可選:乖乖用電子顯微鏡默默研究英特爾處理器的晶粒,嘗試逆向工程,要不然就干脆不支援不顧相容性,碰到就視為非法指令,剩下的爛攤子就丟給操作系統(tǒng)廠商傷透腦筋了。

  像Cyrix 在被National Semiconductor 購(gòu)并前,壓根沒(méi)有英特爾技術(shù)授權(quán),只能悶著頭逆向工程慢慢搞,自然也無(wú)法100% 相容,讓號(hào)稱「第六世代」的6×86,連CPUID 和RDTSC都付之闕如,指令集相容水準(zhǔn)只有80486 等級(jí),甚至還得逼迫軟件廠商撰寫修正程序。同時(shí)期的AMD 則是不計(jì)代價(jià)拼死拼活,都要藉由逆向工程擠出100% 相容性,下場(chǎng)就是產(chǎn)品上市延誤,錯(cuò)失商機(jī),還虧當(dāng)初Compaq 傻傻不肯推出Pentium 個(gè)人電腦,寧愿癡癡等待AMD K5,更慘的是,撐到最后還是等不到。

  英特爾競(jìng)爭(zhēng)者也都不是省油的燈,不遑多讓搶著跳出來(lái)扮演「麻煩制造者」,自行定義「兄弟獨(dú)有之創(chuàng)見(jiàn)」的自家指令,不僅企圖爭(zhēng)奪x86 指令集的主導(dǎo)權(quán),并強(qiáng)化產(chǎn)品效能及營(yíng)銷籌碼,像AMD K6 的3DNow!、AMD K8 的x86-64,Cyrix 6x86MX 的EMMI 與Cyrix III 的MMX-FP,Centaur 一度想不開的57 個(gè)SIMD 浮點(diǎn)指令和22 個(gè)自定義浮點(diǎn)暫存器,都是斑斑可考的歷史陳?ài)E。

  AMD 還一度想不開,搶先注冊(cè)「SSE5」,擺明跟英特爾AVX 打?qū)ε_(tái),還好在2009 年5 月6 日緊急采煞車,宣布「皈依」AVX,但還是忍不住撈過(guò)界「補(bǔ)完」被英特爾廢除的四運(yùn)算元指令格式(xmm1=xmm2×xmm3+m32)。AMD 要開始支援亂成一團(tuán)的AVX-512 并完全相容,大概也是很久以后的未來(lái)了。

  回顧這些年來(lái)的x86 指令集擴(kuò)充戰(zhàn)爭(zhēng),唯一從英特爾手上搶下先機(jī)的,也只有AMD x86-64 那次,還是微軟私下威脅「不打算支援兩種不同的64 位元x86」(英特爾本來(lái)有自己的Yamhill,但為了保護(hù)IA-64 遲遲不肯拿出來(lái))強(qiáng)迫英特爾接受的結(jié)果。

  最初英特爾多心不甘情不愿、打死都不承認(rèn)64 位元x86 存在的「IA-32e」和AMD x86-64 也并非一模一樣,英特爾獨(dú)占CMPXCHG16B(Pentium 那個(gè)CMPXCHG8B 的進(jìn)階版)和SSE3,AMD 多出分頁(yè)表NX(No Execute)保護(hù)位元和3DNow!。談到x86 處理器廠商要彼此100% 水乳交融,說(shuō)有多麻煩就有多麻煩,說(shuō)微軟有多火大就有多火大。

  不過(guò)亂象還是持續(xù)延燒,還燒到虛擬化領(lǐng)域,近十多年來(lái)虛擬化應(yīng)用快速普及,然后2005 年英特爾VT-x(Vanderpool)和2006 年AMD AMD-V(Pacifica),雙方根本就是各搞各的,老死不相往來(lái),讓VMware vMotion 此類不停機(jī)的虛擬機(jī)動(dòng)態(tài)遷移技術(shù),遲遲跨越不了不同x86 處理器廠商的邊界,無(wú)形中也局限了x86 處理器「向上發(fā)展」的潛力,目睹此景,IBM 應(yīng)該會(huì)繼續(xù)開心下去。

  重塑x86 處理器世界觀的歷史認(rèn)知

  行文至此,想必各位看官臉上已掛著顫抖的嘴角與充滿劫后余生的表情,或多或少逐步解構(gòu)并重組過(guò)往對(duì)個(gè)人電腦市場(chǎng)與x86 處理器演進(jìn)史的認(rèn)知,有可能瞬間茅塞頓開,也有可能繼續(xù)滿頭問(wèn)號(hào)。

  本文并非教科書,而是經(jīng)由復(fù)習(xí)坊間甚少重視的歷史背景與不容易注意到的細(xì)節(jié),體認(rèn)到平日陪伺在旁、習(xí)以為常的x86 處理器,能走到今天是多么不容易的一件事。羅馬不是一天造成,英特爾的霸權(quán)也不是平白從天上掉下來(lái),這些年來(lái)我們一同擠過(guò)這么多條牙膏,更不是毫無(wú)苦衷。

  身為英特爾1990 年代「Landmark」芯片與無(wú)數(shù)潛藏已久歷史暗流的縮影,Pentium 帶來(lái)x86 世界太多「第一次」,承先啟后,奠定25 年技術(shù)演進(jìn)與市場(chǎng)發(fā)展的基礎(chǔ)邏輯。畢竟電腦是人類創(chuàng)造的東西,背后的人性和思維遠(yuǎn)遠(yuǎn)超越技術(shù)。英特爾可靠開創(chuàng)新局的Pentium 與繼往開來(lái)的Pentium Pro,在眾多敵人環(huán)伺下殺出一條通往全新市場(chǎng)血路過(guò)程中「產(chǎn)生的價(jià)值」,如「技術(shù)領(lǐng)先無(wú)法保證商業(yè)勝利」和「成功的產(chǎn)品往往是折衷妥協(xié)后的產(chǎn)物」,統(tǒng)統(tǒng)很有意思,更值得各位細(xì)細(xì)品味。

  關(guān)于Pentium,似乎筆者不小心遺漏了什么,聽(tīng)說(shuō)跟浮點(diǎn)除法(FDIV)有關(guān)?算了,就當(dāng)作提醒世人,再精密復(fù)雜的處理器,也會(huì)因臭蟲出包的教訓(xùn)吧。



本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。