Friday, September 07, 2007

AMD 發表 SSE5 對產業的影響

X86 的指令集的製定, 當然x86指令的創始公司Intel所主導, 大家都只有跟隨的份, 不過有時候也會特例, AMD 的3SNow! 就是搶在intel 發表sse 之前發表, 讓MMX 指令可以支援符點運算, 並且首創Cache的控制指令, 而在AMD 64的指令與暫存器架構上的成功, 也讓Intel不得不屈於跟隨者的角度

我們先來回顧一下這些所謂的多媒體指令集的出現與其歷史地位

1997年 Pentium 首先加入MMX 指令, 這是在從386以後, Intel最大幅度的增加指令集的動作, 最特別的是, 這也是Intel首次加入一指令多筆資料運算(SIMD)的指令, 以灰階圖片都以一個byte來代表一個pixel為例, 64bit的MMX暫存器, 可以一次同時做8個pixel的運算, 例如同時加或同時減, 當時PC開始走多媒體路線時, 讓撥放VCD不再需要插入硬解卡, 對於PC進入家庭應用功不可沒

1998 3DNow! AMD 的k6-2 不甘示弱,不但完全支援Intel的MMX指令, 還更增加了浮點運算的單一指令多筆資料運算指令, 讓一些像圖學演算法, 或是3D運算需要使用浮點運算來處理更精確的計算, 得以大幅度提升效能, 而更特別的是它加入了Cache的控制指令, 可以以指令來控制快取的讀取時機, 讓CPU的執行更有效率

1999 SSE 總算珊珊來遲在Pentum III 時加入 3dNow! 的浮點運算SIMD指令, 不過其創新點在於, 它將浮點運算的暫存器獨立, 3d Now!與MMX 都是使用過去用於浮點運算(FPU)的8個80bit 的暫存器, 但SSE加入了另外8個128bit 的 XMM暫存器, 讓SSE 的浮點運算指令不但可以運算同時運算更多的資料, 也可以更精確

2001 Peituum 4 推出時加入了SSE2 指令, 首度讓實數(Interger)運算指令也可以使用128 bit的XMM 暫存器, 這著實讓人興奮, 因為大部份的像是MPEG 2/4 將運算最佳化只使用實數運算, 而這部份的加速, 在MMX/3DNow!後就沒有較特別的變化, 所以128bit 的實數相當於同時可以運算16個pixel的資料

不過令人失望的是, 128bit的資料, 似乎是內部分成64bit 兩次運算, 所以速度跟本快不起來, 而且因為讀取128bit 的資料因為一個cache line為16byte, 所以當讀取非對齊(align)16byte的資料時, 會有跨Cache line 的問題, 必需分成align的指令與非align的指令, 而當使用非align的指令需要兩個讀取週期, 所以速度有時反而比一次運算64bit資料的MMX指令還慢, 不過另一個令人失望的是AMD似乎放棄追趕SSE2 了

2003 AMD64的推出, 正式開啟x86 從32bit到64bit的升級, 雖然幾乎可以確定intel早就做這方面的設計了, 但似乎因為intel正全力推Itanium, 所以策略性的放棄, 這讓AMD看到的有洞可以鑽, 舉著延申正統x86的旗幟正式推出64bit的x86指令架構, 而對於SIMD的貢獻在於其將XMM暫存器增加一倍, 變為16個, 不過只限於在64 bit的模式下才可以使用

2004 Prescott 終於推出, 不過了無新意, 加入了SSE3, 除了因應intel Hyper-Threading 推的相關指令外, 也針對大家的抱怨加入了可以自動判斷是否有 algin 16 的資料搬移指令, 不過效果真的....沒感覺, 不過SSE3的創意在於, 他首度加入了水平運算指令

之前的指令都是 A0,A1,A2,A3 B0, B1,B2,B3 兩者相加之後為

A0+B0,A1+B1,A2+B2,A3+B3, 但在SSE3加入可以造成

A0 + A1, A2 + A3, B0 + B1, B2 + B3 的指令, 不過只能用於符點運算

