繁体   English   中英

从128位SSE向量加载和提取32位整数值的最有效方法是什么?

[英]What's the most efficient way to load and extract 32 bit integer values from a 128 bit SSE vector?

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

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

感谢你的帮助。

这取决于您可以假设您拥有的最低SSE支持级别。

一直到SSE2,你有_mm_extract_epi16PEXTRW ),它可以用来从128位向量中提取任何16位元素。 你需要调用它两次才能获得32位元素的两半。

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

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

typedef union
{
    __m128i v;
    int32_t a[4];
} U32;
_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));}

我发现,如果你将向量reinterpret_cast / union转换为任何int [4]表示,编译器往往会将内容刷回内存(这可能不是那么糟糕)并将其作为int读回来,尽管我还没看过在程序集中查看最新版本的编译器是否生成了更好的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM