因此,AVX具有immintrin.h的功能,该功能应允许将两个__m128i值的串联存储到单个__m256i值中。该功能是

__m256i _mm256_set_m128i (__m128i hi, __m128i lo)

但是,当我使用它时,就像这样:
__m256i as[2]; __m128i s[4]; as[0] = _mm256_setr_m128i(s[0], s[1]);

我收到编译错误:
error: incompatible types when assigning to type ‘__m256i’ from type ‘int’

我真的不明白为什么会这样。任何帮助是极大的赞赏!

最佳答案

并非所有编译器似乎都在 _mm256_setr_m128i 中定义了 _mm256_set_m128i ,甚至 immintrin.h 。所以我通常只根据需要定义宏,用合适的 #ifdef 括起来,用于测试编译器和版本:

#define _mm256_set_m128i(v0, v1)  _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1)

#define _mm256_setr_m128i(v0, v1) _mm256_set_m128i((v1), (v0))
  • Intel ICC 11.1 及更高版本同时具有 _mm256_set_m128i_mm256_setr_m128i
  • MSVC 2012 及更高版本只有 _mm256_set_m128i
  • gcc/clang 似乎也没有,虽然我还没有检查最近的版本,看看这是否已经修复。
  • 关于c - 将 __m256i 设置为两个 __m128i 值的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32630458/

    10-11 15:38