2006年 Core 2 正式以core 架構取代P4 的NetBurst 架構, 並加入了 SSSE3(總算講到現代來了)指令集, 沒有取名為SSE4 大概是因為其指令並沒有特別的新義, 不過以我來看, 這才是Intel從1999年推出SSE指令後, 真正有聽進開發者聲音的改進, 首先他加強了實數運算的指令, 不但加入了新功能的指令, 也支援原本只有浮點運算的水平運算指令, 加強了align 16 的搬移指令運算效能, 也總算讓128bit的實數運算在一個執行週期完成

2007 春季IDF 在北京(幹..這時再也忍不住了, 一定要幹譙一下, 這是第一次IDF只有在大陸沒有在台灣 )首度發表SSE4的指令, 預計在2008/Q1 所發表的45nm 的CPU推出, 以書面的看, 真的是蠻棒, 可能是改成45nm 後, die的空間變多要找功能來塞吧, 連CRC都做進CPU了,也首度加入字串比較的指令,更加入更多實數運算指令, 真的很期待, 也希望不要重蹈SSE2的路, 中看不中用

前幾天發表的 SSE5 看來是繼AMD 的AMD64後最有創意的作品了..

更多的運算元, 最多到4的運算元, 也有3個運算元

例如

FMADDPS dest, src1, src2, src3; dest = src1 * src2 + src3

太神了, 不污染source data的運算指令

而且還使用了三個資料來源, 與兩種運算

更多的比較指令, 這可幫助程式減少執行分岐, 所造成piple line drop與cache miss的機率, 總之SSE5 的指令讓人驚奇

很有趣的是SSE5 已經發表好幾天了, 還沒見到intel發表官方說法, 這雖然不意外, 但也代表未來多媒體指令的方向還有很多不確定因素!!

這次SSSE5 與當年的3DNow! 的局勢不太一樣, 3DNow! 是直接推出, 讓intel措手不及, 不得已在已經要推出的 SSE 裡盡量相容3DNow!, 而SSE4 到2008 Q1 or Q2 就要推出了, SSE5則是要放在Bulldozer預計要2009年才會出現, 所以反而是AMD要不要考慮在新的CPU裡support SSE4, 而不是Intel 來考量這問題, 再者Intel本來就沒有義務加入對手制定的指令集, Intel覺的他是老大, 3DNow!與AMD64 都算是被迫出擊, 沒道理現在腳步站這麼穩了還要隨對手起舞

所以Intel 這次是有時間思考怎麼對付AMD這個突然的怪局, 而AMD打的算盤就有點詭異了,是想證明他有能力主導市場, 還是向 Intel提出建議, 我們來這樣做好不好的意味嗎? 這我實在有點搞糊塗,而且以SSE5 的使用來看, 比起SSE4 的務實做法, 是有比較花俏, 一個指令加入更多的運算元, 只會讓這個指令的運用範圍變窄, 以目前的Mpeg4 的encoder/decoder的code 來看, 運用的範圍不會太廣, 所以是不是有機會成為下一代的指令還有的拼, 加上Intel不見得需要理AMD, 不過在AMD64之後, Intel 對於AMD 的出招更顯謹慎, 如果要先說大話, 等市場變化後再來支援, 不如一開始就先大方的說合作 .

另一個需要評估的事, 這對一般使用者的影響, 基本上使用者是根本不會有感覺, 一般的軟體公司也不會處理這問題, 因為使用到這些特殊指令的程式不多, 大部份都集中在像是影音壓縮, 或是3D 動畫這類的軟體, 而對於商務軟體來說, 可能對於網路速度的要求還比軟體執行的速度更高, 而且就算是Intel 不甩AMD, AMD到最後也走自己的路, 跑出兩套指令集, 也只是苦了所謂的最佳化工程師, 會在底層跑兩套程式碼, 其實不止兩套, 只要Intel出一個新的指令集, 相關的程式都需要增加, 但上層的程式發開是不會有感覺的, 更不用講使用者了..!!

所以看來這個仗還有的打, 讓我們再慢慢看下去!

No comments: