本文主要參考資料是RWT(Real-world-tech)網站的文章,另外由Pcinlife網友阿藍二代翻譯 ,而小弟則是把他繁中化。另外,對於參考資料有矛盾的地方,盡量以這次上海IDF的英文PPT為準。由於寫得匆忙,水準有限,錯誤難免。對於文中有錯誤的地方,謝謝各位提出指正,也歡迎各位補充有更新的資料。歡迎大家進行技術討論。
下文介紹的Nehalem的技術指標主要是以Nehalem-EP(Gainestown)為範例來介紹的,該核心將會用於Xeon DP,就是用於伺服器的雙CPU。Nehalem是具有Quad-Core、8Threads、64bit、4超標量發射、Out-of-Order Engine的CPU,有16級管線、48bit虛擬定址和40bit物理定址。
簡單來說,Nehalem還是一個建立在CoreMA(Core MicroArchitecture)架構上的產品,額外添加了SMT(Simultaneous Multithreading)、L3 Cache、TLB(Translation Lookaside buffer)和分支預測的強化、IMC(Integrated Memory Controller)、QPI(QuickPath Interconnect)和支援DDR3等技術的處理器。比起從Pentium 4的NetBurst架構到Core微架構的較大變化來說,從Core 微架到Nehalem架構的基本核心部分的變化則要小一些,因為Nehalem還是採用4-Wide的設計。
Nehalem的核心部分比Core微架構新增加的功能主要有以下幾方面︰
New SSE4.2 Instructions (新增加SSE4.2指令)
Improved Lock Support (改進的鎖定支援)
Additional Caching Hierarchy (新的快取層次體系)
Deeper Buffers (更深的緩衝)
Improved Loop Streaming (改進的循環串流)
Simultaneous Multi-Threading (同步多線程)
Faster Virtualization (更快的虛擬化)
Better Branch Prediction (更好的分支預測)
一、QPI匯流排技術
Nehalem使用的QPI匯流排是採用數據包傳輸(packet-based)、高頻寬、低延遲的點對點技術(Point to Point Interconnect),速度達到6.4GT/s(每秒可以傳輸6.4G數據)。每一條連接(link)是20bit頻寬的介面,使用高速的差分信號(differential signaling)和專用的時脈通道(dedicated clock lane),這些時脈通道具有失效備援(failover)。QPI數據包是80bit的長度,發送需要用4個週期。儘管數據包是80bit,但只有64bit是用於數據,其它的數據位則是用於流量控管、CRC和其它一些目的。這樣,每條連接就一次傳輸16bit(2Byte)的數據,其餘的頻寬則是用於CRC。由於QPI匯流排可以雙向傳輸,那麼一條QPI匯流排連接理論最大值就可以達到25.6GB/s(2×2B×6.4GT/s)的數據傳輸。單向則是12.8GB/s。
對於不同市場的Nehalem,可以提供不同數量的QPI匯流排。比如桌上型市場的CPU,可以具有1條或者半條QPI匯流排(半條可能是用10bit頻寬或單向);DP伺服器(雙CPU插槽)的CPU,每個具有2條QPI匯流排;而MP伺服器(4個或8個CPU插槽)的,則每個具有4條或更多的QPI匯流排。
二、IMC
Nehalem的IMC(integrated memory controller,整合記憶體控制器),可以支援3通道的DDR3記憶體,運行在1.33GT/s(DDR3-1333),這樣總共的最高頻寬就可以達到32GB/s(3×64bit×1.33GT/s÷8)。不過還並不支援FB-DIMM,要Nehalem EX(Beckton)才有可能會支援FB-DIMM(Fully Buffered-DIMM,全緩衝記憶體模組)。每通道的記憶體都能夠獨立操作,控制單元需要亂序執行來降低(掩蓋)延遲。由於有了Core 2近4倍的記憶體頻寬,Nehalem的每個核心支援最大10個未解決的數據快取命中失敗(outstanding data cache miss)和總共16個命中失敗,而Core 2在運行中則只支援最大8個數據快取和總共14個的命中失敗。
IMC能夠很顯著的降低記憶體延遲(尤其是對於採用FB-DIMM方案的系統)。下面的Nehalem與Harpertown,我不清楚是什麼頻率情況下的對比(來自於IDF上的表格,可能Nehalem是3.2GHz)。Nehalem的本地端記憶體延遲大約是Harpertown的60%。Harpertown系統使用的是1.6GT/s的前端匯流排,所有記憶體都在一個位置,大約是略低於100ns(納秒)的延遲,這樣Nehalem的記憶體延遲就是約60ns。對於2個CPU插座的Nehalem來說,使用的是NUMA架構(Non Uniform Memory Access Achitecture,非均勻記憶體存取架構),遠方記憶體的延遲則要高一些,因為這時對記憶體的請求和回應需要透過QPI匯流排,其延遲大約是Harpertown的95%。所以,即使是最糟糕的情況,延遲還是得到了降低。一個有意思的問題是,當使用4個CPU插座的Nehalem時,延遲是否將會被擴大?因為這種系統很有可能會使用FB-DIMM,而這意味著將遭受延遲損失,不過遠方端記憶體的延遲還是將只會比本地端記憶體慢個約30ns。
對於其它使用IMC和核心的多CPU系統(例如EV7、K8、K10),記憶體延遲也是採用非均勻的(NUMA)。為了優化性能,作業系統就必須知道延遲差異,並調度那些在同一個CPU上分享數據的過程。Windows Vista是Microsoft的第一個為NUMA進行優化的作業系統,而Linux等則已經很早就可以支援NUMA了。
Nehalem的遠方/本地延遲比是約1.5倍。衡量K8的NUMA系數(也就是遠方延遲除以本地延遲)在2 CPU系統時也差不多是1.5。而在4 CPU系統時,INTEL將具有優勢,因為所有的記憶體要麼都是本地(當QPI匯流排上沒有Hop時),或者所有記憶體都是遠方(QPI匯流排上有一個Hop時)。因為使用對角線連接,每個CPU都具有QPI匯流排連接,那麼遠方記憶體最多就一跳(1個hop)。而當下的4插槽的K8或K10系統,有的記憶體在HT匯流排上多達有2個hop。總之,具有更大的NUMA系數,就更需要軟體考慮其所使用的記憶體的位置。作為參考,其中最早一個具備IMC和核心互連的EV7,在其64 CPU的系統中,NUMA系數為1.86-5.21(1-8個hop的情況)。
三、SMT
同步多線程(Simultaneous Multi-Threading,SMT)技術又重新回歸到了Nehalem架構,這最早出現下130nm的P4上。對於打開了SMT的CPU來說,將會遭受到更多的命中失敗,並需要使用更多的頻寬。所以Nehalem比P4是更適合使用SMT的。另外,在筆記型和桌上型的Nehalem有可能將不會支援SMT,它們也不需要3通道記憶體。
為什麼Core 2沒有使用SMT?很顯然,它是可以做到的。SMT是在節省電力的基礎上增加了性能,而且軟體支援的基礎建設也早就有了。有2個可能的原因︰一是Core 2可能沒有足夠的記憶體頻寬和CPU內部頻寬來利用SMT獲得優勢。通常,SMT能夠提升記憶體等級並行(memory level parallelism,MLP),但是對於記憶體頻寬已經成為瓶頸的系統則是個麻煩。而更有可能的原因則是SMT的設計、要提升效能是很麻煩的,而當初設計SMT是由INTEL的Hillsboro小組主持,而並非是Haifa小組(Core 2是由這個小組負責的)。這樣Core 2不使用SMT就避免了冒險。
Nehalem的同步多線程(Simultaneous Multi-Threading,SMT)是2-way的,每核心可以同時執行2個線程。對於執行引擎來說,在多線程任務的情況下,就可以掩蓋單個線程的延遲。SMT功能的好處是只需要消耗很小的核心面積代價,就可以在多任務的情況下提供顯著的性能提升,比起完全再添加一個物理核心來說要劃算得多。這個和以前P4的HT技術是一樣的,但比較起來,Nehalem的優勢是有更大的快取和更大的記憶體頻寬,這樣就更能夠有效的發揮。按照INTEL的說法,Nehalem的SMT可以在增加很少功耗的情況下,讓性能提升20-30%。
Nehalem同時也降低了起始同步,譬如LOCK prefix、XCHG和CMPXCHG等指令的延遲。起始同步在多線程編程中是必需的,而多線程的擴展性被同步所限制,透過降低延遲,可以提升現下多線程軟體的性能。INTEL宣稱,Nehalem的LOCK CMPXCHG指令(其作用是使整個管線串列化)的延遲是P4的約20%,Core 2的約60%。儘管降低了延遲,但行為仍然和以前的CPU還是一樣的,鎖定指令(Lock)並不是管線化的,即使後面的操作可以被提前到鎖定指令之前來執行。
四、前端部分︰(指令拾取和解碼)
1、指令拾取(包括分支預測)
在Nehalem的指令拾取單元(instruction fetch unit)中包含有相關指令指標(relative instruction point,RIP),每個線程狀態(thread context)各有一個。在指令拾取單元中還包含有分支預測器,用來預測下一條將被拾取的指令的RIP。對於分支預測器的很多細節,INTEL並沒有公佈,但它們是適合於工作在SMT模式的。並且Nehalem也將繼續使用上一代的那些特殊的分支預測器,比如循環檢測器(loop detector),間接預測器(indirect predictor)等。
當分支預測器選定一條分支時,分支目標緩衝(branch target buffer,BTB)就負責預測目標位址。Nehalem使用了新的Level 2 BTB架構。作為參考,K10使用了一個有2K項(entry)的BTB用於直接分支,和一個有512項的間接分支目標陣列(indirect branch target array)。Nehalem的Level 2 BTB設計,非常適用於有大量指令代碼的任務,例如資料庫、ERP和其它的商業應用,透過提升分支預測準確度而提升性能和運作效率。INTEL沒有發布詳細的內部架構。下面作出一些有依據的猜測。
有兩種可能。一是兩個BTB使用同樣的預測算法,而一個存取更小一點的歷史檔案,包含最近時間內所使用的分支RIP和目標RIP。在這種情況下,它們的關係就象L1快取和L2快取一樣(因為分支目標也具有相當好的位址相關性)。舉個例子,比如L1 BTB有256-512項,而更大的L2 BTB則有2K-8K項。如果分支RIP在L1 BTB中沒有找到,然後就到L2 BTB中去找,以作出目標預測。
另一種可能(RWT認為這種可能性比較小)則是兩級BTB使用不同的預測算法和不同的歷史檔案。比如L1 BTB使用簡單而快速的算法和相對較小的歷史檔案,而L2 BTB則使用更慢但更準確的算法,而且被配置成是具有優先權的預測器。如果L2 BTB不同意L1 BTB的預測,則它可以撤銷(override)L1 BTB的預測,去除掉管線中錯誤拾取的指令,而從新預測的RIP處重新拾取指令。這種架構可能性不大,因為它的運作效率比較低下。對於這種預測器架構,通常的情況是L1和L2 BTB都獨立的得出正確的分支目標──這就意味著在大多數的時間裡,L2 BTB都是在浪費能源。而L1 BTB錯誤,L2 BTB是正確的情況,只占非常小的比例。
不過在更早一點的ANANDTECH的文章中有提到認為是第二種模式︰通常會遇到這樣的情況,L1 BTB作出預測是基於分支的類型,但實際上它並沒有歷史數據,這樣準確度就很低。而L2 BTB有更多的歷史數據,就可以提升準確度,而且L2 BTB可以在執行過程中就糾正(L1 BTB所給出的)錯誤預測,而避免性能損失(這就正是override的情況)。
現下不清楚哪一種觀點更正確一些。
Nehalem另一個提升分支目標預測的機制是對返回堆棧緩衝(return stack buffer,RSB)進行了重命名。當發生程式調用時,RSB就記錄下位址,這樣當結束調用返回時,就從該位址繼續執行下去。但是當有很多程式遞歸調用時,RSB將會溢出,並且如果分支預測錯誤,那麼也將會產生錯誤的返回位址。Nehalem透過重命名RSB,就避免了溢出。並且錯誤的分支預測也不會毀壞RSB,只要調用與返回位址是正確配對的,那麼就可以從Nehalem的RSB中得到正確的數據。對於每一個線程都有一個專用的RSB,避免任何交叉弄丟數據。
拾取單元取得了每一個線程預測的下一個位址(通常情況下也就是正確的下一個位址),就到ITLB(指令旁路轉換緩沖)和L1 I(一級指令快取)去標注。ILTB由每個線程靜態分發(平分),有128項快取4KB的小頁表,是4路聯合模式的快取;另外,每個線程還有7項用於快取大頁表檔案(2MB/4MB),是全聯合模式。L1 I是32KB,4路聯合模式,由線程競爭共享。進入指令快取後,每週期16Byte(128bit)的指令發送到預解碼和拾取緩衝(pre-decode and fetch buffer)。然後,每週期6條指令從預解碼和拾取緩衝發送到有18個項目數的指令隊列(instruction queue)。在Core 2中,指令隊列被用做循環緩衝(Loop Stream Detector,LSD,循環流檢測器),這樣碰上小循環(指令數≦18)的時候,指令拾取單元就可以被關閉。而Nehalem的指令隊列則只是作為指令被解碼前的緩沖,因為它的循環緩存在管線中,被放到了解碼階段的後面。
2、解碼
當X86指令進入指令隊列後,它們就等著被解碼成微操作指令(uop),這是一種類似於RISC的指令。Core 2和Nehalem都有4個解碼器,一個複雜解碼器和3個簡單解碼器。簡單解碼器能夠處理可以解碼成一個uop的X86指令,現下絕大多數SSE指令都是這種。複雜解碼器能夠處理解碼成1-4個uop的X86指令,而比這還要複雜的指令,則由微代碼序列器(microcode sequencer)來處理。
Nehalem改進了Macro-op fusion。Core 2可以在32bit模式下,把TEST/CMP(比較指令)和其後的Jcc(條件分支指令)給解碼融合成一個微操作(uop)︰CMP+Jcc。這樣就增加了解碼頻寬,並減少了微操作數量。而Nehalem的Macro-op fusion則包括了更多的條件分支指令︰JL/JNGE, JGE/JNL, JLE/JNG, JG/JNLE。TEST/CMP和這些條件分支指令都將被解碼成一個微操作︰CMP+ Jcc。而且,Nehalem的Macro-op fusion可以是32bit和64bit模式。這是很重要的,因為現下大多數伺服器都使用的是64bit作業系統,即使是桌上型電腦也開始更多的人使用64bit作業系統了。
一旦X86指令解碼成微操作,就進入有28個項目數的微操作緩衝(uop buffer),Nehalem將其作為前面介紹到的LSD(Loop Stream Detector,循環流檢測器)。如果一個循環不大於28個微操作,則Nehalem就可以將其快取在LSD裡,並發送到亂序執行引擎去執行,而關閉指令拾取單元和解碼器。這樣透過關閉解碼器和使用更大的循環,就能夠比Core 2的LSD節省更多的功耗。Nehalem的28項的微操作緩衝,能夠儲存相當於21-23條X86指令(根據在一些遊戲中的測試情況得出的估計)。X86指令轉換為微操作的比率取決於工作量的不同,不過總的來說,Nehalem具有比Core 2更大一些的LSD緩衝。
比較有趣的是,Nehalem的LSD緩衝看起來更像是指令追蹤快取(Trace cache)。指令追蹤快取的目標是以動態程式的順序來儲存微操作,而不是像指令快取裡那樣以靜態編譯順序存儲X86指令,因此可以從關鍵路徑(critical path,指需要時間最長的路徑)中去掉解碼器和分支預測器,而使得被堵塞的地方可以立刻取得指令。P4的指令追蹤快取的問題在於它太脆弱了,當其命中失敗時,就必須一個接一個地(重新)解碼指令。通常指令快取的命中率是在90%以上,而指令追蹤快取卻遠低於這個標準,很少時候超過80%,大多數時候是在50-60%。也就是說,在40-50%的時間裡,P4都表現得象是一個單發射微處理器,而不能夠完全利用上它的執行資源。而Nehalem的LSD快取取得了和指令追蹤快取幾乎同樣的目標,而且當它無法工作的時候(即當循環太大時),也沒有什麼要命的性能損失。
在LSD快取之後,解碼步驟的最後一步是Dedicated Stack Engine,除去所有被Dedicated Stack更改過的微操作。Dedicated Stack更改過的微操作都是被一個專用加法器給執行過,並寫到前端的一個推測暫存器(speculative delta register)。推測暫存器偶爾會和重命名架構的暫存器(renamed architectural register)同步,而重命名架構暫存器中則儲存有堆棧中的非推測值(non-speculative value)。當堆棧處理過的微操作都被清除之後,剩下的微操作就進入亂序執行引擎去被重命名、發送、分發和執行。
五、亂序引擎和執行部分︰(Out-of-Order Engine and Execution Units)
Nehalem的亂序引擎顯著的擴大了,除了性能因素,還有就是為了提供SMT,因為SMT需要資源共享。
和Core 2一樣,Nehalem的暫存器重命名表(register alias table,RAT)指明每一個架構暫存器(architectural register)要麼進入重排序緩衝(Re-Order Buffer,ROB),要麼是進入撤銷暫存器檔案(Retirement Register File,RRF,或翻譯為引退暫存器檔案),並且保持有絕大多數最近的推測值狀態(speculative state)。而RRF則保持有絕大多數最近的非推測狀態(non-speculative state)。RAT可以每週期重命名4個微操作,給每一個微操作在ROB中一個目的地暫存器(destination register)。被重命名的指令就讀取它們的源操作數並被發送到通用架構的保留站(unified Reservation Station,RS,可以被各種指令類型使用)。
Nehalem的ROB(重排序緩沖)從96項增加到128項,RS(保留站)從32項增加到36項,它們都由兩個線程所共享,但是使用不同的策略。ROB是靜態分發給2個線程,使得2個線程在指令流裡都可以預測得一樣遠。而RS則是競爭共享,基於各線程的需求。這是因為許多時候一個線程可能會中止,從記憶體等待操作數,而使用到很少的RS項。這樣就不如讓另一個更活躍的線程儘可能多地使用RS項。在RS中的指令當其所有操作數都準備好時,就被分發到執行單元去。
Nehalem的執行單元與Core 2相比,基本沒有大的改變,而且並不受SMT的影響,除了使用率更高之外。
六、快取架構
幾乎Nehalem的所有方面都是略為改進並增強,但儲存子系統(memory subsystem,或翻譯為記憶體子系統)卻是非常激烈的大修改。
Nehalem可以同時運行的讀取和存取量增加了50%,讀取快取由32項增加到了48項,而儲存緩衝由20項增加到了32項(增量還略多於50%)。增加的原因自然是為了讓兩個線程共享,這裡採用的是靜態分發,可能是由於關鍵路徑的限制。
從讀取快取和儲存快取,儲存操作就繼續訪問到快取架構。Nehalem的快取架構是完全革新。像P4一樣,所有的快取和數據TLB(Translation Lookaside Buffer,旁路轉換緩衝,或叫頁表緩衝)都是由2個線程動態共享(根據已經觀察到的行為)。Nehalem的L1 D(一級數據快取)保留了和Core 2一樣的大小和聯合度(associativity),但是延遲卻從3個週期增加到了4個週期,以適應時間限制(timing constraint)。另外前面已經說到,每一個核心可以支援更多的未解決的命中失敗(outstanding miss),最多到16個,可以利用更多的儲存頻寬。
而Nehalem剩下的快取架構則和Core 2截然不同。Core 2的最後一級快取是L2,由2個核心共享,這樣可以減少一致性錯誤(coherency traffic),數量達到了24路聯合的6MB(Penryn),延遲是14-15個週期(Conroe是14,Penryn是15)。而Nehalem有L3快取,相對L2較小,是每個核心私有的,而L3則非常大,由所有核心共享。
Nehalem的每個核心有一個私有的通用型L2,是8路聯合的256KB,運作速度相當快。其使用延遲時間還沒有完全披露,不過INTEL的工程師表明是小於12個週期的。Nehalem的L2相對於其L1D來說,既不是包含式(inclusive)也不是獨佔式(exclusive),就像Core 2一樣,Nehalem可以在兩個核心的私有快取(L1D和L2)之間傳遞數據,儘管不能夠達到全速。
Nehalem的16路聯合、8MB的L3對於前兩級來說,是完全包含式的,並且由4個核心共享。儘管INTEL並沒有完全說明Nehalem的物理設計,但似乎L3快取是單獨使用電力,並營運在單獨的頻率上。這是從節省電力和可靠性這兩個方面推斷出來的,因為大的快取更容易在低電壓下產生軟錯誤(soft error)。這樣,L3使用延遲就取決於相對頻率、核心的相差(phase alignment)、L3自身,還有運行L3的仲裁器的延遲。在最好的情況下,即操作相差和頻率差距是整數倍的情況下,Nehalem的L3使用延遲是在30-40週期(根據INTEL工程師的說法)。
使用包含式快取的好處是可以處理幾乎所有的一致性流量問題(coherency traffic),而不需要打攪到每個獨立核心的私有快取。如果在L3中發生命中失敗(cache miss),那麼要訪問的數據就肯定也不在任何一個L2和L1中,不需要偵聽其它核心(而獨佔式快取,則還要回頭去檢查其它核心)。
另一方面,Nehalem的L3對於快取命中成功(cache hit),也扮演著偵聽過濾器(snoop filter)的角色。獨佔式快取命中成功時,不需要檢查其它核心,而包含式快取則需要檢查其它核心。但是在Nehalem的L3中的每一個快取行(cache line)裡,有4 bit是用來做核心確認(core valid)的,表明是哪一個核心在它的私有快取裡具有這個行的數據備份。如果一個核心確認位被設定成0,則那個核心就不具有該行的數據備份。Nehalem使用的是MESIF快取一致性協議(MESIF cache coherency protocol),如果兩個以上核心的確認位都有效(設定成1),那麼該快取行就被確定是乾淨的(即未被修改的,任何一個核心的快取行都不能夠進入更改模式)。當L3快取命中,而4個核心確認位都是0時,就不需要對其它核心做偵聽;而只有1個位是有效時,則只需要偵聽那一個核心。這兩種技術的聯合使用,使得L3可以儘可能的讓每個核心避免數據一致性錯誤,這樣就給出更多的實際頻寬。
事實上,並非只有包含式快取這一種解決之道。對於非包含式快取來說,透過和最後一級快取一起複製所有私有快取的標誌檔案(tag file),並同時檢查所有的最後一級快取的訪問標誌和私有快取的訪問標誌,也可以達到同樣的性能好處,並避免數據一致性錯誤。而包含式快取則是設計得必須複製數據,這就能夠表明各級別之間大小的一定關係。Nehalem的每個核心有64KB L1D和256KB L2(有可能L1D的數據包含在L2中,也可能L1D的數據並沒有包含在L2中。因為L2並非包含式),這就意味著在8MB的L3中,有1-1.25MB的數據是前兩級緩存中也有的數據。這就是包含式快取額外的開銷。
Nehalem的快取架構設計得也更容易支援非對齊(unaligned),有更快的非對齊快取存取。INTEL前幾代晶片一直是用兩種類型指令來做16Byte(128bit)的SSE讀取和儲存,一種是其數據必須正好和儲存行(16B)對齊,比如MOVAPS/D、MOVDQA指令──(數據)必須剛好是16Byte,和快取行對齊。另一種則可以是未對齊的,比如MOVUPS/D、MOVDQU指令,數據對齊與否是沒有要求的。
在Nehalem之前,處理對齊的指令更有優勢,而處理非對齊的指令則更慢、具有更低的數據吞吐量(即使其數據是在對齊的情況下),需要多個微操作。編譯器也總是避免後一種指令,盡量避免非對齊的讀取,象MOVSD+MOVHPD這樣的2條連續指令就會更快一些。
而Nehalem則對非對齊指令進行了優化︰在存取對齊數據的時候,非對齊指令和對齊指令具有一樣的延遲和吞吐量。同時也提升了非對齊指令對於非對齊數據的訪問速度。這樣,不管是什麼類型的SSE操作,都具有相同的延遲。另外Nehalem對在存取數據時跨越了64-Byte快取行邊界的情況也進行了優化,比起Core 2具有更低的延遲和更高的吞吐量。這樣,編譯器就不會再懼怕使用非對齊的指令了。
七、TLB,虛擬化性能
除了改變快取架構,Nehalem還改變了TLB等級架構。TLB是用來快取虛擬位址和物理位址映射關係的。Core 2有著非常有趣的TLB安排,L1 DTLB(INTEL有時也叫做Micro-TLB)非常的小,並且只用來讀取。它有16項小頁表(4KB page)和16項大頁表(2M/4M pages),每一個都是4路聯合。L2 DTLB更大一些,可以讀取和儲存(當在L1 DTLB中讀取失敗時,就到L2 DTLB中來讀取,並且L2 DTLB負責所有的存儲),它有256項小頁表和32項大頁表,也都是4路聯合。
Nehalem則建立起了真正意義上的兩級TLB體系,可以動態分發給SMT的活躍線程狀態(thread context)。Nehalem的L1 DTLB可以做所有的存儲訪問(可以讀取和存儲),它有64項小頁表和32項大頁表,也都是4路聯合。而新的L2 TLB是通用型的(可以用於指令和數據),它只有512項小頁表,也是4路聯合。
Nehalem和Core 2的TLB的一個明顯的差異是它們覆蓋快取的深度不同。Core 2(Penryn)有6MB L2,透過使用小頁表(絕大多數的應用都不使用大頁表),TLB可以轉換2176KB的記憶體(位址),這樣就覆蓋了1/3的L2。而Nehalem的一個核心有576項小頁表,整個CPU總共則是2304項,這樣TLB就可以轉換9216KB的記憶體,這已經超過8MB L3的容量了。
Nehalem的TLB項還透過使用虛擬處理器ID(Virtual Processor ID,VPID)而有所變化。每一個TLB項都快取一個記憶體頁的虛擬位址到物理位址的轉換。而這個轉換是特定於一個給定的進程或虛擬機(virtual machine,VM)。當處理器在虛擬客戶端和主機之間切換時,INTEL過去的CPU都要往TLB裡填寫,以確保進程只能夠訪問到它們被允許訪問的記憶體。而VPID則跟蹤是哪一個VM的TLB項,這樣在該VM退出後又重新進入時,TLB就不用填寫也能夠確保安全。如果一個進程試圖訪問不是它自己的位址轉換,則就會直接在TLB中命中失敗,而不會是到頁表中去做非法訪問。VPID透過降低虛擬機位址轉換的開銷(overhead)而有助於提升虛擬化性能。INTEL估計,Nehalem的一個來回的VM位址轉換的延遲約是Conroe的40%,約比Penryn低1/3(即約是Penryn的66%)。
Nehalem另一個虛擬化方面的改變是擴展頁表(Extended Page Tables,EPT),用來消除許多VM位址轉換,即減少轉換次數(而VPID的作用是降低VM位址轉換的延遲)。通常的頁表是用來匹配客戶機的虛擬位址和客戶機的物理位址,然而在一個虛擬化系統中,也有從客戶機的物理位址到主機的物理位址的轉換。INTEL早期的CPU(和AMD在Barcelona之前的CPU)將需要系統管理程式(hypervisor)來處理頁面錯誤,而Nehalem則透過EPT,來消除了許多不必要的虛擬機退出。
八、
Nehalem的模組化設計,以適應不同的市場需求。
模組化有︰
1、核心數量
2、SMT功能
3、L3快取容量
4、QPI連接數量
5、IMC
6、記憶體類型
7、記憶體通道數量
8、整合顯示卡
未來預定會發布的幾種Nehalem有︰
Gainestown,用於Xeon DP
Bloomfield,定位於高階桌面市場
這兩種將於08年4季度上市。RWT認為可能Bloomfield將沒有SMT。
2009年發布︰
Havendale,桌上型雙核心
Auburndale,筆記型雙核心
Clarksfield,筆記型四核心
Beckton,用於Xeon MP
Lynnfield,桌上型主流四核心
Nehalem的電路技術,可能得等到秋季IDF才會公佈。AMD的4核,其電路設計就發生了非常大的改變,從原來的1個變成具有5個時鐘分佈網路(clock distribution network),有3個不同的電壓層(voltage plane),並在不同時鐘域(clock domain)之間使用動態FIFO。估計INTEL也將採用類似的手段來控制功耗和提升性能。現下比較有意思的問題是INTEL將採用何種動態時鐘技術(dynamic clocking technique)來提升單個線程的性能。現下的Penryn已經可以動態提升一個核心的頻率和電壓,當另一個核心是空閒的時候。而這項技術顯然對Nehalem是更有用的。 |