AVX指令使用


一、邏輯運算

相加

__m256d _mm256_add_pd (__m256d a, __m256d b)

__m256 _mm256_add_ps (__m256 a, __m256 b)

相減

__m256d _mm256_sub_pd (__m256d a, __m256d b)

__m256 _mm256_sub_ps (__m256 a, __m256 b)

乘法

__m256d _mm256_mul_pd (__m256d a, __m256d b)

__m256 _mm256_mul_ps (__m256 a, __m256 b)

除法

__m256d _mm256_div_pd (__m256d a, __m256d b)

__m256 _mm256_div_ps (__m256 a, __m256 b)


按位AND

__m256d _mm256_and_pd (__m256d a, __m256d b)

__m256 _mm256_and_ps (__m256 a, __m256 b)

按位OR

__m256d _mm256_or_pd (__m256d a, __m256d b)

__m256 _mm256_or_ps (__m256 a, __m256 b)

按位XOR

__m256d _mm256_xor_pd (__m256d a, __m256d b)

__m256 _mm256_xor_ps (__m256 a, __m256 b)

按位取aNOT再與b進行AND

__m256d _mm256_andnot_pd (__m256d a, __m256d b)

__m256 _mm256_andnot_ps (__m256 a, __m256 b)

 

取最大值最小值

__m256d _mm256_max_pd (__m256d a, __m256d b)

__m256 _mm256_max_ps (__m256 a, __m256 b)

__m256d _mm256_min_pd (__m256d a, __m256d b)

__m256 _mm256_min_ps (__m256 a, __m256 b)

 

交替加減

__m256d _mm256_addsub_pd (__m256d a, __m256d b)

FOR j := 0 to 3

  i := j*64

  IF (j % 1 == 0)

    dst[i+63:i] := a[i+63:i] - b[i+63:i]

  ELSE

    dst[i+63:i] := a[i+63:i] + b[i+63:i]

  FI

ENDFOR

dst[MAX:256] := 0

__m256 _mm256_addsub_ps (__m256 a, __m256 b)

 

計算a中打包的單精度(32位)浮點元素的近似倒數,並將結果存儲在dst中。 該近似的最大相對誤差小於1.5 * 2 ^ -12

__m256 _mm256_rcp_ps (__m256 a)

計算a中打包的單精度(32位)浮點元素的近似倒數平方根,並將結果存儲在dst中。 該近似的最大相對誤差小於1.5 * 2 ^ -12

__m256 _mm256_rsqrt_ps (__m256 a)

計算a中打包的雙精度(64位)浮點元素的平方根,並將結果存儲在dst中。

__m256d _mm256_sqrt_pd (__m256d a)

__m256 _mm256_sqrt_ps (__m256 a)

 

水平相加相減:

ab中水平相加相鄰的雙精度(64位)浮點元素對,並將結果打包為dst

__m256d _mm256_hadd_pd (__m256d a, __m256d b)

dst[63:0] := a[127:64] + a[63:0]

dst[127:64] := b[127:64] + b[63:0]

dst[191:128] := a[255:192] + a[191:128]

dst[255:192] := b[255:192] + b[191:128]

dst[MAX:256] := 0

__m256 _mm256_hadd_ps (__m256 a, __m256 b)

dst[31:0] := a[63:32] + a[31:0]

dst[63:32] := a[127:96] + a[95:64]

dst[95:64] := b[63:32] + b[31:0]

dst[127:96] := b[127:96] + b[95:64]

dst[159:128] := a[191:160] + a[159:128]

dst[191:160] := a[255:224] + a[223:192]

dst[223:192] := b[191:160] + b[159:128]

dst[255:224] := b[255:224] + b[223:192]

dst[MAX:256] := 0

 

ab中水平減去相鄰的雙精度(64位)浮點元素對,並將結果打包為dst

__m256d _mm256_hsub_pd (__m256d a, __m256d b)

__m256 _mm256_hsub_ps (__m256 a, __m256 b)

 

二、舍入運算

舍入運算round

__m256d _mm256_ceil_pd (__m256d a)

__m256 _mm256_ceil_ps (__m256 a)

下取整

__m256d _mm256_floor_pd (__m256d a)

__m256 _mm256_floor_ps (__m256 a)

使用舍入參數舍入打包的雙精度(64位)浮點元素,並將結果存儲為dst中的打包雙精度浮點元素。

__m256d _mm256_round_pd (__m256d a, int rounding)

__m256 _mm256_round_ps (__m256 a, int rounding)

 

三、比較運算

__m128d _mm_cmp_pd (__m128d a, __m128d b, const int imm8)

__m256d _mm256_cmp_pd (__m256d a, __m256d b, const int imm8)

__m128 _mm_cmp_ps (__m128 a, __m128 b, const int imm8)

__m256 _mm256_cmp_ps (__m256 a, __m256 b, const int imm8)

__m128d _mm_cmp_sd (__m128d a, __m128d b, const int imm8)

__m128 _mm_cmp_ss (__m128 a, __m128 b, const int imm8)

 

四、組合

根據掩碼混合兩個 __m256d__m256

__m256d _mm256_blend_pd (__m256d a, __m256d b, const int imm8)

FOR j := 0 to 3

  i := j*64

  IF imm8[j]

    dst[i+63:i] := b[i+63:i]

  ELSE

    dst[i+63:i] := a[i+63:i]

  FI

ENDFOR

dst[MAX:256] := 0

__m256 _mm256_blend_ps (__m256 a, __m256 b, const int imm8)

__m256d _mm256_blendv_pd (__m256d a, __m256d b, __m256d mask)

FOR j := 0 to 3

  i := j*64

  IF mask[i+63]

    dst[i+63:i] := b[i+63:i]

  ELSE

    dst[i+63:i] := a[i+63:i]

  FI

ENDFOR

dst[MAX:256] := 0

__m256 _mm256_blendv_ps (__m256 a, __m256 b, __m256 mask)

 

使用imm8控制拖拽128-bit通道內雙精度(64位)浮點元素,並將結果存儲在dst中。

__m256d _mm256_shuffle_pd (__m256d a, __m256d b, const int imm8)

dst[63:0] := (imm8[0] == 0) ? a[63:0] : a[127:64]

dst[127:64] := (imm8[1] == 0) ? b[63:0] : b[127:64]

dst[191:128] := (imm8[2] == 0) ? a[191:128] : a[255:192]

dst[255:192] := (imm8[3] == 0) ? b[191:128] : b[255:192]

dst[MAX:256] := 0

__m256 _mm256_shuffle_ps (__m256 a, __m256 b, const int imm8)

 

五、置換

置換permute :使用imm8中的控件來混合雙精度(64位)浮點元素,並將結果存儲在dst中。

__m128d _mm_permute_pd (__m128d a, int imm8)

IF (imm8[0] == 0) dst[63:0] := a[63:0];

FI IF (imm8[0] == 1) dst[63:0] := a[127:64];

FI IF (imm8[1] == 0) dst[127:64] := a[63:0];

FI IF (imm8[1] == 1) dst[127:64] := a[127:64];

FI dst[MAX:128] := 0

__m256d _mm256_permute_pd (__m256d a, int imm8)

IF (imm8[0] == 0) dst[63:0] := a[63:0];

FI IF (imm8[0] == 1) dst[63:0] := a[127:64]; F

I IF (imm8[1] == 0) dst[127:64] := a[63:0];

FI IF (imm8[1] == 1) dst[127:64] := a[127:64];

FI IF (imm8[2] == 0) dst[191:128] := a[191:128];

FI IF (imm8[2] == 1) dst[191:128] := a[255:192];

FI IF (imm8[3] == 0) dst[255:192] := a[191:128];

FI IF (imm8[3] == 1) dst[255:192] := a[255:192];

FI dst[MAX:256] := 0

__m128 _mm_permute_ps (__m128 a, int imm8)

__m256 _mm256_permute_ps (__m256 a, int imm8)

__m256d _mm256_permute2f128_pd (__m256d a, __m256d b, int imm8)

__m256 _mm256_permute2f128_ps (__m256 a, __m256 b, int imm8)

__m256i _mm256_permute2f128_si256 (__m256i a, __m256i b, int imm8)

__m128d _mm_permutevar_pd (__m128d a, __m128i b)

__m256d _mm256_permutevar_pd (__m256d a, __m256i b)

__m128 _mm_permutevar_ps (__m128 a, __m128i b)

__m256 _mm256_permutevar_ps (__m256 a, __m256i b)

 

六、廣播

廣播到低128

__m256d _mm256_broadcast_pd (__m128d const * mem_addr)

__m256 _mm256_broadcast_ps (__m128 const * mem_addr)

廣播到低64

__m256d _mm256_broadcast_sd (double const * mem_addr)

廣播到低32

__m128 _mm_broadcast_ss (float const * mem_addr)

__m256 _mm256_broadcast_ss (float const * mem_addr)

 

七、castconvert

 1  cast。此內在函數僅用於編譯,不生成任何指令,因此它具有零延遲

__m256 _mm256_castpd_ps (__m256d a)   __m256d類型的向量cast__m256類型。

__m256i _mm256_castpd_si256 (__m256d a)

__m256d _mm256_castpd128_pd256 (__m128d a) 128位未定義

__m128d _mm256_castpd256_pd128 (__m256d a)

__m256d _mm256_castps_pd (__m256 a)

__m256i _mm256_castps_si256 (__m256 a)

__m256 _mm256_castps128_ps256 (__m128 a)

__m128 _mm256_castps256_ps128 (__m256 a)

__m256i _mm256_castsi128_si256 (__m128i a)

__m256d _mm256_castsi256_pd (__m256i a)

__m256 _mm256_castsi256_ps (__m256i a)

__m128i _mm256_castsi256_si128 (__m256i a)

 

__m128d類型的向量轉換為類型__m256d; 結果的高128位歸零。 此內在函數僅用於編譯,不生成任何指令,因此它具有零延遲。

__m256d _mm256_zextpd128_pd256 (__m128d a)

__m128類型的向量轉換為類型__m256; 結果的高128位歸零。 此內在函數僅用於編譯,不生成任何指令,因此它具有零延遲。

__m256 _mm256_zextps128_ps256 (__m128 a)

__m128i類型的向量轉換為類型__m256i; 結果的高128位歸零。 此內在函數僅用於編譯,不生成任何指令,因此它具有零延遲。

__m256i _mm256_zextsi128_si256 (__m128i a)

 

2  convert

__m256d _mm256_cvtepi32_pd (__m128i a)

__m256 _mm256_cvtepi32_ps (__m256i a)

__m128i _mm256_cvtpd_epi32 (__m256d a)

__m128 _mm256_cvtpd_ps (__m256d a)

__m256i _mm256_cvtps_epi32 (__m256 a)

__m256d _mm256_cvtps_pd (__m128 a)

float _mm256_cvtss_f32 (__m256 a)

__m128i _mm256_cvttpd_epi32 (__m256d a)

__m256i _mm256_cvttps_epi32 (__m256 a)

 

八、提取

提取extract :從a中選擇帶有索引的32位整數,並將結果存儲在dst中。

__int32 _mm256_extract_epi32 (__m256i a, const int index)

__int64 _mm256_extract_epi64 (__m256i a, const int index)

__m128d _mm256_extractf128_pd (__m256d a, const int imm8)

__m128 _mm256_extractf128_ps (__m256 a, const int imm8)

__m128i _mm256_extractf128_si256 (__m256i a, const int imm8)

 

九、裝載數據

將未對齊內存中的256位整數數據加載到dst中。 當數據穿過高速緩存行邊界時,此內在函數可能比_mm256_loadu_si256表現更好。

