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技術基本完善。