7

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

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

感谢你的帮助。

4

2 回答 2

7

这取决于您可以假设您拥有的 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;
于 2010-12-05T22:19:24.950 回答
6
_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 读回,尽管我没有看过在程序集中查看最新版本的编译器是否生成更好的代码。

于 2012-07-11T11:04:45.177 回答