Conroe強(qiáng)在哪兒?Core vs K8架構(gòu)解析
編者注:五月一日,就在我們開始享受五一長(zhǎng)假的時(shí)候,AnandTech 網(wǎng)站發(fā)布了這篇關(guān)于 Intel Core 微架構(gòu)的《Intel Core versus AMD''s K8 architecture》一文。與我們先前發(fā)布的《Intel Core 微架構(gòu)全面解析》一文相比,這篇文章關(guān)注的焦點(diǎn)是 Core 微架構(gòu)與 K8 處理器的對(duì)比。并且,該篇文章的作者是在訪問過 Intel 以色列設(shè)計(jì)團(tuán)隊(duì)的架構(gòu)設(shè)計(jì)師 Jack Doweck 之后撰寫該文的,應(yīng)該說文章中的一些說法具有一定的權(quán)威性。因此,盡管文章的內(nèi)容與我們之前發(fā)布的文章有一些交叉,我們還是把全文轉(zhuǎn)載過來,供廣大讀者參考。
寬動(dòng)態(tài)執(zhí)行(Wide Dynamic Execution),高級(jí)數(shù)字多媒體增強(qiáng)技術(shù)(Advanced Digital Media Boost),智能內(nèi)存訪問技術(shù)(Smart Memory Access),高級(jí)智能緩存技術(shù)(Advanced Smart Cache)——這些都是 Intel 的市場(chǎng)部人員重點(diǎn)宣傳的技術(shù),所有的這些技術(shù)造就了 Intel 新推出的高性能、低功耗的 Core 微架構(gòu)。
不過,我們不會(huì)只關(guān)心市場(chǎng)宣傳人員給他們的產(chǎn)品貼上的漂亮的標(biāo)簽。如果只看標(biāo)簽的話——“結(jié)合良好的性能與合理的功耗,擴(kuò)展數(shù)字生活的方式”,你會(huì)發(fā)現(xiàn)這與 VIA 對(duì)他們的 C7 處理器的宣傳很相似。然而,你認(rèn)為宣傳口號(hào)背后的 Intel Core 微架構(gòu)會(huì)與 VIA C7 處理器相同嗎?
下面,就讓我們來仔細(xì)了解一下隱藏在市場(chǎng)宣傳人員的口號(hào)背后的 Core 微架構(gòu)的秘密,并且與 AMD 的 K8 微架構(gòu)、Intel 之前的 NetBurst 微架構(gòu)以及 Pentium M 處理器進(jìn)行對(duì)比。撰寫這篇文章之前,我們與 Intel 以色列研發(fā)中心(Israel Development Center,簡(jiǎn)稱IDC)的架構(gòu)設(shè)計(jì)師之一——Jack Doweck 進(jìn)行了交流。Jack Doweck 設(shè)計(jì)了全新的內(nèi)存亂序緩沖區(qū)(Memory Reorder Buffer)和內(nèi)存相關(guān)性預(yù)測(cè)系統(tǒng)(Memory disambiguation system)。
Intel 的市場(chǎng)宣傳人員聲稱 Core 微架構(gòu)是 Pentium M 處理器和 NetBurst 微架構(gòu)的融合。然而目前比較普遍的看法是,Core 微架構(gòu)是 Pentium Pro 架構(gòu),或者說是 P6 微架構(gòu)的延續(xù)。在 Core 微架構(gòu)中,你很難找到任何與Pentium 4,或者說是 NetBurst 微架構(gòu)有關(guān)的東西。在我們與 Jack Doweck 的交談之后,這個(gè)事實(shí)更加清晰——Core 微架構(gòu)中只有預(yù)取機(jī)制是從 NetBurst 微架構(gòu)獲得的靈感,所有其它的設(shè)計(jì)都是從 Yonah 微架構(gòu)(Core Duo 處理器)演變而來,而 Yonah 微架構(gòu)顯然是從 Banias 處理器和 Dothan 處理器演變而來的。所有 Banias、Dothan、Yonah和采用 Core 微架構(gòu)的處理器都繼承了 NetBurst 處理器的前端總線設(shè)計(jì),但除此之外,它們毫無疑問都是曾經(jīng)獲得巨大成功的 P6 微架構(gòu)的后代。在某種意義上,你可以把 Core 微架構(gòu)叫做“P8 微架構(gòu)”,因?yàn)?Banias 和 Dothan 處理器曾經(jīng)被稱作“P7 微架構(gòu)”。(不過,需要注意的是,Intel 從未給出過 Banias 和 Dothan 處理器所采用的微架構(gòu)的正式名稱,我們一般用 Pentium M處理器代表它們,或者簡(jiǎn)稱為 PM 處理器。)
不過這并不意味著 Intel 的工程師只是把 Yonah 處理器的一些功能單元和解碼器重新包裝一下然后換了個(gè)名字就推出來。Jack 告訴我們,Woodcrest、Conroe 和 Merom 處理器都是基于 Yonah 處理器的,但是幾乎80%的架構(gòu)和電路設(shè)計(jì)需要重新進(jìn)行。
[下載]常用工具大放送(測(cè)試可下)
經(jīng)驗(yàn):裝臺(tái)P4機(jī)器 奸商騙人手段大放送
我使用雙核820的2個(gè)月體會(huì) 獻(xiàn)給大家
DIY攢機(jī)手冊(cè)(精華)
高手的八套AMD裝機(jī)單(五月版)
答疑:5月裝機(jī)專家配置點(diǎn)評(píng)
為使那些不熟悉處理器設(shè)計(jì)的讀者也能理解文章后面的內(nèi)容,我們首先從一個(gè)處理器微架構(gòu)的速成教程開始。為了理解處理器設(shè)計(jì)的目標(biāo)和優(yōu)劣,你首先需要了解處理器執(zhí)行的指令,所以我們從處理器運(yùn)行的軟件開始。
典型的 X86 程序的代碼中大約有50%的指令是存儲(chǔ)器訪問指令,其中存儲(chǔ)器讀指令大約是存儲(chǔ)器寫指令的2倍。然后,大約15%到20%的指令是分支指令(if, then, else等)。剩余指令中,大部分是諸如“ADD”、“MUL”這樣的較簡(jiǎn)單的計(jì)算指令。像“DIV”、“SQRT”這些較復(fù)雜的計(jì)算指令在所有指令中只占很少的一部分。所有這些指令都按照典型的流水線步驟執(zhí)行:取指,解碼,取操作數(shù),執(zhí)行,退出。
首先,處理器會(huì)根據(jù)指令指針寄存器(instruction pointer register)指示的地址取回指令。這時(shí),對(duì)處理器來說,指令僅僅是一些沒有意義的0、1字符串。只有在被解碼之后,指令對(duì)處理器來說才開始有意義。指令被解碼后可以得到操作數(shù)地址和操作碼,而操作數(shù)地址可以在下一步發(fā)揮作用:取操作數(shù)。你不會(huì)希望處理器對(duì)操作數(shù)的地址進(jìn)行計(jì)算,而是對(duì)那些地址里面存放的內(nèi)容進(jìn)行計(jì)算——與 C 語言里面的指針的概念很相似。當(dāng)操作數(shù)被取出來以后,ALU根據(jù)操作碼的指示,就可以對(duì)操作數(shù)進(jìn)行正確的計(jì)算了。計(jì)算結(jié)果一般將被寫回處理器內(nèi)部的寄存器堆中。有時(shí)候,計(jì)算結(jié)果也需要寫回到緩存和內(nèi)存中。這就是最后的步驟——退出。到此為止,你應(yīng)該略微了解一條指令的整個(gè)執(zhí)行過程了。
今天,對(duì)處理器設(shè)計(jì)者來說,主要的挑戰(zhàn)是處理器的存儲(chǔ)器訪問平均延遲。在一個(gè)由 Pentium 4 3.6GHz 和 DDR400 內(nèi)存構(gòu)成的系統(tǒng)中,處理器的速度是內(nèi)存的速度(200MHz)的18倍。也就是說,訪問內(nèi)存的每一個(gè)周期,處理器會(huì)經(jīng)過18個(gè)周期。而且,發(fā)送一個(gè)內(nèi)存訪問請(qǐng)求需要多個(gè)內(nèi)存周期,回應(yīng)一個(gè)內(nèi)存訪問也需要多個(gè)周期。因此,對(duì)于 Pentium 4 來說,花費(fèi)200到300個(gè)處理器周期來等待內(nèi)存訪問的完成并不罕見。設(shè)計(jì)處理器緩存的目標(biāo)就是避免內(nèi)存訪問的發(fā)生。但即使處理器緩存的缺失率僅為4%,也就是說,在處理器訪問存儲(chǔ)器的所有情況中只有4%的比例需要訪問內(nèi)存,這4%也將顯著降低處理器的執(zhí)行效率。
在處理器頻率已經(jīng)達(dá)到3GHz甚至更高的時(shí)代,保證即將用到的指令和數(shù)據(jù)已經(jīng)在緩存中準(zhǔn)備好是處理器設(shè)計(jì)者最重要的工作之一。因?yàn)橹挥羞@樣,才能保證隨著處理器頻率的提高性能也隨之提高;否則的話,更高的處理器頻率只會(huì)使處理器花費(fèi)更多的時(shí)鐘周期來等待數(shù)據(jù)。這種把數(shù)據(jù)提前裝入緩存的技術(shù)被稱為“數(shù)據(jù)預(yù)取技術(shù)”(Prefeching)。但是,之前的處理器采用的數(shù)據(jù)預(yù)取技術(shù)并不能保證每次都成功,總會(huì)有一些失敗的情況。這會(huì)導(dǎo)致處理器性能降低,特別是在運(yùn)行對(duì)帶寬敏感的應(yīng)用程序的時(shí)候。
Core 微架構(gòu)所采用的數(shù)據(jù)預(yù)取技術(shù)毫無疑問是目前為止非常先進(jìn)的,要優(yōu)于 Pentium 4 和 Athlon 64 所采用的技術(shù)。Core 微架構(gòu)中的每個(gè)核心至少有3組預(yù)取單元,包括2組數(shù)據(jù)預(yù)取單元和1組指令預(yù)取單元。除此之外,共享式二級(jí)緩存還擁有2組預(yù)取單元。這樣,在一個(gè)雙核心的采用 Core 微架構(gòu)的處理器中,共有8組預(yù)取單元。有一個(gè)問題是,多達(dá)8組的預(yù)取單元在進(jìn)行預(yù)取工作時(shí),很容易會(huì)妨礙到正在運(yùn)行的程序的正常的 load 操作。為了避免這種情況的發(fā)生,Core 微架構(gòu)采取了預(yù)取監(jiān)測(cè)器的機(jī)制,該監(jiān)測(cè)器總會(huì)給予正在運(yùn)行的程序更高的優(yōu)先級(jí)。這樣,預(yù)取單元就決不會(huì)從正在運(yùn)行的程序那里“偷”走很多帶寬了。
Core 微架構(gòu)的預(yù)取機(jī)制還有更多新特性。數(shù)據(jù)預(yù)取單元經(jīng)常需要在緩存中進(jìn)行標(biāo)簽查找。為了避免引起正在運(yùn)行的程序進(jìn)行的標(biāo)簽查找的更高的延遲,數(shù)據(jù)預(yù)取單元使用標(biāo)簽查找的 store 端口。如果你還記得,load 操作的發(fā)生頻率是 store 操作的2倍之多,那么就容易理解這樣的選擇了——store 端口的使用頻率僅為 load 端口的一半。并且,store 操作在大多數(shù)情況下并不是影響系統(tǒng)性能的關(guān)鍵,因?yàn)樵跀?shù)據(jù)開始寫入后,處理器可以馬上開始進(jìn)行下面的工作,而不必等待寫入操作完成。緩存/內(nèi)存子系統(tǒng)會(huì)負(fù)責(zé)數(shù)據(jù)的整個(gè)寫入到緩存、復(fù)制到主內(nèi)存的過程。
Core 微架構(gòu)的緩存系統(tǒng)也令人印象深刻。二級(jí)緩存容量高達(dá)4MB,并且是由兩個(gè)核心共享的,訪問延遲僅12到14個(gè)時(shí)鐘周期。每個(gè)核心還擁有32KB的一級(jí)指令緩存和一級(jí)數(shù)據(jù)緩存,訪問延遲僅僅3個(gè)時(shí)鐘周期。從 NetBurst 微架構(gòu)開始引入的追蹤式緩存(Trace Cache)在 Core 微架構(gòu)中消失了。NetBurst 微架構(gòu)中的追蹤式緩存的作用與常見的指令緩存相類似,是用來存放解碼前的指令的,對(duì) NetBurst 微架構(gòu)的長(zhǎng)流水線結(jié)構(gòu)非常有用。而 Core 微架構(gòu)回歸相對(duì)較短的流水線之后,追蹤式緩存也隨之消失,因?yàn)?Intel 認(rèn)為,傳統(tǒng)的一級(jí)指令緩存對(duì)短流水線的 Core 微架構(gòu)更加有用。
下面的表格不僅包括了 Core 微架構(gòu)和 K8 微架構(gòu)的存儲(chǔ)子系統(tǒng)的特性,還包括了之前的 K7 處理器、Pentium M 處理器及 Pentium 4 處理器等的存儲(chǔ)子系統(tǒng)的特性。
緩存結(jié)構(gòu)比較
通過瀏覽該表格,很快就可以發(fā)現(xiàn),Core 微架構(gòu)的存儲(chǔ)子系統(tǒng)給人留下非常深刻的印象。它不僅擁有最大容量的二級(jí)緩存,而且還擁有較低的緩存訪問延遲。共享式二級(jí)緩存的設(shè)計(jì)還可以使單個(gè)核心享用完全的4MB緩存。一級(jí)緩存和二級(jí)緩存的總線位寬都是256-bit,從而可以給核心提供最大的存儲(chǔ)帶寬。
Core 微架構(gòu)面對(duì)的最重要的競(jìng)爭(zhēng)對(duì)手是 AMD 的 K8 處理器。從表格中也可以看出,K8 處理器在存儲(chǔ)子系統(tǒng)上也并非全面處于下風(fēng),而是擁有兩個(gè)值得注意的優(yōu)勢(shì)。
首先是較大的一級(jí)緩存:64KB的一級(jí)指令緩存和64KB的一級(jí)數(shù)據(jù)緩存。不過 K8 處理器的一級(jí)緩存采用2路組相連結(jié)構(gòu)。相比之下,Core 微架構(gòu)采用的8路組相連結(jié)構(gòu)的32KB的一級(jí)緩存并不會(huì)差多少。
第二個(gè)優(yōu)勢(shì)是更加重要的一個(gè):K8 處理器擁有集成在處理器內(nèi)部的內(nèi)存控制器。這樣的做法大大降低了內(nèi)存訪問延遲。不過,采用 Core 微架構(gòu)的處理器的更快的前端總線也有效降低了內(nèi)存訪問延遲。就我們目前所知道的,K8 處理器在內(nèi)存訪問延遲上的優(yōu)勢(shì)會(huì)縮水到僅僅15%~20%,而不是與Pentium 4相比較時(shí)的幾乎加倍的速度(45~50納秒對(duì)比80~90納秒)。
即便如此,K8 處理器的這兩項(xiàng)小小的優(yōu)勢(shì)也有可能被與 Core 微架構(gòu)存儲(chǔ)子系統(tǒng)其他方面的比較抵消掉。Core 微架構(gòu)的處理器比競(jìng)爭(zhēng)對(duì)手 K8 處理器擁有更大的二級(jí)緩存和更加智能化的預(yù)取機(jī)制。Core 微架構(gòu)的處理器的一級(jí)緩存擁有大約2倍于 K8 處理器的帶寬(ScienceMark 軟件測(cè)試的結(jié)果),而其二級(jí)緩存的速度更是2.5倍于 K8 處理器的二級(jí)緩存。
與 K8 處理器類似,Core 微架構(gòu)會(huì)對(duì)取出的指令進(jìn)行預(yù)解碼。預(yù)解碼信息包括指令長(zhǎng)度和解碼邊界。
Core 微架構(gòu)裝備了4組解碼單元,這是X86處理器世界的第一次。這4組解碼單元包括3組簡(jiǎn)單解碼單元和1組復(fù)雜解碼單元。實(shí)際上,這種把簡(jiǎn)單指令與復(fù)雜指令分而治之的做法,并非是 P6 微架構(gòu)的專利。從全世界靠前個(gè)流水線化的X86處理器——80486開始,為了加速簡(jiǎn)單指令的執(zhí)行,這原則就已經(jīng)開始主導(dǎo)所有高速X86處理器的微架構(gòu)。就算是號(hào)稱提供三組“完整解碼單元”的 AMD K7、K8 處理器,實(shí)際上也有類似的限制。
在介紹下面的內(nèi)容之前,首先讓我們解釋一下什么是微指令(Micro-Op)。由于X86指令集的指令長(zhǎng)度、格式與定址模式都相當(dāng)復(fù)雜,為了簡(jiǎn)化數(shù)據(jù)通路(Data Path)的設(shè)計(jì),從很久以前開始,X86處理器就采用了將X86指令解碼成1個(gè)或多個(gè)長(zhǎng)度相同、格式固定、類似RISC指令形式的微指令的設(shè)計(jì)方法,尤其是涉及存儲(chǔ)器訪問的 load 及 store 指令。所以,現(xiàn)在的X86處理器的執(zhí)行單元真正執(zhí)行的指令是解碼后的微指令,而不是X86指令。
所以,對(duì)X86處理器來說,解碼單元的任務(wù)不僅僅是解碼出操作碼和操作數(shù)的地址,還要把長(zhǎng)度從1字節(jié)到15字節(jié)不等的X86指令轉(zhuǎn)化成容易調(diào)度和執(zhí)行的固定長(zhǎng)度的類似RISC指令的微指令(Micro-Op)。
常見的普通X86指令可以由3組簡(jiǎn)單解碼單元中的任何一組翻譯成1條微指令。另外1組復(fù)雜解碼單元負(fù)責(zé)解碼一些復(fù)雜的、需要翻譯成4條微指令的X86指令。還有一些更長(zhǎng)、更復(fù)雜的X86指令,需要微碼序列器配合復(fù)雜解碼單元來翻譯成微指令。這種簡(jiǎn)單解碼單元與復(fù)雜解碼單元相配合的解碼方式被現(xiàn)代的X86處理器所普遍采用,包括 P6 微架構(gòu)、K7 處理器、K8處理器和 Pentium 4 處理器。
Core 微架構(gòu)中的解碼單元還擁有更多新特性。首先是宏指令融合技術(shù)(Macro-Op Fusion)。該技術(shù)可以把2條相關(guān)的X86指令融合為1條微指令。例如,X86比較指令cmp可以與跳轉(zhuǎn)指令jne融合。這類情況一般發(fā)生在程序中的if-then-else分支語句中。


