c – 使用AVX从结构中提取整数和短路?
作者:互联网
我有一个结构,其中包含各种数据成员之间的联合和一个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交换struct.
解决方法:
您可以使用_mm_extract_epi16(需要SSE2)从__m128i中提取16位元素:
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);
标签:c,x86,sse,avx,simd 来源: https://codeday.me/bug/20190824/1712733.html