__m256i _mm256_lddqu_si256 (__m256i const * mem_addr)

從內存加載256位(由4個打包的雙精度(64位)浮點元素組成)到dstmem_addr必須在32字節邊界上對齊,否則可能會生成一般保護異常。

__m256d _mm256_load_pd (double const * mem_addr)

從內存加載256位(由8個打包的單精度(32位)浮點元素組成)到dstmem_addr必須在32字節邊界上對齊,否則可能會生成一般保護異常。

__m256 _mm256_load_ps (float const * mem_addr)

從內存加載256位整數數據到dstmem_addr必須在32字節邊界上對齊,否則可能會生成一般保護異常。

__m256i _mm256_load_si256 (__m256i const * mem_addr)

從內存加載256位(由4個打包的雙精度(64位)浮點元素組成)到dstmem_addr不需要在任何特定邊界上對齊。

__m256d _mm256_loadu_pd (double const * mem_addr)

__m256 _mm256_loadu_ps (float const * mem_addr)

__m256i _mm256_loadu_si256 (__m256i const * mem_addr)

__m256 _mm256_loadu2_m128 (float const* hiaddr, float const* loaddr)

__m256d _mm256_loadu2_m128d (double const* hiaddr, double const* loaddr)

__m256i _mm256_loadu2_m128i (__m128i const* hiaddr, __m128i const* loaddr)

 

使用掩碼將打包的雙精度(64位)浮點元素從存儲器加載到dst(當未設置相應元素的高位時,元素被清零)。

__m128d _mm_maskload_pd (double const * mem_addr, __m128i mask)

__m256d _mm256_maskload_pd (double const * mem_addr, __m256i mask)

__m128 _mm_maskload_ps (float const * mem_addr, __m128i mask)

__m256 _mm256_maskload_ps (float const * mem_addr, __m256i mask)

 

十、卸載數據

使用掩碼將打包的雙精度(64位)浮點元素存儲到內存中。

void _mm_maskstore_pd (double * mem_addr, __m128i mask, __m128d a)

void _mm256_maskstore_pd (double * mem_addr, __m256i mask, __m256d a)

void _mm_maskstore_ps (float * mem_addr, __m128i mask, __m128 a)

void _mm256_maskstore_ps (float * mem_addr, __m256i mask, __m256 a)

 

256位(由4個壓縮的雙精度(64位)浮點元素組成)存儲到存儲器中。 mem_addr必須在32字節邊界上對齊,否則可能會生成一般保護異常。

void _mm256_store_pd (double * mem_addr, __m256d a)

void _mm256_store_ps (float * mem_addr, __m256 a)

void _mm256_store_si256 (__m256i * mem_addr, __m256i a)

void _mm256_storeu_pd (double * mem_addr, __m256d a)

void _mm256_storeu_ps (float * mem_addr, __m256 a)

void _mm256_storeu_si256 (__m256i * mem_addr, __m256i a)

 

將高和低128位的一半(每個由4個打包的單精度(32位)浮點元素組成)存儲到兩個不同的128位位置的存儲器中。 hiaddrloaddr不需要在任何特定邊界上對齊。

void _mm256_storeu2_m128 (float* hiaddr, float* loaddr, __m256 a)

void _mm256_storeu2_m128d (double* hiaddr, double* loaddr, __m256d a)

void _mm256_storeu2_m128i (__m128i* hiaddr, __m128i* loaddr, __m256i a)

 

使用非時間內存提示將256位(由4個打包的雙精度(64位)浮點元素組成)存儲到內存中。 mem_addr必須在32字節邊界上對齊,否則可能會生成一般保護異常。

void _mm256_stream_pd (double * mem_addr, __m256d a) (與_mm256_store_pd的區別?)

void _mm256_stream_ps (float * mem_addr, __m256 a)

void _mm256_stream_si256 (__m256i * mem_addr, __m256i a)

 

