我知道 x87 具有更高的内部精度,这可能是人们看到的它与 SSE 操作之间最大的区别。但我想知道,使用 x87 还有其他好处吗?我有打字的习惯 -mfpmath=sse 在任何项目中都会自动执行,我想知道我是否错过了 x87 FPU 提供的其他功能。

有帮助吗?

解决方案

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

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

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

MSVC 调用 __libm_sse2_sin_precise 编译 32 位 x86 时。


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

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

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

一些 DSP 算法使用大量三角函数,但通常有利于 很多 来自 SIMD 数学库的自动矢量化。

然而,对于数学代码,您大部分时间都花在做加法、乘法等上。SSE 通常更快。


还相关: Intel 将误差范围低估了 1.3 quintillion - 最坏的情况 fsin (灾难性取消 fsin 输入非常接近 圆周率) 很糟糕。软件可以做得更好,但只能使用缓慢的扩展精度技术。

其他提示

  1. 它现在真的很旧的机器。

EOF

FPU的指令比SSE指令较小,因此它们是理想的demoscene东西

  • 有相当多的遗产以及小系统的兼容性x87:SSE是一个相对较新的处理器的功能。如果你的代码被上运行的一个嵌入的微控制器,有一个很好的机会,它不会支持上证的说明。

  • 甚至系统的其中没有一个FPU安装将经常提供80x87仿真程序,这将使代码透明地运行(或多或更少)。我不知道任何证的仿真器—肯定我的一个系统没有任何,所以最新的Photoshop元的版本拒绝运行。

  • 该80x87说明具有良好并行运作的特点,它已经彻底探讨和分析,因为其引于1982年。各种克隆的x86可能摊上一个证的说明。

float之间double转换是用的x87(通常是免费的)比具有SSE更快。用的x87,可以加载和floatdoublelong double存储或从寄存器堆,它被转换成或从扩展精度而无需额外成本。与SSE,需要额外的指令来执行类型转换如果类型是混合的,因为寄存器包含floatdouble值。这些转换指令是相当快的,但这样做需要额外的时间。

在实际的解决方法是从混合floatdouble过度,不使用的x87,当然不要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top