C 确保编译器始终使用SSE sqrt指令

C 确保编译器始终使用SSE sqrt指令,c,math,gcc,sse,C,Math,Gcc,Sse,我试图让GCC(或clang)一致地为sqrt使用SSE指令,而不是为计算密集型科学应用程序使用数学库函数。我在各种32位和64位OS X和Linux系统上尝试了各种GCC。我确保使用-mfpmath=sse启用sse(和-march=core2以满足GCCs在32位上使用-mfpmath=sse的要求)。我也在用-O3。根据GCC或clang版本,生成的程序集不一致地使用SSE的SQRTS。在某些版本的GCC中,所有SQRT都使用该指令。在其他情况下,SQRTS和调用数学库函数是混合使用的。有

我试图让GCC(或clang)一致地为sqrt使用SSE指令,而不是为计算密集型科学应用程序使用数学库函数。我在各种32位和64位OS X和Linux系统上尝试了各种GCC。我确保使用-mfpmath=sse启用sse(和-march=core2以满足GCCs在32位上使用-mfpmath=sse的要求)。我也在用-O3。根据GCC或clang版本,生成的程序集不一致地使用SSE的SQRTS。在某些版本的GCC中,所有SQRT都使用该指令。在其他情况下,SQRTS和调用数学库函数是混合使用的。有没有办法给出提示或强制编译器只使用SSE指令?

使用
sqrtss
内部
\uuuuuu内置

您应该小心使用,您可能知道它的精确度较低。这就是gcc没有系统地使用它的原因

英特尔的SSE手册中甚至提到了一个技巧(我希望我记得正确)。
sqrtss
的结果离目标只有一次Heron迭代。也许gcc有时能够
内联
在某个点(版本)进行简短的迭代,而在另一些点(版本)则不能


你可以像MSN所说的那样使用内置,但你应该在英特尔的网站上查看规格,以了解你在交易什么。

我知道它正在失去精度,但我希望它在不同的操作系统之间更加一致。标准的数学库sqrt函数并不是特别标准,结果在不同的平台上是不同的。在这种情况下,速度和一致性更为重要。我不确定你从哪里得到这些信息,但这是不正确的
sqrtss
是IEEE-754正确四舍五入的单精度平方根。也许您想的不是
rsqrtss
,它是一个快速近似的平方根。@arsenm:标准数学库sqrt函数是完全标准化的,并且结果不允许在符合C标准附录F的平台之间变化:“中的sqrt函数提供IEC 60559平方根操作。”IEC 60559(IEEE-754)反过来完全指定了平方根的语义。@Stephen:啊,也许我把它们弄混了。但是
sqrtss
一定是相对较新的sse4左右?@Jens Gustedt:实际上
sqrtss
是原始SSE扩展。