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

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

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

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

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


