27

我知道 x87 具有更高的内部精度,这可能是人们看到的它与 SSE 操作之间的最大区别。但我不得不怀疑,使用 x87 还有其他好处吗?我有-mfpmath=sse在任何项目中自动输入的习惯,我想知道我是否遗漏了 x87 FPU 提供的任何其他内容。

4

5 回答 5

22

对于手写 asm,x87 有一些 SSE 指令集中不存在的指令。

在我的脑海中,这都是三角函数,如 fsin、fcos、fatan、fatan2 和一些指数/对数的东西。

使用gcc -O3 -ffast-math -mfpmath=387, GCC9实际上仍将sin(x)作为指令内联fsin,而不管 libm 中的实现将使用什么。(https://godbolt.org/z/Euc5gp)。

__libm_sse2_sin_precise为 32 位 x86 编译时的MSVC 调用。


如果您的代码大部分时间都花在三角函数上,那么如果您使用 x87,您可能会看到轻微的性能增益或损失,这取决于您使用 SSE1/SSE2 的标准数学库实现是比fsin任何 CPU 上的慢速微码更快还是更慢你正在使用。

CPU 供应商并没有在最新一代 CPU 中优化 x87 指令的微代码方面投入大量精力,因为它通常被认为已过时且很少使用。(查看最近几代 CPU 中Agner Fog 指令表中复杂 x87 指令的 uop 计数和吞吐量:比旧 CPU 更多的周期)。CPU 越新,x87 计算 log、exp、pow 或 trig 函数的速度就越可能比许多 SSE 或 AVX 指令慢。

即使 x87 可用,也不是所有的数学库都选择使用复杂的指令,比如fsin实现函数sin(),或者特别是 exp/log,其中整数技巧用于操作基于日志的 FP 位模式很有用。

一些 DSP 算法使用了大量的三角函数,但通常从使用 SIMD 数学库的自动矢量化中受益匪浅。

但是,对于您花费大部分时间进行加法、乘法等操作的数学代码,SSE 通常更快。


还相关:英特尔将错误界限低估了 1.3 quintillion - 最坏的情况(对于非常接近pifsin的输入的灾难性取消)非常糟糕。软件可以做得更好,但只能使用缓慢的扩展精度技术。fsin

于 2009-12-04T06:19:19.023 回答
17
  1. 它存在于非常旧的机器上。

EOF

于 2009-12-04T03:44:54.397 回答
9

FPU 指令比 SSE 指令小,因此非常适合演示场景

于 2010-10-12T19:35:33.623 回答
4
  • 与 x87 有相当大的传统和小型系统兼容性:SSE 是一个相对较新的处理器功能。如果您的代码要在嵌入式微控制器上运行,那么它很可能不支持 SSE 指令。

  • 即使没有安装 FPU 的系统通常也会提供 80x87 仿真器,这将使代码透明地运行(或多或少)。我不知道任何 SSE 模拟器——当然我的一个系统没有,所以最新的 Adob​​e Photoshop 元素版本拒绝运行。

  • 80x87指令具有良好的并行操作特性,自1982年左右推出以来,已经进行了深入的探索和分析。x86 的各种克隆可能会在 SSE 指令上停止。

于 2009-12-04T03:46:02.943 回答
2

x87(通常是免费的)与 SSE之间float的转换速度更快。double使用 x87,您可以加载和存储float, doubleorlong double到寄存器堆栈或从寄存器堆栈中转换,并且无需额外成本即可将其转换为扩展精度或从扩展精度转换。使用 SSE,如果类型混合,则需要额外的指令来进行类型转换,因为寄存器包含floatdouble值。这些转换指令相当快,但确实需要额外的时间。

真正的解决办法是避免混合floatdouble过度,当然不要使用 x87。

于 2011-11-04T20:21:24.683 回答