我知道x87具有更高的内部精度,这可能是人们所看到的与SSE操作之间的最大差异。但是我想知道,使用x87还有其他好处吗?我有在任何项目中自动键入-mfpmath=sse
的习惯,并且我想知道我是否缺少x87 FPU提供的其他功能。
最佳答案
对于手写汇编,x87的某些指令在SSE指令集中不存在。
在我的头顶上,所有的三角函数,例如fsin,fcos,fatan,fatan2和一些指数/对数的东西。
使用gcc -O3 -ffast-math -mfpmath=387
,无论libm中的实现将使用哪种方式,GCC9仍将实际上内联sin(x)
作为fsin
指令。 (https://godbolt.org/z/Euc5gp)。
为32位x86进行编译时,MSVC会调用__libm_sse2_sin_precise
。
如果您的代码大部分时间都花在做三角函数上,那么使用x87可能会导致轻微的性能提升或下降,这取决于使用SSE1 / SSE2的标准数学库实现是比慢速fsin
微代码实现慢还是慢您正在使用的CPU。
CPU厂商不花太多精力来优化最新一代CPU中的x87指令微码,因为通常认为它已经过时并且很少使用。 (请查看最近几代CPU中Agner Fog's instruction tables中复杂x87指令的uop计数和吞吐量:比旧CPU的周期更多)。 CPU越新,x87比许多SSE或AVX指令来计算log,exp,pow或trig函数的速度就越慢。
即使x87可用,并不是所有的数学库都选择使用诸如fsin
之类的复杂指令来实现诸如sin()
之类的功能,或者特别是exp / log,其中用于处理基于日志的FP位模式的整数技巧很有用。
一些DSP算法使用了大量的触发器,但通常会受益于SIMD数学库的自动向量化。
但是,对于需要花费大部分时间进行加法,乘法等运算的数学代码,SSE通常更快。
还与之相关:Intel Underestimates Error Bounds by 1.3 quintillion-fsin
的最坏情况(非常接近pi的fsin
输入的灾难性取消)非常糟糕。软件可以做得更好,但只能使用慢速扩展精度技术。