宏指令融合技術(shù)帶來的效果是非常明顯的。在一個(gè)傳統(tǒng)的X86程序中,每10條指令就有2條指令可以被融合。也就是說,宏指令融合技術(shù)的引入可以減少10%的指令數(shù)量。而當(dāng)2條X86指令被融合的時(shí)候,4組解碼單元在單周期內(nèi)一共可以解碼5條X86指令。被融合的指令在后面的操作中完全是一個(gè)整體,這帶來幾個(gè)優(yōu)勢(shì):更大的解碼帶寬,更少的空間占用,和更低的調(diào)度負(fù)載。如果 Intel 宣稱的“每10條指令可以融合1次”的說法屬實(shí),那么宏指令融合技術(shù)本身就將帶來巨大的性能提升。
另外一項(xiàng)技術(shù)即微指令融合技術(shù),是從之前的 Pentium M 處理器繼承而來的。介紹這項(xiàng)技術(shù)之前,我們先來了解一下相關(guān)的問題和早期的解決辦法。有一小部分X86指令處理起來非常困難,但是同時(shí)又是十分典型和常見的X86指令。一般來說,存儲(chǔ)器尋址的算術(shù)操作就屬于這一類指令,例如,ADD [mem], EAX。這表示把寄存器EAX的內(nèi)容與地址為mem的內(nèi)存單元的內(nèi)容相加,并把計(jì)算結(jié)果寫回該內(nèi)存單元。
在早期的處理器設(shè)計(jì)中,包括采用 P6 微架構(gòu)的Pentium Pro、Pentium II 和 Pentium III 處理器,如果遇到這種類型的指令,那么解碼單元將把它解碼成2條甚至3條微指令。記住,從 P6 微架構(gòu)之后的現(xiàn)代X86處理器的設(shè)計(jì)思想是把X86指令解碼成類似RISC指令的微指令,然后再把這些微指令送往越來越RISC化的后端,而后端以類似RISC處理器的處理方式進(jìn)行調(diào)度、發(fā)射、執(zhí)行和退出。
對(duì)于類似ADD [mem], EAX這樣的指令,你沒有辦法送往RISC化的執(zhí)行單元,因?yàn)樗`反了 RISC 架構(gòu)的根本規(guī)則——RISC 架構(gòu)的處理器會(huì)把所有的數(shù)據(jù) load 到寄存器,然后針對(duì)寄存器進(jìn)行操作、計(jì)算等。
因此,ADD [mem], EAX這條指令會(huì)被解碼成多條微指令,簡(jiǎn)單示意如下:
MOV EBX, [mem]:讀取[mem]的內(nèi)容到寄存器
ADD EBX, EAX:對(duì)2個(gè)寄存器作ALU操作
MOV [mem], EBX:保存計(jì)算結(jié)果到[mem]
自從 Banias 處理器之后,上面的load操作和ALU操作就可以用一條微指令來完成了。Intel 把該技術(shù)稱為微指令融合技術(shù)(Micro-Op Fusion)。這項(xiàng)技術(shù)不是一件容易的事情:在舊的設(shè)計(jì)中,把load操作與ALU操作一起進(jìn)行會(huì)導(dǎo)致對(duì)應(yīng)的那一級(jí)流水線延遲加大,從而降低處理器所能達(dá)到的最高頻率。(在處理器設(shè)計(jì)中,可能達(dá)到的最高頻率取決于最慢的那一級(jí)流水線的延遲時(shí)間,即所謂的木桶效應(yīng)。)只有可以并行執(zhí)行、設(shè)計(jì)優(yōu)秀的電路才使得在引入微指令融合技術(shù)的同時(shí)不顯著降低處理器的頻率。
在預(yù)解碼的階段,處理器會(huì)識(shí)別可以應(yīng)用微指令融合技術(shù)的指令。在解碼階段,類似 ADD [mem], EAX 的復(fù)雜指令就可以生成比舊架構(gòu)數(shù)量更少的微指令。與宏指令融合技術(shù)帶來的效果類似,這可以帶來更大的解碼帶寬,更少的空間占用,更低的調(diào)度負(fù)載和更高的效率。
微指令融合技術(shù)的目的就在于減少微指令的數(shù)目。處理器內(nèi)部執(zhí)行單元的資源有限,如果可以減少微指令的數(shù)目,就代表實(shí)際執(zhí)行的X86指令增加了,可以顯著提升執(zhí)行效能。而且,微指令的數(shù)目減少還有助于降低處理器功耗,可謂有益無害。
微指令融合技術(shù)所支持的范圍,包括了整數(shù)運(yùn)算、浮點(diǎn)運(yùn)算和SSE2指令集等各種擴(kuò)展指令集。根據(jù) Intel 的官方說法,通過微指令融合技術(shù),整數(shù)運(yùn)算大約可以提升5%的性能,浮點(diǎn)運(yùn)算大約可以提升9%的性能。
Core 微架構(gòu)前端的改進(jìn)還包括分支預(yù)測(cè)單元。分支預(yù)測(cè)行為發(fā)生在取指單元部分。首先,它使用了很多人們已經(jīng)熟知的預(yù)測(cè)單元,包括傳統(tǒng)的 NetBurst 微架構(gòu)上的分支目標(biāo)緩沖區(qū)(Branch Target Buffer,簡(jiǎn)稱BTB)、分支地址計(jì)算器(Branch Address Calculator,簡(jiǎn)稱BAC)和返回地址棧(Return Address Stack,RAS)。然后,它還引入了2個(gè)新的預(yù)測(cè)單元——循環(huán)回路探測(cè)器(Loop Detector,簡(jiǎn)稱LD)和間接分支預(yù)測(cè)器(Indirect Branch Predictor,簡(jiǎn)稱IBP),其中循環(huán)回路探測(cè)器可以正確預(yù)測(cè)循環(huán)的結(jié)束,而間接分支預(yù)測(cè)器可以基于全局的歷史信息做出預(yù)測(cè)。Core 微架構(gòu)在分支預(yù)測(cè)方面不僅可以利用所有這些預(yù)測(cè)單元,還增加了新的特性:在之前的設(shè)計(jì)中,分支轉(zhuǎn)移總是會(huì)浪費(fèi)流水線的一個(gè)周期;Core 微架構(gòu)在分支目標(biāo)預(yù)測(cè)器和取指單元之間增加了一個(gè)隊(duì)列,在大部分的情況下可以避免這一個(gè)周期的浪費(fèi)。
接下來讓我們來看一下這有趣的對(duì)比:Core 微架構(gòu)的3組簡(jiǎn)單解碼單元與1組復(fù)雜解碼單元 vs. K8 處理器的3組復(fù)雜解碼單元。
K7 處理器有2種解碼方法,向量路徑(Vector Path)和直接路徑(Direct Path)。向量路徑解碼會(huì)生成多于2條的類似RISC的指令(AMD稱為Macro-Op,即宏指令)。直接路徑解碼會(huì)生成1條或者2條宏指令。K7 處理器的每組解碼單元都可以進(jìn)行向量路徑解碼和直接路徑解碼,但是從性能的角度講,直接路徑解碼無疑是更好的選擇,因?yàn)樗鼤?huì)生成數(shù)量較少的宏指令。怎么,你覺得突然談?wù)?K7 處理器有點(diǎn)奇怪?不,因?yàn)榫拖?Core 微架構(gòu)是基于 P6 微架構(gòu)一樣,K8 處理器很大程度上也是基于 K7 處理器的。
K7 處理器的3組復(fù)雜解碼單元是強(qiáng)大的,可以解碼絕大多數(shù)X86指令,只有很少一部分指令需要使用向量路徑解碼。它們僅有的缺點(diǎn)是一些浮點(diǎn)指令和SSE指令需要使用向量路徑解碼。而 K8 處理器擁有更強(qiáng)大的復(fù)雜解碼單元——幾乎所有的浮點(diǎn)指令和SSE指令都可以使用直接路徑解碼了。這是因?yàn)镵8 處理器的取指與解碼單元的流水線比 K7 處理器的更長(zhǎng)。當(dāng)涉及到SIMD指令時(shí),K8 處理器尤其強(qiáng)于 K7 處理器。
顯然,Intel 的宏指令融合技術(shù)在AMD 的 K8 處理器上并不存在。但是,AMD擁有與微指令融合技術(shù)類似的技術(shù)。首先需要注意的是,Intel 與 AMD 使用的名詞“宏指令”與“微指令”具有不同的含義,很容易使人混淆。這里我們給出下面的表格,對(duì)它們進(jìn)行分辨。

名詞辨析
在 Athlon 處理器中,也存在有微指令融合技術(shù)。例如,一條 ADD [mem], EAX 指令在真正執(zhí)行前中始終保持為一條指令。因此,它在緩沖區(qū)中也只會(huì)占據(jù)1個(gè)單元的空間。不過,在 Core 微架構(gòu)中 load 操作和 SSE 操作等也可以被融合,而 K8 處理器則不行,它會(huì)把SSE操作解碼成2條宏指令。
那么,在解碼單元方面,Intel 的 Core 微架構(gòu)與 AMD 的 K8 處理器比較的結(jié)果是什么呢?就目前的資料來看,還很難確切的說到底哪個(gè)更加有實(shí)力。不過,我們有一個(gè)初步的看法:Core 微架構(gòu)要更具有優(yōu)勢(shì)。因?yàn)樵谝话闱闆r下,它每個(gè)時(shí)鐘周期可以解碼4條X86指令,加上宏指令融合技術(shù)的話則最多可以解碼5條X86指令。而 AMD 的 K8 處理器每個(gè)時(shí)鐘周期只能解碼3條。
總而言之,AMD 的3組復(fù)雜解碼單元?jiǎng)龠^ Core 微架構(gòu)的3組簡(jiǎn)單解碼單元加上1組復(fù)雜解碼單元的情況不大可能發(fā)生。僅當(dāng)多條復(fù)雜指令同時(shí)需要復(fù)雜解碼單元進(jìn)行解碼的時(shí)候,K8 處理器的解碼單元會(huì)勝過 Core 微架構(gòu)的解碼單元。但是考慮到實(shí)際程序中的絕大多數(shù)X86指令對(duì)應(yīng)簡(jiǎn)單解碼單元的事實(shí),這種情況不大可能發(fā)生。
為了使讀者更加清晰的了解AMD K8 處理器與 Intel Core 微架構(gòu)的區(qū)別,我們使用相同的風(fēng)格制作了下面的圖表。
Core 微架構(gòu)
K8 處理器
從圖上可以看到Core 微架構(gòu)與K8 處理器的明顯區(qū)別。Core 微架構(gòu)擁有更大的亂序緩沖區(qū)——96 entry,再考慮到它的宏指令融合技術(shù),其實(shí)際容量比 K8 處理器的72 entry要大的多。而最初的 P6 微架構(gòu)只有40 entry,在Banias、Dothan 及 Yonah 處理器中增加到了80 entry,而現(xiàn)在的 Core 微架構(gòu)進(jìn)一步增加到了96 entry。為了看起來清晰、直觀,我們制作了下面的表格來比較這幾代處理器的重要特性。
幾代處理器特性比較
Core 微架構(gòu)采用集中式保留站(central reservation station),而 K8 處理器采用分布式調(diào)度器(distributed scheduler)。集中式保留站的優(yōu)勢(shì)是擁有更高的利用率,而分布式調(diào)度器能容納更多的表項(xiàng)。NetBurst 微架構(gòu)也采用分布式調(diào)度器。
使用集中式保留站也是把 Core 微架構(gòu)稱作“P8 微架構(gòu)”的理由之一,這是相對(duì)古老的 P6 微架構(gòu)的第二項(xiàng)巨大的提升。它利用保留站并調(diào)度與分配執(zhí)行單元來執(zhí)行微指令。執(zhí)行結(jié)束后,執(zhí)行結(jié)果被存儲(chǔ)到亂序緩沖區(qū)內(nèi)。這樣的設(shè)計(jì)方式無疑是繼承自Yonah、Dothan 甚至 P6 微架構(gòu)。
最大的區(qū)別并不能立即從圖表上看出來。Intel 先前的處理器需要2個(gè)時(shí)鐘周期才能完成一次分支預(yù)測(cè)操作,而 Core 微架構(gòu)只需要1個(gè)時(shí)鐘周期。而 AMD 的 K8 處理器也只需要1個(gè)時(shí)鐘周期就可以完成一次分支預(yù)測(cè)操作。
另外一處令人驚訝的地方是 Core 微架構(gòu)的 SSE 多媒體指令執(zhí)行性能。Core 微架構(gòu)擁有3組非常強(qiáng)大的128-bit的 SSE 執(zhí)行單元,其中2組是對(duì)稱的。擁有如此強(qiáng)大的SSE執(zhí)行資源,Core 微架構(gòu)在執(zhí)行128-bit SSE2/SSE3指令時(shí)將遠(yuǎn)遠(yuǎn)超過 K8 處理器。
在 K8 處理器上,1條128-bit的 SSE 指令會(huì)被解碼成2條64-bit的指令,因?yàn)?K8 處理器的 SSE 執(zhí)行單元只能執(zhí)行64-bit的指令。所以說,從這個(gè)角度看,Core 微架構(gòu)的SSE處理能力至少是 K8 處理器的2倍。如果是對(duì)64-bit的浮點(diǎn)進(jìn)行操作,Core 微架構(gòu)每個(gè)時(shí)鐘周期可以處理4個(gè)雙精度浮點(diǎn)數(shù)的計(jì)算,而 K8 處理器可以處理3個(gè)。
就整數(shù)執(zhí)行單元來說,Core 微架構(gòu)比 Pentium 4 處理器和 Dothan 處理器也有很大的提高,而與 K8 處理器處于同樣的水準(zhǔn)——如果只考慮執(zhí)行單元的數(shù)量的話,Core 微架構(gòu)與 K8 處理器都擁有3組ALU。如果也考慮 AGU 的話,K8 處理器擁有3組,甚至比 Core 微架構(gòu)的2組要更有優(yōu)勢(shì)。這可能會(huì)使 K8 處理器在一些不太常見的整數(shù)計(jì)算中有優(yōu)勢(shì),比如解密運(yùn)算。不過,Core 微架構(gòu)擁有的更深、更靈活的亂序緩沖區(qū)和更大、更快速的二級(jí)緩存可以在絕大多數(shù)整數(shù)運(yùn)算中消除 K8 處理器這個(gè)小小的優(yōu)勢(shì)。
自從采用 P6 微架構(gòu)的 Pentium Pro 處理器之后,X86 處理器開始擁有亂序發(fā)射和執(zhí)行指令的能力。不過,亂序緩沖區(qū)內(nèi)平均大約三分之一的指令很難重排序——就是那些 load 操作。把 load 操作提前執(zhí)行可以極大的提高性能。與需要數(shù)據(jù)的時(shí)候才進(jìn)行 load 操作相比,盡可能早的開始 load 操作十分有用,因?yàn)檫@可以更有效的把一級(jí)緩存及二級(jí)緩存的延遲隱藏掉。
這很容易理解。假設(shè)現(xiàn)在有一個(gè) ALU 操作需要某數(shù)據(jù),可是該數(shù)據(jù)不在一級(jí)緩存中。如果 load 該數(shù)據(jù)的操作在該 ALU 操作之前就已經(jīng)執(zhí)行完畢,那么訪問二級(jí)緩存的延遲就不會(huì)對(duì)性能產(chǎn)生影響。不過,需要注意的是,如果 load 操作針對(duì)的數(shù)據(jù)在程序中還有 store 操作要對(duì)其進(jìn)行寫入,那么就不能把 load 操作提前到該 store 操作之前執(zhí)行。因?yàn)檫@樣的情況下,如果提前執(zhí)行 load 操作的話,意味著你得到的會(huì)是錯(cuò)誤的數(shù)據(jù),而不是最新的。

Intel 內(nèi)存相關(guān)性預(yù)測(cè)技術(shù)
上圖中的 Load 2 操作不能提前執(zhí)行,因?yàn)樗僮鞯臄?shù)據(jù)與 Store 1 操作的數(shù)據(jù)相同,需要等待 Store 1 操作先完成。只有 Store 1 執(zhí)行完畢,數(shù)據(jù)Y才擁有正確的值。不過 Load 4 操作沒有理由不能提前進(jìn)行,它不需要等待 Store 1 或者 Store 3 操作完成。這樣,通過把 Load 4 操作提前,load 單元有更多的時(shí)間去獲得正確的操作數(shù)。
不過,之前的處理器在這種情況下——有 store 操作存在——都不會(huì)把 load 操作提前。因?yàn)樘幚砥鞑恢?store 操作針對(duì)的數(shù)據(jù)單元與 load 操作是否相同。如果想要搞清楚是否相同的話,需要計(jì)算存儲(chǔ)器地址。這十分困難,因?yàn)樵谥噶顏y序和調(diào)度的時(shí)候,存儲(chǔ)器地址還是未知的。
這時(shí)需要注意一個(gè)事實(shí):load 操作讀取到一個(gè)錯(cuò)誤數(shù)據(jù)的概率相當(dāng)小,只有1%到2%。所以,Intel 的 Core 微架構(gòu)設(shè)計(jì)師 Jack Doweck 決定,允許所有的 load 操作提前執(zhí)行,假設(shè)所有的 load 操作讀取到的數(shù)據(jù)都是正確的。而為了應(yīng)對(duì)錯(cuò)誤的發(fā)生,Intel 加入了一個(gè)預(yù)測(cè)器。
根據(jù) Jack Doweck 的描述,以及我們對(duì)以前的 P6 微架構(gòu)和 Pentium M 處理器的了解,我們制作了下面的圖表。注意這并非 Intel 官方的圖表。
Core 微架構(gòu)亂序執(zhí)行引擎
預(yù)測(cè)器做出預(yù)測(cè),并指示亂序緩沖區(qū)是否可以把某 load 操作提前執(zhí)行。在 load 操作提前執(zhí)行之后,沖突監(jiān)測(cè)單元會(huì)掃描MOB(Memory Reorder Buffer),查看是否有 store 操作與 load 操作沖突。如果有沖突發(fā)生的話,load 操作必須重新執(zhí)行,這時(shí)大約會(huì)損失20個(gè)時(shí)鐘周期。不過與之前的處理方式相比,Core 微架構(gòu)采用的這種處理方式總體上肯定可以提高處理器的效率。
檢測(cè)某 load 操作和某 store 操作是否是針對(duì)同一內(nèi)存地址的行為稱作內(nèi)存相關(guān)性預(yù)測(cè)(memory disambiguation)。Core 微架構(gòu)允許 load 操作提前到 store 操作之前執(zhí)行的處理方式可以帶來性能上的巨大提升。在某些測(cè)試代碼中,這個(gè)提升甚至達(dá)到了40%。雖然我們?cè)趯?shí)際的應(yīng)用程序中不會(huì)看到如此大的提升,但是無疑這項(xiàng)技術(shù)會(huì)帶來令人印象深刻的提升——我們可以期待10%到20%的性能提升。
不要忘記,load 操作可能是所有操作中最重要的操作。不僅僅因?yàn)?load 指令占了X86處理器內(nèi)所有微指令的三分之一強(qiáng),還因?yàn)楫?dāng) load 操作發(fā)生時(shí)可能導(dǎo)致的巨大延遲會(huì)引起處理器的等待。那么,這項(xiàng)極其靈活的 load 操作亂序執(zhí)行技術(shù)與其它架構(gòu)的處理器相比是什么情況呢?

Load 操作處理方式比較
舊的 P6 微架構(gòu)和 Penium M 處理器也已經(jīng)可以較好的處理 load 操作,可以把某 load 操作提前到另外的 load 操作之前進(jìn)行,也可以提前到已知不會(huì)發(fā)生沖突的 store 操作之前進(jìn)行。P6 微架構(gòu)的內(nèi)存亂序緩沖區(qū)(Memory Reorder Buffer,簡(jiǎn)稱MOB)采用如下的規(guī)則:如果在亂序執(zhí)行窗口中存在與某load操作內(nèi)存地址相同的store操作,則該load操作不能提前執(zhí)行;如果在亂序執(zhí)行窗口中存在內(nèi)存地址未知的store操作,則任何load操作不能提前執(zhí)行;某store操作不能提前到另外一個(gè)store操作之前執(zhí)行。
相比之下,K8 處理器要遜色的多,它只能把 load 操作移動(dòng)到不相關(guān)的 ALU 操作之前進(jìn)行,而不能移動(dòng)到其它 load 操作之前,當(dāng)一個(gè) load 操作等待某 store 操作執(zhí)行的時(shí)候,處理器會(huì)浪費(fèi)大量的時(shí)鐘周期。這意味著 K8 處理器在指令亂序這方面受到極大的限制。
這也許是 K8 處理器在游戲和整數(shù)計(jì)算等方面輸給 Core 微架構(gòu)的最重要的原因之一,盡管它擁有延遲更低的內(nèi)存子系統(tǒng)和更多的整數(shù)執(zhí)行資源。整數(shù)運(yùn)算進(jìn)行的存儲(chǔ)器操作經(jīng)常有許多未知的地址需要計(jì)算,而浮點(diǎn)運(yùn)算則不是這樣,它對(duì)存儲(chǔ)器的訪問是更加規(guī)范的。這也是 K8 處理器在浮點(diǎn)運(yùn)算方面不輸給 Dothan 處理器的原因之一。
當(dāng) load 操作和 store 操作都已經(jīng)進(jìn)入 Load/Store 單元的隊(duì)列中的時(shí)候,K8 處理器允許 load 操作在不沖突的 store 操作之前執(zhí)行。不幸的是,這時(shí)把 load 操作提前執(zhí)行已經(jīng)不能隱藏緩存缺失所帶來的延遲。你可以認(rèn)為這是 K8 處理器擁有的 Load/Store 亂序機(jī)制,但是它在流水線中的位置太靠后,比起 P6 微架構(gòu)、Pentium M 處理器和 Core 微架構(gòu)所采用的技術(shù)相差甚遠(yuǎn)。
Core 微架構(gòu)擁有龐大的執(zhí)行資源和巨大的共享式二級(jí)緩存,看起來是非常適合應(yīng)用 SMT(Simultaneous Multi Threading)技術(shù)的處理器設(shè)計(jì)。但是,Intel 并沒有在 Core 微架構(gòu)中應(yīng)用 SMT 技術(shù)。其原因并不是 SMT 技術(shù)不能帶來好的結(jié)果。Intel 的工程師接受的任務(wù)是研發(fā)擁有較好性能的、可以適應(yīng)服務(wù)器和桌面系統(tǒng)和移動(dòng)系統(tǒng)等多種平臺(tái)的處理器。而SMT技術(shù)只有在服務(wù)器平臺(tái)上才能帶來最大的性能提升——最高可以達(dá)到40%。因此以色列團(tuán)隊(duì)的工程師們決定放棄SMT技術(shù)。另外,SMT技術(shù)還會(huì)使處理器中發(fā)熱最大的部分更熱,所以說,SMT 并不適合 Core 微架構(gòu)的“單個(gè)微架構(gòu)統(tǒng)一所有平臺(tái)”及“功耗最優(yōu)化平臺(tái)”的設(shè)計(jì)思想。
至于引入集成式內(nèi)存控制器(Integrated Memory Controller,簡(jiǎn)稱IMC),Intel 的工程師表示花費(fèi)在內(nèi)存控制器上的晶體管不如放到二級(jí)緩存上。這個(gè)觀點(diǎn)當(dāng)然會(huì)引起極大的爭(zhēng)議。不過有一點(diǎn)是可以肯定的:二級(jí)緩存的功耗會(huì)比內(nèi)存控制器更小。Intel 的這個(gè)選擇也許是因?yàn)榘褍?nèi)存控制器放到芯片組上使得他們可以在不改變處理器設(shè)計(jì)的情況下支持新類型的內(nèi)存??紤]到 Intel 的桌面平臺(tái)和移動(dòng)平臺(tái)使用 DDR2 內(nèi)存模組,而服務(wù)器平臺(tái)將使用 FB-DIMM 內(nèi)存模組,這樣做的靈活性就很明顯了。改進(jìn)的內(nèi)存相關(guān)性預(yù)測(cè)技術(shù)及預(yù)取單元等可以彌補(bǔ)不集成內(nèi)存控制器帶來的損失。那么,集成內(nèi)存控制器會(huì)提高 Intel 處理器的性能嗎?幾乎是肯定的,但是 Intel 目前還在考慮其它的選擇。
Intel Core 微架構(gòu)很明顯是曾經(jīng)取得過巨大成功的 P6 微架構(gòu)的繼承者。不過,它加入了很多新的特性和設(shè)計(jì),比如微指令融合技術(shù)、宏指令融合技術(shù)、內(nèi)存相關(guān)性預(yù)測(cè)和龐大的 SIMD 及浮點(diǎn)執(zhí)行資源。
與優(yōu)秀的 AMD K8 處理器的設(shè)計(jì)相比,采用 Core 微架構(gòu)的處理器是更寬、更有效率、更加亂序化的處理器設(shè)計(jì)。當(dāng)我們對(duì) Jack Doweck 提出“Core 微架構(gòu)中龐大的執(zhí)行資源需要 SMT 技術(shù)才能完全利用”的觀點(diǎn)的時(shí)候,Jack Doweck 表示不同意。全新的內(nèi)存相關(guān)性預(yù)測(cè)技術(shù)從指令級(jí)并行的層次上把 load 操作的并行性提高了一大塊,而 Core 微架構(gòu)強(qiáng)大的一級(jí)緩存與二級(jí)緩存帶來的高帶寬可以幫助處理器把執(zhí)行單元的利用率保持在與 Pentium M 處理器相近的水平上。這樣,與時(shí)鐘頻率相同的 Pentium M 處理器相比,Core 微架構(gòu)多出的三分之一的執(zhí)行資源可以獲得接近三分之一的性能提升。
那么,對(duì) AMD 來說,是否意味著“Game Over”?首先,我們幾乎可以肯定,在 AMD 下一代的處理器上肯定會(huì)有一些明顯的變化。然后,現(xiàn)在還不能說 K8 處理器的生命周期已經(jīng)結(jié)束了。AMD 可以做的一種明顯的升級(jí)措施是增強(qiáng)其處理器的 SSE 執(zhí)行性能,可以通過增加執(zhí)行單元的位寬,或者增加浮點(diǎn)流水線中的執(zhí)行單元的數(shù)量。
為了保證浮點(diǎn)單元的實(shí)力得到充分的發(fā)揮,AMD 應(yīng)該提高處理器緩存的帶寬。舊的 K7 處理器的二級(jí)緩存相當(dāng)慢,而 K8 處理器已經(jīng)可以把二級(jí)緩存能夠提供的帶寬加倍。我們可以期待 AMD 在未來的處理器的二級(jí)緩存上使用256-bit的總線位寬。
最后,AMD K8 處理器的整數(shù)性能也還有很大的提升空間。K8 處理器對(duì) load 操作的亂序執(zhí)行并不優(yōu)秀,這是從 K7 處理器開始就存在的弱點(diǎn)。實(shí)際上,我們知道 AMD 的設(shè)計(jì)師對(duì)此非常清楚,但是在 K8 處理器上沒有做出改進(jìn)非常令人驚訝。如果能夠更加有效的對(duì) load 操作進(jìn)行亂序執(zhí)行,即使不能達(dá)到 Core 微架構(gòu)所采用的內(nèi)存相關(guān)性預(yù)測(cè)技術(shù)的效果,也可以期待5%的性能提升。這也是 Pentium M 處理器能夠在某些類型的應(yīng)用程序中擊敗 K8 處理器的重要原因之一。
這些只是一些我們熟悉的方面。除此之外,可能還會(huì)有更多的措施可以使 K8 處理器延續(xù)的更久。
再來看一下采用 Core 微架構(gòu)的服務(wù)器產(chǎn)品Woodcrest,考慮到服務(wù)器應(yīng)用程序中能夠發(fā)揮指令級(jí)并行能力的地方并不多,Core 微架構(gòu)沒有應(yīng)用超線程技術(shù)應(yīng)該是它僅有的缺點(diǎn)。這個(gè)小缺點(diǎn)是 Core 微架構(gòu)的設(shè)計(jì)思想導(dǎo)致的,因?yàn)?Core 微架構(gòu)需要顧及服務(wù)器平臺(tái)、桌面平臺(tái)和移動(dòng)平臺(tái)。這也許會(huì)使 Sun 公司和 IBM 公司在某些需要進(jìn)行多線程應(yīng)用的服務(wù)器平臺(tái)上得到機(jī)會(huì)。不過,采用 Core 微架構(gòu)的4核產(chǎn)品 Tigerton 很快就要到來,也許可以彌補(bǔ)這個(gè)劣勢(shì)。那么,現(xiàn)在我們的讀者應(yīng)該清楚了:你很難從 Core 微架構(gòu)中找出明顯的缺陷。
不過,具有諷刺意義的是,就在一年前,Intel 還并不重視提升IPC(Instructions Per Clock)和ILP(指令級(jí)并行能力)。多核被認(rèn)為是未來的發(fā)展趨勢(shì),而單核的性能似乎無關(guān)緊要。因此在 Dobbs 博士的文章中曾經(jīng)提到“The free lunch is over”(免費(fèi)的午餐結(jié)束了),他認(rèn)為以后只有增大緩存才能帶來IPC的微弱提升,開發(fā)者把注意力集中在處理器的IPC效率上的日子已經(jīng)一去不復(fù)返了。一些研究者甚至認(rèn)為,具有簡(jiǎn)單的、順序執(zhí)行的架構(gòu)的處理器才是未來的方向。
我們卻非常懷疑“Threading is our only savior”(多線程是唯一的救世主)。Unreal 3 游戲引擎的開發(fā)者 Tim Sweeney 曾經(jīng)指出,在下一代游戲引擎中開發(fā)多線程的代碼是非常大的挑戰(zhàn)。寬流水線、高頻率的處理器被否定得有一些過快。NetBurst 微架構(gòu)的設(shè)計(jì)使用了 LVS 電路設(shè)計(jì)的策略來實(shí)現(xiàn)極高的頻率,而 Core 微架構(gòu)并沒有采用這種策略。但是,它仍然是一個(gè)采取極寬流水線的、采取亂序執(zhí)行策略的處理器,這是那些不想花費(fèi)太大力氣在編寫多線程應(yīng)用程序上的程序員的免費(fèi)的午餐。從這個(gè)角度來說,對(duì)雙核處理器發(fā)展的需求可能不會(huì)那么太迫切。讓用戶得到更高的性能是軟件開發(fā)者和處理器設(shè)計(jì)者共同的責(zé)任。是的,雙核是好東西,但是單核的性能仍然重要。
[下載]常用工具大放送(測(cè)試可下)
經(jīng)驗(yàn):裝臺(tái)P4機(jī)器 奸商騙人手段大放送
我使用雙核820的2個(gè)月體會(huì) 獻(xiàn)給大家
DIY攢機(jī)手冊(cè)(精華)
高手的八套AMD裝機(jī)單(五月版)
答疑:5月裝機(jī)專家配置點(diǎn)評(píng)<
關(guān)注我們
