我有一个结构,它包含各种数据成员之间的 union 和一个 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:已更新代码以将 struct 与 union 交换。
最佳答案
您可以使用 _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++ - 使用 AVX 从结构中提取整数和短裤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27105513/