2011-11-14 53 views
3

如何在GCC中使用SSE2? 我想使用double值。用于GCC双重计算的SSE2

我搜索s.th.像这样: http://vrm-vrm.blogspot.com/2009/10/gcc-intrinsics.html 只适用于双值。

+0

你可以用'-msse'等编译,或用'-march = native'编译... –

+0

这就是全部?我听说它会很复杂,必须使用内在函数。 –

+2

如果要使用显式构造,则必须使用内在函数。使用编译器标志,您只需告诉编译器,在可用时使用硬件即可,并且优化器确定这是一个不错的选择。与某个“-O”级别结合使用。没有保证,但试试看并比较组件。 –

回答

4

如果要使用SSE2 double insns,则必须使用gcc -mfpmath=sse -msse2进行编译。

单独的选项-msse2将允许您使用SSE2内部函数,-mfpmath=sse将导致GCC为所有FP操作发出SSE2 insns。

另请注意,矢量化启用-O3

矢量SSE2-4 insn的优点是显而易见的,Sandy Bridge处理器可以执行多达三个256位操作每个周期(例如4次乘法,4个增加和在它上面的一些洗牌)

但是,英特尔优化手册推荐使用SSE甚至用于标量操作,原因包括平面注册模式和更短的延迟,与传统x87 insns相比。

编辑:

忘了提,对于32位代码,您也可以增加-msseregparm,这将导致FP参数和返回通过SSE寄存器传递值。默认情况下,它们分别在内存和%st0上传递。当然,这会改变ABI,因此所有交互模块都必须使用此选项进行编译。

+0

如果内存正确运行,x87在64位ABI中根本不使用。 – phkahler

+0

@phkahler,是的,除了使用x87时的“长双倍”操作,自然是如此。 – chill