日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用MMX/SSE汇编指令集优化视频开发

發(fā)布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用MMX/SSE汇编指令集优化视频开发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、匯編指令集


目前大部分的PC機采用的都是Intel或者AMD的CPU,其支持的多媒體匯編指令有:

  • MMX:多媒體擴展指令(MultiMedia eXtention),該指令由Intel在1996年為Pentium處理器開發(fā),包括了57條多媒體指令,可以i一次處理多個數(shù)據(jù)。但是MMX指令不能與X86浮點運算指令同時執(zhí)行,在某些場合使用受到一定限制。
  • SSE:SIMD擴展指令集(Streaming SIMD Extension),也稱作單指令多數(shù)據(jù)流擴展。其中的SIMD的含義為Single Instruction Multiple Data(單指令多數(shù)據(jù))。該指令集有Intel為Pentium III研發(fā),是為了提高處理浮點運算性能而開發(fā)的指令集,有70條指令,包括50條SIMD浮點運算指令用于提升3D圖形運算效率、12條MMX整數(shù)運算增強指令和8條優(yōu)化內存中連續(xù)數(shù)據(jù)塊傳輸指令。這些指令有利于優(yōu)化圖像處理、浮點運算、3D運算和多媒體處理等運算的性能。
  • 3DNow!:3DNow!指令集由AMD開發(fā),有21條擴展指令。3DNow!指令集主要針對三維建模、坐標變換和效果渲染等3D數(shù)據(jù)處理。
  • SSE2:SSE2指令集是比SSE更加先進的指令集,共包含144條指令,由兩個部分組成:SSE主要負責處理浮點數(shù),MMX主要負責處理整數(shù)計算。SSE2的寄存器容量是MMX的兩倍,寄存器存儲的數(shù)據(jù)也是MMX的兩倍。SSE2可以向下兼容MMX,經(jīng)由MMX進行優(yōu)化的程序可以繼續(xù)由SSE2進行進一步的優(yōu)化。
  • SSE3:SSE3是在SSE2的基礎上開發(fā)的,相比SSE2增加了13個SIMD指令,主要目的在于改進線進程同步和媒體、游戲等特殊應用程序領域。其中定義了超線程性能增強作為其中的一部分,可以提升處理器的超線程處理能力,使得處理器更快地進行并行數(shù)據(jù)處理。
  • SSE4:SSE4是Intel自SSE2以來最大的改進,包括了從多媒體應用到高性能計算領域的應用,以及使用一些專用電路進行特定應用的加速。SSE4增加了47條指令,改進了整數(shù)型和浮點型計算、支持DWORD和QWORD操作、新的單精度FP操作、快速寄存器操作和面向寄存器的內存操作等。

  • 2、MMX/SSE2指令集剖析


    2.1、媒體擴展指令MMX

    Intel的MMX指令是Intel IA系列指令的擴展,使用了單指令多數(shù)據(jù)技術(SIMD),以并行方式處理多個數(shù)據(jù)元素。MMX擴展指令集新增了57條指令和一種64位的4字數(shù)據(jù),作為成組的數(shù)據(jù)可供MMX指令操作。一個64位數(shù)據(jù)類型可以包含8個字節(jié)、4個字、兩個雙字或者一個4重字類型,這樣一條MMX指令即可以同時處理2/4/8個數(shù)據(jù)單元。為了適應這樣的數(shù)據(jù),MMX增加了8個64位寄存器(MM0~MM7),僅有MMX指令可以按寄存器名稱直接訪問。

    MMX針對8~32位數(shù)據(jù)元素的處理性能進行了改善,一個MMX指令可以處理8個字節(jié),一個時鐘周期內完成兩條指令,即一個時鐘周期可以處理16個字節(jié)。此外,MMX技術為其他功能釋放了額外的處理器周期,更小的處理器占用率可以實現(xiàn)更高程度的并發(fā)。

    一、MMX指令集簡介:

    MMX指令集從功能上可以分為8類:數(shù)據(jù)傳送指令、算術運算指令、比較運算指令、類型轉換指令、擴展壓縮數(shù)據(jù)指令、邏輯運算指令、移位運算指令、狀態(tài)清除指令。指令列表如下:


    在以上指令中,除了EMMS指令外,都涉及兩個操作數(shù),即源操作數(shù)和目標操作數(shù),指令中源操作數(shù)在右,目標操作數(shù)在左。目標操作數(shù)可作為第二個源操作數(shù)進行操作,指令結束后被運算結果所覆蓋

    1)、數(shù)據(jù)轉移指令:

    數(shù)據(jù)轉移指令實現(xiàn)MMX寄存器同內存單元之間,以及MMX寄存器同通用寄存器之間的雙向數(shù)據(jù)傳遞功能。

    MOVD:轉移32位(4字節(jié))數(shù)據(jù);MOVQ:轉移64位(8字節(jié))數(shù)據(jù)。


    2)、算數(shù)運算指令:

    算數(shù)運算指令對打包的數(shù)據(jù)類型實現(xiàn)加法、減法、乘法和乘加操作。

    在介紹算術運算指令前,先簡要介紹一下所謂的“環(huán)繞模式”和“飽和模式”。所謂環(huán)繞模式,就是當一個數(shù)據(jù)單元的數(shù)據(jù)達到最大值(比如一個字節(jié)的值為255)時,如果繼續(xù)對其加1,那么該字節(jié)的數(shù)據(jù)將變?yōu)?,進位將被忽略。飽和模式則對數(shù)據(jù)的溢出進行了限制,根據(jù)有符號或者無符號類型,將運算后的結果限制在數(shù)據(jù)類型規(guī)定的范圍以內。

    • PADDB/PADDW/PADDD和PSUBB/PSUBW/PSUBD指令分別在環(huán)繞模式下對源和目標操作數(shù)進行有符號或無符號的相加和相減操作。每一組的三個指令分別對應字節(jié)型、字形和雙字型數(shù)據(jù)。
    • PADDSB/PADDSW和PSUBSB/PSUBSW指令分別在有符號飽和模式下進行相加和相減操作。兩個指令分別處理字節(jié)型和字型數(shù)據(jù)。
    • PADDUSB/PADDUSW和PSUBUSB/PSUBUSW指令分別在無符號飽和模式下進行相加和相減操作。兩個指令分別處理字節(jié)型和字型數(shù)據(jù)。
    • PMULHW和PMULLW指令執(zhí)行源和目標操作數(shù)的乘法操作,并分別將乘積的高字和低字保存到目標操作數(shù)中。
    • PMADDWD指令計算源和目標操作數(shù)有符號部分的乘積,并將產(chǎn)生的4個32位雙字的中間結果成對相加,獲得兩個32位雙字。

    PMADDWD的計算結果如圖示顯示:



    3).比較指令:

    PCMPEQB/PCMPEQW/PCMPEQD和PCMPGTB/PCMPGTW/PCMPGTD指令按照有符號類型數(shù)據(jù)比較源和目標操作數(shù)進行相等比較或大于比較。對于相等比較,如果一對數(shù)據(jù)元素相等,則目標操作數(shù)中的相應數(shù)據(jù)元素設置為全 1;否則設置為全 0。對于大于比較,如果目標操作數(shù)中的數(shù)據(jù)元素大于源操作數(shù)中相應的數(shù)據(jù)元素,則目標操作數(shù)中的相應數(shù)據(jù)元素設置為全 1;否則設置為全 0。


    4).類型轉換指令:

    PACKSSWB指令將有符號字轉換成為有符號的字節(jié);PACKSSDW將有符號的雙字轉換成為有符號的字;轉換過程都按照有符號飽和模式進行。

    PACKUSWB指令將有符號的字轉換為無符號的字節(jié),轉換過程按照無符號飽和模式進行。

    5).擴展壓縮數(shù)據(jù)指令:

    PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ指令和PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ分別將源于目標操作數(shù)的高位數(shù)據(jù)和低位數(shù)據(jù)取出并交錯排入目標操作數(shù)中。PUNPCKHBW和PUNPCKLBW的示意圖如下:

    PUNPCKHBW操作示意圖

    PUNPCKLBW操作示意圖


    6).邏輯運算指令:

    PAND——邏輯按位與;PANDN——邏輯按位與非;POR——邏輯按位或;PXOR——邏輯按位或非;


    7).位移指令:

    位移指令有邏輯左移、邏輯右移和算數(shù)右移三種。

    PSLLW/PSLLD/PSLLQ和PSRLW/PSRLD/PSRLQ實現(xiàn)邏輯左移和右移操作,并用0填充空出來的高位或低位。支持字型、雙字型和四字型數(shù)據(jù);PSRAW/PSRAD實現(xiàn)算數(shù)右移操作,并將符號位拷貝到右移所空出的比特位上。


    8).狀態(tài)清除指令:

    EMMS指令用于將MMX狀態(tài)清空。該指令在一個MMX程序結束時執(zhí)行。


    二、CPU寄存器

    除了8個MMX寄存器之外,CPU還有自己的通用寄存器EAX/EBX/ECX/EDX。這四個通用寄存器都是32位寄存器,可以直接訪問,還可以按照16位和8位進行訪問。如EAX可以使用AX獲得低16位,AX可以使用AH和AL分別獲取高8位和低8位。其余的寄存器有ESI/EDI/ESP/EBP等。功能描述見下圖:



    三、地址加載指令

    1).LEA指令

    LEA指令將源操作數(shù)的偏移地址傳遞給通用寄存器。如以下代碼:

    LEA BX, [2400H]該指令將[2400H]的偏移地址2400傳送給BX,執(zhí)行后BX=2400H。

    2).LDS指令

    LDS指令將4字節(jié)源內存的數(shù)據(jù)按照段地址和偏移地址傳送給鏈各個寄存器,其中低地址的2字節(jié)作為偏移地址送給作為目標操作數(shù)的寄存器,高地址的2字節(jié)作為段地址送到DS寄存器。如以下代碼:

    LDS DI, [2130H]該指令將低地址2130H、2131H的數(shù)據(jù)作為偏移地址送到DI中,2132H、2133H的數(shù)據(jù)作為段地址送到DS中。


    2.2、MMX程序設計

    使用MMX編程的方法主要有三種:

    • 直接編寫匯編程序文件,命名為*.asm;
    • 使用C++嵌入?yún)R編,在C++代碼中使用__asm{....}編寫匯編程序;
    • 使用64位數(shù)據(jù)類型__m64和與MMX相關的C++函數(shù)實現(xiàn)。


    2.3、SSE/SSE2媒體擴展指令集

    SSE和SSE2是基于MMX的新的匯編指令集,將寄存器的大小從64位擴展到128位,且增加了新的媒體處理匯編指令。

    一、SSE/SSE2數(shù)據(jù)結構

    SSE技術支持打包的單精度浮點數(shù)操作(Packed Single-Precision Floating-point),將4個獨立的32位單精度浮點數(shù)打包為一個128位數(shù)據(jù)。SSE提供了8個128位SIMD寄存器XMM0~XMM7,可以直接存取,但只能存放數(shù)據(jù)而不能用于尋址。此外SSE還提供了新的控制/狀態(tài)寄存器MXCSR。

    SSE2指令包括原油的32位通用寄存器(EAX~EDX)、64位MMX寄存器(MM0~MM7)、128位XMM(XMM0~XMM7)和32位標識寄存器EFLAGS及浮點狀態(tài)/控制寄存器MCSR。此外還有兩種數(shù)據(jù)類型:128位的打包雙精度浮點數(shù)和4種128位SIMD整數(shù)。

    • 128位打包雙精度浮點數(shù):兩個64位雙精度浮點數(shù)打包成一個雙4字節(jié)數(shù)據(jù);
    • 128位打包整數(shù):可以包含16個字節(jié)、8個字、4個雙字或2個四重字的整數(shù);

    二、SSE/SSE/2指令

    SSE指令集包含70條指令,主要可以分為三組:

  • 50條SIMD浮點運算指令:50條SIMD浮點運算指令是其主要部分,包括幾個部分:數(shù)據(jù)傳送指令、算數(shù)運算指令、比較指令、類型轉換指令、組合指令、狀態(tài)管理指令。
  • 12條SIMD整數(shù)指令:為了增強MMX指令系統(tǒng)而新增。
  • 8條高速緩沖存儲器優(yōu)化指令:8條指令,為更好滴控制緩存操作,提供啊程序運行性能,專門針對Pentium III設計。
  • SSE2指令集主要包括針對128位和64位的打包雙精度浮點計算指令,記憶64位和128位的SIMD整數(shù)指令、MMX/SSE的128位擴展指令、高速緩存控制盒指令排序指令。

  • SSE2浮點計算指令:SSE2浮點運算指令分為多組,主要有SSE2的傳送指令、算術運算指令、邏輯運算指令、比較指令、組合指令和轉換指令等。
  • SSE2擴展指令:除雙精度浮點指令外,在原油的MMX和SSE基礎上補充了SIMD擴展整數(shù)指令、高速緩存控制和指令排序指令。
  • 總結

    以上是生活随笔為你收集整理的使用MMX/SSE汇编指令集优化视频开发的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。