程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 基於MMX指令集的程序設計簡介

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

編輯:Delphi

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的例子。

  MMX程序設計詳細介紹

  包含的頭文件

  所有的MMX指令集函數在emmintrin.h文件中定義:
  #include <emmintrin.h>
  因為程序中用到的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指令。

  編程實例

  以下講解了MMX技術在Visual Studio .NET 2003下的應用實例,你可以在http://www.codeproject.com/cpp/mmxintro/MMX_src.zip下載示例程序壓縮包。該壓縮包中含有兩個項目,這兩個項目是基於微軟基本類庫(MFC)建立的Visual C++.Net項目,你也可以按照下面的講解建立這兩個項目。

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

  純C++代碼;
  使用C++的MMX功能函數的代碼;
  使用MMX匯編指令的代碼。

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

  用純C++實現的圖象顏色反相函數:

  void CImg8

[1] [2] [3] [4] [5] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved