使用AVX从结构中提取整数和短路?

时间:2014-11-24 13:03:10

标签: c++ x86 sse simd avx

我有一个结构,它包含各种数据成员和AVX类型之间的联合,以加载一个加载中的所有字节。我的代码如下:

#include <immintrin.h>

union S{
    struct{
        int32_t a;
        int32_t b;
        int16_t c;
        int16_t d;
    };

    __m128i x;
}

我想使用AVX寄存器一起加载数据,然后分别将四个成员提取到int32_tint16_t局部变量。

我该怎么做呢?我不确定在从AVX寄存器中提取时如何将数据成员彼此分开?

编辑:正在寻找GCC内在函数方面的答案。

EDIT2:已经使用union更新了交换结构的代码。

1 个答案:

答案 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

请参阅:Intel Intrinsics Guide


假设您的结构声明为:

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);