今天的主題是Yonah, 也就是Intel新的Mobile processor
被Intel取名叫做Core Duo, 顧名思義是雙核心的版本
而Core Solo很自然的就是單核心的版本了
從Centrino出現以來, 已經出過三個世代的平台了
第一代Centrino是由Banias CPU + 855GM/PM Chipset + Pro/Wireless 2100組成
第二代的Centrino代號是Sonoma, 是由Dothan CPU + 915GM/PM + Pro/Wiress 2100/2100BG
而最新的Centrino代號是Napa, 也就是今天要介紹的Yonah CPU + 945GM/PM + Pro/Wiress 2915ABG
Banias被認為是由Pentium-III的P6 Architecture的加強改進版
採用了0.13um製程, 加入了Micro-op confusion (原理在後面會詳述), 和improved branch prediction
還加入了類似P4的Quad-pumped FSB, 和SSE2 (Double-precision FP SIMD instruction set)
保留了Pentium-III低時脈高效能的優點
這都要歸功於Intel位於以色列的開發團隊 (本來是在開發PC-on-a-chip代號"Timna", 後來計畫中止改開發Banias)
而Banias的後繼者Dothan則是直接把L2 Cache從1MB加大到2MB
並採用90nm製程, 在同樣的功耗之下提升了性能
而進步到65nm的Yonah相對於它的前身Dothan到底有哪些進步呢?
可以簡單歸類於下面幾點:
1. Micro-ops fusion for SSE instructions of all types (SSE/SSE2/SSE3)
2. SSE instructions are now handled by all three decoders
3. SSE3 instruction set
4. Faster execution of some SSE2 instructions as well as integer divide
5. Enhanced data prefetch
6. Shared L2 Cache (Intel SmartCache Technology)
接下來我們就來一個一個介紹這些進步是怎麼達成的
1. Micro-ops fusion for SSE instructions of all types (SSE/SSE2/SSE3)
Micro-ops fusion是一個很重要的技術
想要知道Micro-ops是什麼, 就要知道現代CPU在內部是怎麼run那些x86的instruction
簡單來說, 因為x86是CISC指令集, 所以要用hardware去實現每一個instruction是很沒有效率的
有的instruction幾乎都用不到, 去implement那些instructions只是浪費area而已
所以現在的x86 CPU都借用了一點RISC的觀念
x86 instructions進來之後, 都先經過decoder
這些decoder把x86指令解成比較簡單的Micro-ops
遇到比較簡單的x86指令, 可以用1個Micro-op去解決
而遇到比較複雜的指令, 可能就得用多於1個的Micro-ops去解決
而後端的execution unit就是在執行這些解碼過的Micro-ops
所以Micro-ops fusion顧名思義
就是可以把一些簡單的Micro-ops"融合"成一個Micro-op
最可以用到這個技巧的, 就是在Load ops
為什麼要發Load op呢? 就是為了要去DRAM或Cache load所需的data
那為什麼要load data呢? 肯定是你要對這個data做一些ALU的運算, 可能是logical, 可能是arithmetic
比如說現在有一段x86 code是要把一個data load進register做加法的動作
在把x86拆成Micro-ops的時候, 要是我傻傻的把指令拆成一個Load op, 一個Add op
那這樣對於一個Simple decoder來說, 就需要兩個cycle才能做完
(Simple decoder的意思在接下來的部份會說明)
但要是有一個Micro-op代表的意思就是Load + Add, 那只需要一個cycle就可以做完decode的動作
這個Micro-op會在Out-Of-Order Buffer要issue Micro-ops的時候才真正被拆成兩個來執行
這麼一來, 雖然後面執行的速度沒辦法加速 (還是當成兩個Micro-ops來處理)
但是卻可以提升decoder的throughput
避免decode的速度成為效能的瓶頸
這個技巧在Banias(第一代Centrino的Pentium-M處理器)中就首次被引進
(其實AMD的K7/K8就已經使用了類似的技巧, 任何一個decode出來的Micro-ops都可以包含一個Load或Write memory的動作)
提高了decoder的效率
但是, 這技巧只被用在decoder x86指令而已, 所以對於SIMD的SSE或SSE2指令就沒有辦法享受到這個好處
所以可以想見的是, 當大量使用SIMD指令的時候, decode throughput會代替execution speed成為效能的瓶頸
所以在Yonah處理器中, SIMD的Micro-ops fusion技術也被加入了
2. SSE instructions are now handled by all three decoders
讓SIMD instruction也support Micro-ops fusion可以解決部份的SIMD decode throughput的問題
但是Yonah的改進還不僅僅於此
我們知道, Pentium-M其實就是改良型的Pentium-III, 它們採用的都是所謂的P6 Architecture
舊的P6 Architecture(從Pentium-Pro, Pentrium-III, Banias, Dothan)所使用的decoder是"4-1-1"的架構
也就是說它們都擁有三個decoder, 其中一個是所謂的Complex decoder, 另外兩個則是Simple decoder
Complex decoder顧名思意, 是用來對付複雜的x86指令, 它最高可以在一個cycle內對付一個需要拆成4個Micro-ops的x86指令
如果對付到的是比4Micro-ops還複雜的指令, 就要花超過一個cycle
而另外兩個Simple decoder在一個cycle內只能對付拆成一個Micro-op的x86指令
但是當遇到SIMD指令的時候, 一律都交給那惟一的一個Complex decoder來處理
所以就大大的減低了decoder的throughput
簡單來說, 遇到大量的SIMD指令的時候, decoder的throughput會降到理論最大值的1/3而已
Yonah的decoder被設計成三個decoder都可以去解SIMD的指令
再加上第一點所提到的SIMD Micro-ops fusion的技巧
Yonah的decoder可以看成是"4-2-2"的架構, 對x86或SIMD指令都適用
大大提高了SIMD的decode throughput
個人猜想, Super-Pi在新的版本中有加入SSE的Patch
Yonah能夠在Super-Pi中狂勝K8, 這兩點的改進一定是最大的功臣
(2.7GHz的Yonah跑Super-Pi 1M的成績是23s, 我自己的K8超到2.8GHz才32s)
3. SSE3 instruction set
SSE3是SIMD的擴展指令集
SSE3首先是被90nm的P4 (Prescott) 所採用的
所以SSE3也被稱為是PNI (Prescott New Instructions)
後來在Venice和San Diego的K8中也有加入
總共有13條指令
其中有Floating-point轉integer的FISTTP
Complex Arithmetic新增五個指令
Video encoding的LDDQU
AOS格式的SIMD四個指令
以及用來做HyperThreading同步用的MONITOR和MWAIT
而Yonah所新增的SSE3指令只有10條, 其中FISTTP沒有support
因為Yonah也不support P4的HyperThreading, 所以MONITOR和MWAIT也不support
4. Faster execution of some SSE2 instructions as well as integer divide
關於怎麼加速SSE2的某些指令
Intel沒有放出相關的document, 所以這邊就不多說
而關於IDIV (整數除法), 在上一篇中所附的Powerpoint圖檔有提到
對於最常使用到的被除數為17~24bit, 除數為1~16bit的情況之下
本來Dothan需要12個cycle, 而Yonah只要4個cycle就可以完成
5. Enhanced data prefetch
這部份也缺乏書面的資料, 所以就不多說了
6. Shared L2 Cache (Intel SmartCache Technology)
再來, 就要來說說Yonah最特別的地方, 就是那Shared L2 Cache
兩個Core是共用2MB大小的L2 Cache
這個Shared L2 Cache被Intel稱為是SmartCache
從我上一篇文章中附的圖可以看見Yonah的SmartCache和Non shared cache的比較
我覺得這張圖真是好笑, 等於是掌了自己一嘴
因為那張圖中, Non shared cache就是在講自己的Smithfield (90nm)和Presler (65nm)
Smithfield只是單純的把兩個Core的die一起割下來封裝
所以其中一個Core要去access另一個core的L2 cache時, 得透過FSB有限的頻寬才可以
而Presler更絕, 不但是兩個Core, 而且還是兩塊獨立的die
所以Pentium-D才會被AMD窮追猛打, 說它是"假雙核"
比較起來, AMD的Athlon64 X2就是好的多的設計
在K8設計的時候就有考慮到將來會是Dual core的天下
所以在兩個core中間設計有Crossbar, 讓其中一個Core可以不用透過FSB
直接經由Crossbar去存取另一個Core的L2 Cache
但是這樣仍然有一個缺點, 那就是每個Core所用到的L2 Cache大小是固定的
當兩個Core loading不太balance的時候, 可能一個Core會需要用到較大的L2 Cache
但是當它自己的L2 Cache用滿了, 就沒辦法去取用另一個loading比較輕的Core的L2 Cache了
因而會使L2 Cache miss rate增加
我上一篇文章中也有這樣的示意圖
看來Shared cache的確是比較好的設計
理論上它可以比較flexible去讓兩個Core去取用不同大小的L2 cache
但是這樣的缺點也是顯而易見
為了降低設計的複雜度以及省電的考量, 這樣的Shared L2 Cache必定是使用一套Control logic而不是兩套
所以兩個Core在access L2 Cache時都得對同一個Control logic發出請求
可以肯定的是L2 Cache的latency一定較Single core的Dothan來的長
根據實測的結果, Dothan的L2 Cache latency是10 cycles (也就是L2 Cache hit到真正拿到data要等10個cycle)
而Dual core的Yonah則是14個cycle
看來Intel在Shared L2 cache做的不錯, 才增加了4個cycle
反觀AMD就得加加油, K7的L2 cache latency是20個cycle, K8則是16個cycle
相信AMD若在此處做改善, 一定可以再提升效能
結論
今天一下子打了這麼多, 還挺累的
各為看倌若是覺得寫的還不錯, 就麻煩回應一下吧!
當然, 如果有寫錯的地方, 還請各位不吝指正
Yonah在同時脈下已經有不輸K8的表現了
個人更期待今年底會發布的Merom/Conroe了
一樣也是"P6+ Architecture", 改進的Out-Of-Order, 加強的SIMD execution throughput
再加上Intel一向比AMD大兩倍的L2 Cache (Dual-core Conroe會有4MB Shared L2 Cache版本)
相信一定有更不俗的表現!