xmmintrin.h 与 gcc 向量扩展

Posted

技术标签:

【中文标题】xmmintrin.h 与 gcc 向量扩展【英文标题】:xmmintrin.h vs gcc vector extensions 【发布时间】:2011-05-03 02:20:13 【问题描述】:

我应该更喜欢哪种方法来编写 SIMD 指令?

mm* *mmintrin.h 形式的方法似乎更易于跨编译器移植。

但 gcc vector extensions 似乎可以生成更简单的代码,并支持更多架构。

那么哪种方法最好呢?

【问题讨论】:

你可以同时使用。我就是做这个的。矢量扩展涵盖了大多数垂直操作,这是您大部分时间应该使用的。当您需要其他操作时,您可以强制转换。例如,如果您有一个 16 字节向量 x,您可以使用 _mm_movemask_epi8((__m128i)x) 【参考方案1】:

如果您使用 gcc 矢量扩展,您将只能使用 SSE 功能的有限子集,因为有许多 SSE 内在函数不适合 gcc 等通用矢量模型。如果您只想做相当基本的事情,例如向量上的浮点运算,那么您可能会侥幸成功,但是如果您有兴趣利用 SIMD 来获得最大的性能优势,那么您需要使用本机内在函数。

【讨论】:

【参考方案2】:

*mmintrin.h 文件中可用的内在函数仅在 SSE 机器上可用,但它们在不同的编译器中可用。 GCC 矢量扩展受到更多限制,但可以在更广泛的平台上实现,而且显然是 GCC 特定的。

与所有事情一样,没有“最佳”答案;你必须选择一个适合你的需求。

【讨论】:

以上是关于xmmintrin.h 与 gcc 向量扩展的主要内容,如果未能解决你的问题,请参考以下文章

C - 如何使用 GCC SSE 向量扩展访问向量的元素

GCC 向量扩展和 ARM NEON 的内存对齐问题

使用 GCC 向量扩展存储、修改和检索字符串?

将浮点向量转换为 16 位 int 而不饱和

带有 -mavx 标志的链接器错误 GCC7

在 gcc 中使用向量内在函数对常规数组进行别名