基於MMX指令集的程式設計簡介

2021-04-08 20:28:39 字數 3102 閱讀 6507

基於mmx指令集的程式設計簡介

出處:http://www.codeproject.com/cpp/mmxintro.asp

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

具有mmx指令集支援的處理器有八個64位的暫存器,每乙個暫存器可以存放8個位元組(byte)、4個字(word)或2個雙字(double-word)。mmx技術同時提供了乙個mmx指令集,其中的指令可以可以把乙個數值(其型別可以是位元組、字或雙字)載入到這些mmx暫存器中,在暫存器中進行算術或邏輯運算,然後把暫存器中的結果放回記憶體儲存單元。上面的例子採用mmx技術後的演算法是這樣的:

for each 8 members in array //把陣列中的8個位元組(其中乙個位元組為陣列中的乙個單位)作為一組取出

c 程式設計人員不必直接使用mmx指令集中的指令訪問這些mmx暫存器。你可以使用64位的資料型別__m64和一系列c 函式來進行相關的算術和邏輯運算。而決定程式使用哪個mmx暫存器以及**優化是c 編譯器的任務。

visual c mmxswarm [4]是msdn中提供的乙個很好的使用mmx技術進行圖象處理的例子,它包含了一些封裝好了的類簡化了使用mmx技術的操作,並向你展示了對各種不同格式圖象進行處理的操作(如單色24位象素rgb、32位象素rgb等)。本文只是對使用visual c 實現mmx程式設計的簡單介紹。如果你感興趣的話,可以參看msdn上mmxswarm的例子。

mmx程式設計詳細介紹

包含的標頭檔案

所有的mmx指令集函式在emmintrin.h檔案中定義:

#include

因為程式中用到的mmx處理器指令是由編譯器決定,所以它並沒有相關的.lib庫檔案。

__m64 資料型別

這種型別的變數可用作mmx指令的運算元,它不能被直接訪問。_m64型別的變數被自動分配為8個位元組的字長。

cpu對mmx指令集的支援

如果你的cpu能夠具有了mmx指令集,你就可以使用visual studio .net 2003提供的對mmx指令集支援的c 函式庫了,你可以檢視msdn中的乙個visual c cpuid[3]的例子,它可以幫你檢測你的cpu是否支援sse、mmx指令集或其它的cpu功能。

飽和演算法(saturation arithmetic)和封裝模式(wraparound mode)

mmx技術支援一種叫做saturating arithmetic(飽和演算法)的計算模式。在飽和模式下,當計算結果發生溢位(上溢或下溢)時,cpu會自動去掉溢位的部分,使計算結果取該資料型別表示數值的上限值(如果上溢)或下限值(如果下溢)。飽和模式的計算用於對圖象的處理。

下面的例子能夠讓你理解飽和模式和封裝模式的區別。如果乙個位元組(byte)型別變數的值為255,然後將其值加一。在封裝模式下,相加結果為0(去掉進製);在飽和模式下,結果為255。飽和模式用類似的方法來處理下溢位,比如對於乙個位元組資料型別的數在飽和模式下,1減2的結果為0(而不是-1)。每乙個mmx算術指令都有這兩種模式:飽和模式和封裝模式。本文所要討論的專案只使用飽和模式下的mmx指令。

程式設計例項

mmx8 演示專案

mmx8是乙個單文件介面(sdi)的應用程式,用來對每象素8位的單色位圖進行簡單處理。源圖象和處理後的圖象會在窗體中顯示出來。新建的atl(活動模版庫)類 cimage用來從資源中提取圖象並在窗體中顯示出來。程式要對圖象進行兩種處理操作:圖象顏色反相和改變圖象的亮度。每一種處理操作可以用下面幾種方法之中其中的一種來實現:

純c **;

使用c 的mmx功能函式的**;

使用mmx彙編指令的**。

對圖象進行處理計算的時間會顯示在狀態列中。

用純c 實現的圖象顏色反相函式:

void cimg8operations::invertimagecplusplus(

byte* psource,

byte* pdest,

int nnumberofpixels)

}

為了查詢使用c mmx指令函式的方法,需要參考intel軟體說明書(intel software manuals)中有關mmx彙編指令的說明,首先我是在第一卷的第八章找到了mmx相關指令的大體介紹,然後在第二卷找到了有關這些mmx指令的詳細說明,這些說明有一部分涉及了與其特性相關的c 函式。然後我通過這些mmx指令對應的c 函式查詢了msdn中與其相關的說明。在mmx8示例程式中用到的mmx指令和相關的c 函式見下表:

required function

assembly instruction

mmx intrinsic

empty mmx state (prevents collisions with floating-point operations)

emms

_mm_empty

unsigned subtraction with saturation of each byte in two 64-bits operands

psubusb

_mm_subs_pu8

unsigned addition with saturation of each byte in two 64-bits operands

paddusb

_mm_adds_pu8

基於MMX指令集的程式設計簡介

mmx技術簡介 intel 公司的mmx 多 增強指令集 技術可以大大提高應用程式對二維三維圖形和圖象的處理能力。intel mmx技術可用於對大量資料和複雜陣列進行的複雜處理,使用mmx技術可處理的資料基本單位可以是位元組 byte 字 word 或者是雙字 double word visual ...

ZT 基於MMX指令集的程式設計簡介

基於mmx指令集的程式設計簡介 mmx技術簡介 intel 公司的mmx 多 增強指令集 技術可以大大提高應用程式對二維三維圖形和圖象的處理能力。intel mmx技術可用於對大量資料和複雜陣列進行的複雜處理,使用mmx技術可處理的資料基本單位可以是位元組 byte 字 word 或者是雙字 dou...

MMX指令集(詳解)

emms mmx狀態置空 將fp特徵字置空 全1 使後續浮點指令可以使用浮點暫存器,其他mmx指令自動置fp為全0.本指令應在所有mmx例程結束和呼叫可含有fp指令的例程時使用,以清除mmx狀態.movd mm,r m32 movd r m32,mm 轉移32位資料 將32位資料從整型暫存器 記憶體...