我知道 x87 具有更高的内部精度,这可能是人们看到的它与 SSE 操作之间的最大区别。但我不得不怀疑,使用 x87 还有其他好处吗?我有-mfpmath=sse
在任何项目中自动输入的习惯,我想知道我是否遗漏了 x87 FPU 提供的任何其他内容。
5 回答
对于手写 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
- 它存在于非常旧的机器上。
EOF
FPU 指令比 SSE 指令小,因此非常适合演示场景
与 x87 有相当大的传统和小型系统兼容性:SSE 是一个相对较新的处理器功能。如果您的代码要在嵌入式微控制器上运行,那么它很可能不支持 SSE 指令。
即使没有安装 FPU 的系统通常也会提供 80x87 仿真器,这将使代码透明地运行(或多或少)。我不知道任何 SSE 模拟器——当然我的一个系统没有,所以最新的 Adobe Photoshop 元素版本拒绝运行。
80x87指令具有良好的并行操作特性,自1982年左右推出以来,已经进行了深入的探索和分析。x86 的各种克隆可能会在 SSE 指令上停止。
x87(通常是免费的)与 SSE之间float
的转换速度更快。double
使用 x87,您可以加载和存储float
, double
orlong double
到寄存器堆栈或从寄存器堆栈中转换,并且无需额外成本即可将其转换为扩展精度或从扩展精度转换。使用 SSE,如果类型混合,则需要额外的指令来进行类型转换,因为寄存器包含float
或double
值。这些转换指令相当快,但确实需要额外的时间。
真正的解决办法是避免混合float
和double
过度,当然不要使用 x87。