【问题标题】:What's the most efficient way to load and extract 32 bit integer values from a 128 bit SSE vector?从 128 位 SSE 向量中加载和提取 32 位整数值的最有效方法是什么?
【发布时间】:2010-12-05 20:18:34
【问题描述】:

我正在尝试使用 SSE 内在函数优化我的代码,但我遇到了一个问题,在我完成 SSE 内在函数操作以获得什么后,我不知道从向量中提取整数值的好方法我要。

有谁知道这样做的好方法吗?我正在用 C 编程,我的编译器是 gcc 版本 4.3.2。

感谢您的所有帮助。

【问题讨论】:

  • 嗯...int *pointer = vectoraddress; *(pointer++) four times?
  • 是否有某些原因您不能在 SSE 寄存器中执行所有操作,然后在完成后将它们转储回内存?
  • 我试过了,但我不断收到一些我无法弄清楚的编译错误......
  • 也许您应该发布您的代码,让人们更好地了解您通过 SSE 实际尝试实现的目标是什么?

标签: c gcc sse simd


【解决方案1】:

这取决于您对 SSE 支持的最低水平的假设。

回到 SSE2,你有 _mm_extract_epi16 (PEXTRW),它可用于从 128 位向量中提取任何 16 位元素。您需要调用两次才能获得 32 位元素的两半。

在 SSE 的更新版本(SSE4.1 及更高版本)中,您有 _mm_extract_epi32 (PEXTRD),它可以在一条指令中提取 32 位元素。

或者,如果这不在性能关键循环内,您可以只使用联合,例如

typedef union
{
    __m128i v;
    int32_t a[4];
} U32;

【讨论】:

  • 嗨,保罗,感谢您的回复。你在哪里找到这些函数(mm_extract_epi16/32)?我在 gcc 文档中没有看到它们。包括 -mmmx -msse -msse2 和 -msse3 似乎不让我使用它并且编译器说有一个隐式函数声明。
  • @Kaigi:_mm_extract_epi16 在 emmintrin.h 中,_mm_extract_epi32 在 smmintrin.h 中。后者需要一个合理的最新版本的 gcc。
【解决方案2】:
_mm_extract_epi32

提取内在函数确实是最好的选择,但如果您需要支持 SSE2,我建议您这样做:

inline int get_x(const __m128i& vec){return _mm_cvtsi128_si32 (vec);}
inline int get_y(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0x55));}
inline int get_z(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xAA));}
inline int get_w(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xFF));}

我发现,如果您将向量重新解释为任何 int[4] 表示形式,编译器倾向于将内容刷新回内存(这可能不是那么糟糕)并将其作为 int 读回,尽管我没有' 不查看程序集以查看最新版本的编译器是否生成更好的代码。

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 2019-10-20
    • 1970-01-01
    • 2015-04-06
    • 2018-06-05
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多