【问题标题】:Is x87 FP stack still relevant?x87 FP 堆栈仍然相关吗?
【发布时间】: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


【解决方案1】:

此外,SIMD 实现往往至少为 128 位宽,所以我想知道这是否意味着(内部)运算精度高于 x87 FP 单元?

SIMD 寄存器的宽度不是它所代表的向量的单个分量的宽度。广泛可用的 SIMD 指令集最多提供 IEEE 754 binary64 格式(64 位宽)。这在精度或范围方面不如历史上的 80 位扩展格式。

许多 C 编译器将 80 位格式作为 long double 类型提供。我经常使用它。它适用于大多数中间计算:使用它有助于使最终结果更加准确,即使最终结果注定要以 binary64 double 的形式返回。一个例子是this question 中的函数,如果中间计算使用long double 完成,则最终结果的数学直观属性成立,但如果中间计算使用与输入和输出相同的double 类型完成,则不会.

同样,在为扩展 80 位格式选择参数时必须平衡的许多约束中,一个考虑因素是通过组合 80 位 @compute 一个 binary64 函数 pow() 是完美的987654329@ 和logl()。为了获得最终结果的良好精度,额外的精度是必要的。

但是,我应该注意,当“中间”计算是单个基本操作时,最好不要进行扩展精度。换句话说,当xydouble类型时,(double)(x * (long double)y)的准确率比x * y的准确率要差很多。这两个表达式几乎总是产生相同的结果,并且在它们不同的极少数情况下,x * y 会稍微准确一些。这种现象称为double-rounding

【讨论】:

  • 那么在 SIMD 单元中没有 128 位浮点表示吗?
  • 例如“IEEE 754 四精度二进制浮点格式”
  • @user3735658 在大多数 128 位 SIMD 指令集中,一个“128 位寄存器”代表两个 binary64 或四个 binary32,并且永远不能用于单个 binary128 值。
  • 我假设是因为硬件不支持这样的操作?不过 128 位浮点会很好......
  • @user3735658 会的(我经常使用extended double 作为可用的次优解决方案)。 GCC 还提供用于四精度的软件仿真,地址为 __float128
猜你喜欢
  • 2013-11-22
  • 2010-09-19
  • 2011-06-18
  • 1970-01-01
  • 2015-07-27
  • 2010-09-08
  • 2016-03-06
  • 2016-02-06
  • 1970-01-01
相关资源
最近更新 更多