CPU指令集SSE、AVX等

夕西行發表於2024-06-06

C++使用CPU指令集,可以引入標頭檔案 #include <intrin.h> 包含了所有指令集。

部分具體的指令集標頭檔案如下:

<xmmintrin.h>     //包含SSE庫
<emmintrin.h>     //包含SSE2庫
<pmmintrin.h>     //包含SSE3庫

CPU指令集發展從MMX,到SSE、SSE2、SSE3、SSE4、AVX/AVX2、AVX512,推薦使用128位的SSE指令集,256位的AVX/AVX2指令集(若CPU支援,優先使用此型別)。注意必須以16位位元組邊界對齊。

SSE資料型別:__m128, __m128d 和 __m128i,分別用以表示單精度浮點型、雙精度浮點型和整型。

AVX/AVX2 資料型別:__m256, __m256d 和 __m256i,分別用以表示單精度浮點型、雙精度浮點型和整型。

具體參考玩轉SIMD指令程式設計 - 知乎 (zhihu.com)

AVX一次計算8個單精度浮點資料

int main(int argc, char **argv)
{
    __m256 a = _mm256_set_ps(8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
    __m256 b = _mm256_set_ps(18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0);
    __m256 c = _mm256_add_ps(a, b);

    float d[8];
    _mm256_storeu_ps(d, c);

    std::cout << "result equals " << d[0] << "," << d[1]
              << "," << d[2] << "," << d[3] << ","
              << d[4] << "," << d[5] << "," << d[6] << ","
              << d[7] << std::endl;

    return 0;
}

函式格式及含義:mm256指256位資料,set和add就是函式本身含義

  • ps: 由float型別資料組成的向量
  • pd:由double型別資料組成的向量
  • epi8/epi16/epi32/epi64: 由8位/16位/32位/64位的有符號整陣列成的向量
  • epu8/epu16/epu32/epu64: 包含8位/16位/32位/64位的無符號整陣列成的向量
  • si128/si256: 未指定的128位或者256位向量

相關文章