【问题标题】:software floating point and x87 or sse disabled软件浮点和 x87 或 sse 已禁用
【发布时间】:2019-03-18 16:27:58
【问题描述】:

我正在尝试按照this question 中的建议在 gcc 下启用软件浮点,但我遇到了障碍:

-msoft-float 标志导致:

/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘long double std::stold(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2857:47: error: x87 register return with x87 disabled
   stold(const string& __str, size_t* __idx = 0)
                                               ^

和 -mno-sse 原因:

/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘float std::stof(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2849:46: error: SSE register return with SSE disabled
   stof(const string& __str, size_t* __idx = 0)
                                              ^

有一个couple of questions 提到了这个错误,但与内核编程有关,这没有帮助。

basic_string 中发生的只是函数返回浮点数或双精度数。为什么会导致编译失败?

更重要的是,我能做些什么呢?

背景

我发现 C++ 应用程序在两个不同平台上的行为有所不同:

  • Intel(R) Xeon(R) CPU E5504
  • Intel(R) Core(TM) i5-3470 CPU

在任何一台机器上本地编译的代码在另一台机器上运行,但 对于一项测试,行为取决于代码在哪台机器上运行。

澄清 在机器 A 上编译的可执行文件在复制到机器 B 上运行时,其行为类似于在机器 B 上编译的可执行文件,反之亦然。

它可能是一个未初始化的变量或许多其他东西,但是 我怀疑原因可能是浮点的非便携式使用。 也许一台机器对浮点程序集的解释与另一台机器不同? 我想检验我的假设。 我想如果我可以强制程序使用(理想情况下严格的 IEE 754)软件浮点,它可能会确认或排除这一点。 它不是我的代码,我不想完全重写它来测试它。不过重新编译没问题。

与此相关,我问了一个单独的问题how-to-detect-differences-in-floating-point-behaviour-across-platforms 从另一方解决问题。

【问题讨论】:

  • 尝试使用-ffp-mode=full-fno-fast-math 进行编译。这应该强制严格遵守 IEEE754。
  • 我试过 -fno-fast-math 但没有明显区别。我的平台上的 gcc 4.8 中没有 -ffp-mode 选项。我认为这可能特定于另一个编译器或平台。
  • 我有另一个与此相关的古怪想法,请参阅emulator-to-run-an-application-as-if-its-on-a-different-cpu

标签: c++ gcc floating-point


【解决方案1】:

“为什么会导致编译失败?”

因为相关的 ABI (x87/x64) 被定义为在硬件浮点寄存器中返回 float 值。您显然需要硬件浮点才能拥有该寄存器。

“更重要的是,我能做些什么呢?”

不多。与 x87/x64 不同,ARM 确实有一个软 FP ABI,所以-msoft-float 确实在那里工作,这就是 GCC 仍然有软 FP 的主要原因。

【讨论】:

  • 除了“哦,粗鲁!”我无话可说。有时正确的答案不是你想听到的答案。谢谢:)
  • 等一下 - stackoverflow.com/questions/13201495/soft-float-on-x86-64 表明这是可能的。它有赏金奖励,但答案不被接受。这个答案或那个答案都不完整。
  • 如果这是禁止的,为什么要在 x86_64 上允许 -msoft-float。同样,如果 -mno-sse 破坏了 ABI,它可以用来做什么?为什么 -msoft-float 不会导致寄存器被结构替换(或者宽度足够的整数类型,如果有的话)?我想问题是决定一个链接时间传递哪个表示(例如,用于链接到外部库_。该信息是否存在于 ELF 对象中?
  • @BruceAdams:因为如果您实际上不跨翻译单元边界调用方法,那么 ABI 就没有那么重要了。如果您纯粹在单个函数中使用 FP,那么 ABI 根本就无关紧要。 ABI 用于链接器。
  • 在这种情况下,我的代码无法编译,因为 basic_string 标头声明了 strtof 和 strol 但这些函数并未在代码中的任何地方使用。它们当然是由 libstdc++ 提供的。我很高兴 -msoft-float 仅适用于翻译单元。事实上,这正是我想要和期待的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多