将__m256i设置为两个__m128i值的值

时间:2015-09-17 12:36:12

标签: c sse simd avx

因此,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’

我真的不明白为什么会这样。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:11)

并非所有编制器似乎都在_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))
  • 英特尔ICC 11.1及更高版本同时具有_mm256_set_m128i_mm256_setr_m128i

  • MSVC 2012及更高版本只有_mm256_set_m128i

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

答案 1 :(得分:0)

我们遇到了同样的问题,并使用了一个宏来解决它。

#ifdef __GNUC__ 
#if __GNUC__ < 8
#define _mm256_set_m128i(xmm1, xmm2) _mm256_permute2f128_si256(_mm256_castsi128_si256(xmm1), _mm256_castsi128_si256(xmm2), 2)
#define _mm256_set_m128f(xmm1, xmm2) _mm256_permute2f128_ps(_mm256_castps128_ps256(xmm1), _mm256_castps128_ps256(xmm2), 2)
#endif
#endif