将__m256i设置为两个__m128i值的值

Mar*_*sen 7 c sse simd avx

因此,AVX有一个函数from immintrin.h,它应该允许将两个__m128i值的串联存储到一个__m256i值中.功能是

__m256i _mm256_set_m128i (__m128i hi, __m128i lo)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用它时,如下所示:

__m256i as[2]; __m128i s[4]; as[0] = _mm256_setr_m128i(s[0], s[1]);
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

error: incompatible types when assigning to type ‘__m256i’ from type ‘int’
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*l R 11

并非所有编译器都具有_mm256_setr_m128i甚至_mm256_set_m128i定义immintrin.h.所以我通常只需要根据需要定义宏,用适当的#ifdefs 括起来测试编译器和版本:

#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))
Run Code Online (Sandbox Code Playgroud)
  • 英特尔ICC 11.1及更高版本具有_mm256_set_m128i_mm256_setr_m128i.

  • MSVC 2012及更高版本刚刚推出_mm256_set_m128i.

  • gcc/clang似乎也没有,虽然我没有检查最近的版本,看看是否已经修复.

  • GCC似乎缺乏很多"复合"内在函数.我最近发现`_mm256_loadu2_m128`和family是从内存进行转置的最佳方式,因为(在ICC上)它编译为两个不使用向量shuffle端口的指令.在GCC上,内联汇编是获得相同效果的唯一方法.对于AVX512,GCC缺乏所有还原内在函数. (3认同)
  • 疼痛,痛苦,痛苦。它在gcc 8.1上。它不在gcc 7.3上。请参阅https://github.com/gcc-mirror/gcc/blob/master/gcc/config/i386/avxintrin.h的源代码。_mm256_set_m128i在那。 (2认同)