十一、對應位置插入(替換)運算

__m256i _mm256_insert_epi16 (__m256i a, __int16 i, const int index)

dst[255:0] := a[255:0] copy

sel := index*16

dst[sel+15:sel] := i[15:0]

__m256i _mm256_insert_epi32 (__m256i a, __int32 i, const int index)

__m256i _mm256_insert_epi64 (__m256i a, __int64 i, const int index)

__m256i _mm256_insert_epi8 (__m256i a, __int8 i, const int index)

__m256d _mm256_insertf128_pd (__m256d a, __m128d b, int imm8)

__m256 _mm256_insertf128_ps (__m256 a, __m128 b, int imm8)

__m256i _mm256_insertf128_si256 (__m256i a, __m128i b, int imm8)

 

十二、移動數據

a復制偶數索引(索引從0開始的雙精度(64位)浮點元素,並將結果存儲在dst中。

__m256d _mm256_movedup_pd (__m256d a)

dst[63:0] := a[63:0]

dst[127:64] := a[63:0]

dst[191:128] := a[191:128]

dst[255:192] := a[191:128]

dst[MAX:256] := 0

__m256 _mm256_moveldup_ps (__m256 a)

__m256 _mm256_movehdup_ps (__m256 a) 復制奇數索引

 

根據a中相應的壓縮雙精度(64位)浮點元素的最高有效位設置掩碼dst的每個位。

int _mm256_movemask_pd (__m256d a) 四位有效

int _mm256_movemask_ps (__m256 a) 八位有效

 

十三、設置:使用提供的值在dst中設置打包的16位整數。

__m256i _mm256_set_epi16 (short e15, short e14, short e13, short e12, short e11, short e10, short e9, short e8, short e7, short e6, short e5, short e4, short e3, short e2, short e1, short e0)

__m256i _mm256_set_epi32 (int e7, int e6, int e5, int e4, int e3, int e2, int e1, int e0)

__m256i _mm256_set_epi64x (__int64 e3, __int64 e2, __int64 e1, __int64 e0)

__m256i _mm256_set_epi8 (char e31, char e30, char e29, char e28, char e27, char e26, char e25, char e24, char e23, char e22, char e21, char e20, char e19, char e18, char e17, char e16, char e15, char e14, char e13, char e12, char e11, char e10, char e9, char e8, char e7, char e6, char e5, char e4, char e3, char e2, char e1, char e0)

__m256 _mm256_set_m128 (__m128 hi, __m128 lo)

__m256d _mm256_set_m128d (__m128d hi, __m128d lo)

__m256i _mm256_set_m128i (__m128i hi, __m128i lo)

__m256d _mm256_set_pd (double e3, double e2, double e1, double e0)

__m256 _mm256_set_ps (float e7, float e6, float e5, float e4, float e3, float e2, float e1, float e0)

__m256i _mm256_set1_epi16 (short a)

__m256i _mm256_set1_epi32 (int a)

__m256i _mm256_set1_epi64x (long long a)

__m256i _mm256_set1_epi8 (char a)

__m256d _mm256_set1_pd (double a)

__m256 _mm256_set1_ps (float a)

__m256i _mm256_setr_epi16 (short e15, short e14, short e13, short e12, short e11, short e10, short e9, short e8, short e7, short e6, short e5, short e4, short e3, short e2, short e1, short e0)

__m256i _mm256_setr_epi32 (int e7, int e6, int e5, int e4, int e3, int e2, int e1, int e0)

__m256i _mm256_setr_epi64x (__int64 e3, __int64 e2, __int64 e1, __int64 e0)

__m256i _mm256_setr_epi8 (char e31, char e30, char e29, char e28, char e27, char e26, char e25, char e24, char e23, char e22, char e21, char e20, char e19, char e18, char e17, char e16, char e15, char e14, char e13, char e12, char e11, char e10, char e9, char e8, char e7, char e6, char e5, char e4, char e3, char e2, char e1, char e0)

__m256 _mm256_setr_m128 (__m128 lo, __m128 hi)

__m256d _mm256_setr_m128d (__m128d lo, __m128d hi)

__m256i _mm256_setr_m128i (__m128i lo, __m128i hi)

__m256d _mm256_setr_pd (double e3, double e2, double e1, double e0)

__m256 _mm256_setr_ps (float e7, float e6, float e5, float e4, float e3, float e2, float e1, float e0)

__m256d _mm256_setzero_pd (void)

__m256 _mm256_setzero_ps (void)

__m256i _mm256_setzero_si256 (void)

 

返回帶有未定義元素的__m256d類型的向量。

__m256d _mm256_undefined_pd (void)

__m256 _mm256_undefined_ps (void)

__m256i _mm256_undefined_si256 (void)

 

將所有XMMYMM寄存器的內容歸零。

void _mm256_zeroall (void)

將所有YMM寄存器的高128位歸零; 寄存器的低128位未經修改。

void _mm256_zeroupper (void)

 

十四、使用imm8中的高4位有條件地將ab中的打包單精度(32位)浮點元素相乘,將四個乘積相加,並使用imm8的低4位有條件地將總和存儲在dst中。

__m256 _mm256_dp_ps (__m256 a, __m256 b, const int imm8)

 

十五、計算ab128位(表示雙精度(64位)浮點元素)的按位AND,產生中間128位值,如果每個64位元素的符號位,則將ZF設置為1 中間值為零,否則將ZF設置為0.計算a的按位NOT,然后用b計算AND,產生一個中間值,如果中間值中每個64位元素的符號位為,則將CF設置為1 為零,否則將CF設置為0.返回CF值。

int _mm_testc_pd (__m128d a, __m128d b)

tmp[127:0] := a[127:0] AND b[127:0]

IF (tmp[63] == tmp[127] == 0)

   ZF := 1

ELSE

  ZF := 0

FI

tmp[127:0] := (NOT a[127:0]) AND b[127:0]

IF (tmp[63] == tmp[127] == 0)

  CF := 1

ELSE

  CF := 0

FI

dst := CF

int _mm256_testc_pd (__m256d a, __m256d b)

int _mm_testc_ps (__m128 a, __m128 b)

int _mm256_testc_ps (__m256 a, __m256 b)

int _mm256_testc_si256 (__m256i a, __m256i b)

int _mm_testnzc_pd (__m128d a, __m128d b)

int _mm256_testnzc_pd (__m256d a, __m256d b)

int _mm_testnzc_ps (__m128 a, __m128 b)

int _mm256_testnzc_ps (__m256 a, __m256 b)

int _mm256_testnzc_si256 (__m256i a, __m256i b)

int _mm_testz_pd (__m128d a, __m128d b)

int _mm256_testz_pd (__m256d a, __m256d b)

int _mm_testz_ps (__m128 a, __m128 b)

int _mm256_testz_ps (__m256 a, __m256 b)

int _mm256_testz_si256 (__m256i a, __m256i b)

 

十六、從ab中的每個128位通道的高半部分解壓縮並交錯雙精度(64位)浮點元素,並將結果存儲在dst中。

__m256d _mm256_unpackhi_pd (__m256d a, __m256d b)

DEFINE INTERLEAVE_HIGH_QWORDS(src1[127:0], src2[127:0]) {

  dst[63:0] := src1[127:64]

  dst[127:64] := src2[127:64]

  RETURN dst[127:0]

}

dst[127:0] := INTERLEAVE_HIGH_QWORDS(a[127:0], b[127:0])

dst[255:128] := INTERLEAVE_HIGH_QWORDS(a[255:128], b[255:128])

dst[MAX:256] := 0

__m256 _mm256_unpackhi_ps (__m256 a, __m256 b)

__m256d _mm256_unpacklo_pd (__m256d a, __m256d b)

__m256 _mm256_unpacklo_ps (__m256 a, __m256 b)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM