前情提要:淺談x86的SIMD指令擴張史(上)。MMX到SSE有了對應IEEE 754單精確度浮點格式的SSE還是不夠,最起碼,當時的x86處理器還缺了3個重要的關鍵點:
- 64位元雙倍浮點精確度。
- 受制於x86指令的編碼,暫存器才少少的8個。
- x86的雙運算元(A = A + B)格式,會摧毀其中1個暫存器原本的資料(如例子中的A),要保存資料,需事先搬移到其他的暫存器,增加程式碼體積,更讓第二個問題雪上加霜。
SSE2提供IEEE754 64位元雙倍精確度
2001年隨著Pentium 4而問世的144個SSE2指令解決了第一個問題,包含了一系列的快取記憶體控制指令,並順便擴充了MMX,雖然這時候的SSE2已足以完全取代MMX了。
指令數量之所以會激增,也是為了提供更多樣化的「花式」資料操作。但也請注意,這些指令集也不是每個指令都會進行SIMD運算。
如果應用程式已經使用80x87的80位元延伸精確度格式,轉到SSE2仍會產生數值誤差,所以不可能完全廢棄這古老的包袱,即使微軟的Visual Studio從2012年開始,浮點運算就預設使用SSE2,意思就是微軟已經認定那時候的電腦都有SSE2可用了。。
AMD x86-64倍增資料暫存器
某種意義上來說Intel也是因禍得福,當然他們絕對不會這樣想。
AMD透過刪除INC/DEC指令,擠出空間實作REX prefix,提供在64位元模式新增暫存器的指令編碼空間,讓x86指令編碼中所有可標定暫存器的3位元欄位,都擴展到了4位元,只要指令多出了REX Prefix這1個Byte,64位元x86處理器即可享受到倍增的資料暫存器。不過,程式不一定用到新暫存器,代表REX並非「必備品」,當啟動新暫存器時,REX會無預警增加指令長度,提高最佳化指令解碼器設計的困難度。
慘劇就發生在Intel Core 2家族(Merom, Penryn)身上,只要是64位元模式,前後相鄰的「比較(Compare)/跳躍(Jump)」合而為單一條件運算的「巨集指令融合(Macro Fusion)機制」就自動人間蒸發。
AMD發表x86-64時很多人拍手叫好,但實際上因過度重視對32位元的相容性與最低的硬體修改成本(K8是由K7延伸出來的產物),AMD的擴充手段並不乾淨俐落,日後也同時造成所有(實質上也就那兩家)x86處理器廠商的困擾。
在AMD手上「結束」的SSE
在革命性的AVX出現前,Intel仍持之以恆的擴充SSE指令集,像數值轉換、載入長度不同的向量值、如何讓資料「對齊」等細節就姑且在此不談了,重點如下:
- SSE3:又稱PNI(Prescott New Instructions),追加13個指令,「總算」支援了在AMD 3DNow!已存在的「水平」運算,能對同一個XMM暫存器內的資料進行「橫向」處理,不再只能「向下操作」。
- SSSE3:TNI(Tejas New Instructions)或MNI(Merom New Instructions) ,SSE3的「補充包」,因為16個新指令都可操作XMM和MMX暫存器,因此在某些文件也被視為「32個指令」。
- SSE4.1:Intel在Penryn加入的47個新指令。
- SSE4.2:Intel在Nehalem加入的7個新指令。
- SSE4a:AMD在原生四核心的K10「Barcelona」選擇性支援4個SSE4指令和4個初代SSE指令,後來的推土機家族就很乾脆的全部吃下所有的「SSE4」了。
在這裡就不得不提AMD搶先在Intel之前註冊商標的「SSE5」,AMD用全新的Opcode3與DREX欄位徹底取代REX,實現了x86指令集前所未有的「三運算元格式/四運算元語法」與「乘積累加(Multiply Accumulation,A = A x B + C)」指令,彌補自己年輕時所犯下「成功的錯誤」,但還好AMD沒有硬推SSE5,「皈依」更加簡潔有條理的Intel AVX,要不然微軟為首的軟體廠商們又要抓狂了,科科。
1 則回應