首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Pentium III SSE 指令集深度解析(二):三種編程模式與指令集全覽

     編輯:關於C++

1. 使用 SSE 的三種編程機制

傳統匯編語言最快但開發難;Intel SSE SDK 提供兩種高級機制:Intrinsics 庫(C 函數封裝指令)與 C++ 類(封裝新數據類型操作),開發難度降低但性能略有下降。三者在執行速度與開發難度間權衡:

三種模式權衡

圖六:不同開發環境下執行速度與開發難度的權衡

1.1 匯編語言示例:包裹乘法

_asm {
    push esi; push edi;
    ; a 在 xmm1, b 在 xmm2
    mov xmm0, xmm1; mulps xmm0, xmm2;
    ; 結果在 xmm0
    pop edi; pop esi;
}
包裹乘法示意

圖七:包裹乘法計算示意

1.2 Intrinsics 庫

包含 xmmintrin.h。定義 __m128 類型存 4 個 float。指令對應 C 函數,如 addps → _mm_add_ps。
乘法示例:

__m128 a,b,c;
a = _mm_set_ps(4,3,2,1); // 參數順序:高位到低位
b = _mm_set_ps(4,3,2,1);
c = _mm_mul_ps(a,b);

1.3 C++ 類:F32vec4

包含 fvec.h。構造函數相當於 _mm_set_ps,運算符重載極簡潔:

F32vec4 a(4,3,2,1), b(4,3,2,1), c(0,0,0,0);
c = a * b;

1.4 編譯器支援

僅 Intel C/C++ 編譯器與 Microsoft Macro Assembler 6.11d+ 支援 SSE。Intel 編譯器已集成 Visual Studio,可配置項目或文件級使用。

2. SSE 指令集完整列表(70 條)

算術指令

addps/addss, subps/subss, mulps/mulss, divps/divss, sqrtps/sqrtss, maxps/maxss, minps/minss

邏輯指令

andps, andnps, orps, xorps

比較指令

cmpps/cmpss, comiss, ucomiss

清洗/洗牌指令

shufps, unpckhps, unpcklps

轉換指令

cvtpi2ps/cvtpi2ss, cvtps2pi/cvtss2si

數據移動指令

movaps, movups, movhps, movlps, movmskps, movss

狀態管理指令

ldmxcsr, stmxcsr, fxsave, fxrstor

緩存控制指令

maskmovq, movntq, movntps, prefetch, sfence

附加 SIMD 整數指令

pextrw, pinsrw, pmaxub/pmaxsw, pminub/pminsw, pmovmskb, pmulhuw, pshufw

3. 典型應用示例

3.1 包裹乘法

前節已展示三種實現。

3.2 比較操作:同時比較 4 對浮點數

無 SSE 只能循環逐對比。SSE 用 cmpps(2 操作數 + 比較類型立即數),結果存第一操作數:真為 0xFFFFFFFF,假為 0。可用 movmskps 將 4 個結果映射到通用寄存器各 1 位。
示例:cmpps xmm0, xmm1, 1; movmskps eax, xmm0; test eax, 5; je match13 (比較類型 1 為小於)。

比較運算示意

圖八:比較運算示意

3.3 分支移除:條件賦值無分支實現

C 代碼 a = (a < b) ? c : d; 涉及分支預測失敗風險。SSE 無分支實現:

; xmm0=a, xmm1=b, xmm3=c, xmm4=d
cmpps xmm0, xmm1, 1      ; 比較 a

利用邏輯指令實現無分支選擇,顯著提升性能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved