【发布时间】:2014-12-04 11:46:16
【问题描述】:
我注意到每次使用 double 算法时,编译器都会生成针对 SIMD 寄存器的代码。这适用于未优化和优化的代码。这是否意味着 x87 FP 单元可以被认为是过时的并且只是为了向后兼容而存在?
我还注意到,其他“流行”平台也依赖于它们各自的 SIMD 实现,而不是设计为堆栈的 FP。
此外,SIMD 实现往往至少有 128 位宽,所以我想知道这是否意味着(内部)运算精度高于 x87 FP 单元?
我还想知道性能、吞吐量和延迟,考虑到 SIMD 是在考虑向量执行的情况下构思的,所以我想知道它们如何处理标量。
【问题讨论】:
-
它牢牢地在濒临灭绝的代码物种名单上。每个人都对他们的 64 位代码生成器进行了重大更改。三巨头都换了。周围有一些落后者,例如 32 位 .NET 抖动。我们可以将 80 位 FPU 灾难称为遥远的糟糕记忆。
-
@HansPassant 有人可以提出相反的论点,即由于切换到 SSE2 寄存器已经释放了历史 FPU,它现在可以再次用于其最初的目的,即提供扩展精确。没有理由再假装减小的有效数字宽度应该是历史 FPU 的正常状态。
-
@HansPassant:80 位 FPU...灾难?它到底有什么灾难性的?
-
@tmyklebu 好吧,我们三个人都知道,x87 是长期以来很难实现一种提供简单、双精度跨行浮点的编程语言的主要原因算术。所有编译器和优化级别的结果的重现性通常比准确性更重要,而浮点获得的不可靠的声誉一直困扰着它。
-
@tmyklebu Java,正如在 90 年代中期定义的那样,对于 x87 的指令来说很难实现,直到 C99(据我所知),一种确定性和建议使用 387 指令易于实施。该提案于 2008 年在 GCC 中实现,据我所知,GCC 是第一个实现它的 C 编译器(并且可能仍然是唯一一个实现它的)。
标签: assembly floating-point stack obsolete x87