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

4
我正在尝试让GCC(或clang)在计算密集型的科学应用程序中始终使用SSE指令来进行sqrt运算,而不是使用math库函数。我已经尝试了各种32位和64位OS X和Linux系统上的GCCs。我确保使用-mfpmath = sse(和-march = core2,以满足GCC在32位上使用-mfpmath = sse的要求)。我还使用了-O3。根据GCC或clang版本的不同,生成的汇编代码并不总是一致地使用SSE的sqrtss。在某些版本的GCC中,所有的sqrtss都使用该指令。在其他情况下,则混合使用sqrtss和调用math库函数。有没有方法可以提示或强制编译器只使用SSE指令呢?
2个回答

4

您是否需要使用内在函数__builtin_ia32_sqrtss来求平方根sqrtss


0

在使用它时,你应该小心,因为它的精度较低,这也是gcc不系统地使用它的原因。

在英特尔SSE手册中甚至提到了一个技巧(我希望我记得正确)。sqrtss的结果只有一个Heron迭代离目标值。也许gcc有时能够在某些版本中内联周围的简短迭代,并且对于其他版本则不能。

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


我知道这会失去精度,但我希望在不同的操作系统之间更加一致。标准的数学库sqrt函数并不是特别标准化的,结果在不同平台上也不同。在这种情况下,速度和一致性更为重要。 - arsenm
3
我不确定你从哪里得到这个信息,但是它是错误的。sqrtss是符合IEEE-754标准的单精度平方根。也许你想说的是rsqrtss,它是一种快速的近似倒数平方根。 - Stephen Canon
1
@arsenm:标准数学库sqrt函数是完全标准化的,结果不允许在符合C标准附录F的平台之间变化:“<math.h>中的sqrt函数提供IEC 60559平方根操作。” IEC 60559(IEEE-754)则完全指定了平方根的语义。 - Stephen Canon
1
@Jens Gustedt: 实际上 sqrtss 是来自原始的SSE扩展。 - Stephen Canon
@Stephen:sqrtss 也是用于32位浮点数的。因此,应该将其与 sqrtf 进行比较。这仅在C99中包含,而不是在c89中似乎没有。 - Jens Gustedt
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接