我有一个结构,它包含各种数据成员和AVX类型之间的联合,以加载一个加载中的所有字节。我的代码如下:
#include <immintrin.h>
union S{
struct{
int32_t a;
int32_t b;
int16_t c;
int16_t d;
};
__m128i x;
}
我想使用AVX寄存器一起加载数据,然后分别将四个成员提取到int32_t
和int16_t
局部变量。
我该怎么做呢?我不确定在从AVX寄存器中提取时如何将数据成员彼此分开?
编辑:正在寻找GCC内在函数方面的答案。
EDIT2:已经使用union更新了交换结构的代码。
答案 0 :(得分:6)
您可以使用__m128i
从_mm_extract_epi16
中提取16位元素(需要SSE2):
int16_t v = _mm_extract_epi16 (v, 4); // extract element 4
对于32位元素,使用_mm_extract_epi32
(需要SSE4.1)
int32_t v = _mm_extract_epi32 (v, 0); // extract element 0
假设您的结构声明为:
union S{
struct{
int32_t a;
int32_t b;
int16_t c;
int16_t d;
};
__m128i x;
}
然后你将如下提取元素a,b,c,d:
S s = { { 1, 2, 3, 4 } };
__m128i v = _mm_loadu_si128((__m128i *)&s);
int32_t a = _mm_extract_epi32 (v, 0);
int32_t b = _mm_extract_epi32 (v, 1);
int16_t c = _mm_extract_epi16 (v, 4);
int16_t d = _mm_extract_epi16 (v, 5);