MMX
MMX是由英特爾開發的一種SIMD多媒體指令集,共有57條指令。它於1996年整合在英特爾奔騰(Pentium)MMX處理器上,以提高其多媒體數據的處理能力。
其優點是增加了處理器關於多媒體方面的處理能力,缺點是佔用浮點數暫存器進行運算(64位元MMX暫存器實際上就是浮點數暫存器的別名)以至於MMX指令和浮點數操作不能同時工作。為了減少在MMX和浮點數模式切換之間所消耗的時間,程式設計師們儘可能減少模式切換的次數,也就是說,這兩種操作在應用上是互斥的。AMD在此基礎上發展出3D Now!指令集。
3D Now!發佈一年後,Intel在MMX基礎上發展出SSE(Streaming SIMD Extensions)指令集,用來取代MMX。現在,新開發的程式不再僅使用MMX來最佳化軟件執行效能,而是改使用如SSE、3DNOW!等更容易最佳化效能的新一代多媒體指令集,不過目前的處理器大多仍可以執行針對MMX最佳化的較早期軟件。
MMX的字面涵義
1997年,Intel公司起訴AMD公司與Cyrix公司非法使用(misuse)了商標MMX。隨後這起訴訟庭外和解,AMD公司承認MMX為Intel的商標,Intel允許AMD公司使用MMX作為一項技術的名稱。在這起訴訟中,AMD披露MMX是Intel命名的矩陣數學擴充(Matrix Math eXtensions)的字母縮寫。
技術細節
MMX暫存器,稱作MM0到MM7,實際上就是處理器內部80位元字長的浮點暫存器棧st(0)到st (7)的尾數部分(64位元長)的復用。由於浮點棧暫存器的高16位元未被MMX技術使用,因此這16位元都置為1,因此從棧暫存器的角度看,其浮點值為NaN或Infinities,這可用於區分暫存器是處於浮點棧狀態還是MMX狀態。作為MMX暫存器都是直接訪問。利用了裝配資料類型(packed data type)的概念,每個MMX暫存器的64位元字長可以看作是2個32位元整數、或者4個16位元整數、或者8個8位元整數,從而可以執行整數SIMD運算。這對於1990年代中期的2D、3D計算的加速還是很有意義的,因為當時的電腦的圖形處理器(GPU)還很不發達。但現在MMX整數SIMD運算對於圖形運算來說是多餘的技術了。不過MMX的飽和算術運算(saturation arithmetic operations)對於一些數碼訊號處理應用還是有用的。
SIMD技術的發展
繼MMX技術之後,Intel又於1999年在Pentium-III處理器上推出SSE技術,引入了新的128位元寬的暫存器集(register file),稱作XMM0到XMM7。這些XMM暫存器用於4個單精度浮點數運算的SIMD執行,並可以與MMX整數運算或x87浮點運算混合執行。2001年在Pentium 4上引入了SSE2技術,進一步擴充了指令集,使得XMM暫存器上可以執行8/16/32位元寬的整數SIMD運算或雙精度浮點數的SIMD運算。這使得SIMD技術基本完善。