gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:24:39 24 4
gpt4 key购买 nike

我有一个结构,它包含各种数据成员之间的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com