MMX技術簡介
Intel 公司的MMX™(多媒體增強指令集)技術可以大大提高應用程序對二維三維圖形和圖象的處理能力。Intel MMX技術可用於對大量數據和復雜數組進行的復雜處理,使用MMX技術可處理的數據基本單位可以是字節(byte)、字(word),或者是雙字(double-word)。
Visual Studio .NET 2003提供了對MMX指令集特性的支持,從而可以不必編寫匯編代碼,直接使用C++代碼就可以實現MMX指令的功能。通過參考Intel軟件說明書(Intel Software manuals)[1]以及閱讀MSDN中有關MMX編程技術的主題會使你更好地把握MMX編程的要點。
MMX技術實現了單道指令多道數據流(SIMD,single-instruction, multiple-data)的執行模式。考慮下面一個需要編程完成的任務,在一個字節(BYTE)數組中使其中每一個元素加上一個數,在傳統的程序中,實現這個功能的算法如下:
for each b in array //對數組中的每一個元素b
b = b + n //加上一個數n
下面看看它的實現細節:
for each b in array //對數組中的每一個元素b
{
把b加載到寄存器中
把此寄存器中的數加上n
把所得寄存器中的結果放回內存
}
具有MMX指令集支持的處理器有八個64位的寄存器,每一個寄存器可以存放8個字節(byte)、4個字(word)或2個雙字(double-word)。MMX技術同時提供了一個MMX指令集,其中的指令可以可以把一個數值(其類型可以是字節、字或雙字)加載到這些MMX寄存器中,在寄存器中進行算術或邏輯運算,然後把寄存器中的結果放回內存存儲單元。上面的例子采用MMX技術後的算法是這樣的:
for each 8 members in array //把數組中的8個字節(其中一個字節為數組中的一個單位)作為一組取出
{
把這8個字節加載到MMX寄存器中
通過一個CPU指令執行周期把這個寄存器中的8個字節都加上n
把寄存器中計算的結果寫回內存
}
C++編程人員不必直接使用MMX指令集中的指令訪問這些MMX寄存器。你可以使用64位的數據類型__m64和一系列C++函數來進行相關的算術和邏輯運算。而決定程序使用哪個MMX寄存器以及代碼優化是C++編譯器的任務。
Visual C++ MMXSwarm [4]是MSDN中提供的一個很好的使用MMX技術進行圖象處理的例子,它包含了一些封裝好了的類簡化了使用MMX技術的操作,並向你展示了對各種不同格式圖象進行處理的操作(如單色24位象素RGB、32位象素RGB等)。本文只是對使用Visual C++實現MMX程序設計的簡單介紹。如果你感興趣的話,可以參看MSDN上MMXSwarm的例子。