CPU指令集SSE、AVX等

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位向量

具体的官方函数 Intel® Intrinsics Guide

其他入门案例 SSE的学习_ssebzg@-CSDN博客

posted @ 2024-06-06 22:08  夕西行  阅读(41)  评论(0编辑  收藏  举报