c++ - 使用 AVX 从结构中提取整数和短裤?

标签 c++ x86 sse simd avx

我有一个结构,它包含各种数据成员之间的 union 和一个 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:已更新代码以将 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

参见: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);

关于c++ - 使用 AVX 从结构中提取整数和短裤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27105513/

相关文章:

c++ - 为什么我需要 FreeGLUT 来编译和链接一个 GLFW 程序

assembly - rbp 不允许作为 SIB 基础?

c++ - SSE 复制数据到变量

c++ - CMake:防止在子目录库项目中构建测试可执行目标

c++ - 是否可以在声明中修复堆栈的大小?

c++ - 使用 boost::regex 编译简单代码

sse - 有没有一种方法可以根据编译时未知的掩码长度来掩码 __m128i 寄存器的一端?

performance - 点乘积性能与 SSE 指令

x86 - SSE 乘法 16 x uint8_t

c++ - 使用 SSE 内在函数注册短缺