Intrinsic 指令集优化
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
https://blog.csdn.net/just_sort/article/details/94393506
https://zhuanlan.zhihu.com/p/94649418
// 把数组变成__m256i
__m256i s0 = _mm256_lddqu_si256((__m256i *) (src0 + x));
// 把__m256i变成数组
_mm256_storeu_si256((__m256i *) (dst + x), s0);
// 交叉打包低位
__m256i s0tmp = _mm256_unpacklo_epi16(s0, s1);
// 交叉打包高位
s0 = _mm256_unpackhi_epi16(s0, s1);
// 相乘在相加变成epi32的数
_mm256_madd_epi16(s0, w0);
// 相加
s0 = _mm256_add_epi32(_mm256_madd_epi16(s0, w0), mmOffsetAVX2);
// 右移
s0 = _mm256_sra_epi32(s0, mmShift);
// 把epi32转成epi32然后进行打包
s0 = _mm256_packs_epi32(s0tmp, s0);
// 最大最小值限幅
s0 = _mm256_min_epi16(mmMaxAVX2, _mm256_max_epi16(s0, mmMinAVX2));
// 把标量进行广播
const __m256i mmEightAVX2 = _mm256_set1_epi16(8);
函数命名约定
_mm<bit_width>_<name>_<