c++ - 软件浮点和 x87 或 sse 禁用

标签 c++ gcc floating-point

我正尝试按照 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 中发生的所有事情都是函数返回 float 或 double 。为什么会导致编译失败?

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

背景

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

  • 英特尔(R) 至强(R) CPU E5504
  • 英特尔(R) 酷睿(TM) i5-3470 CPU

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

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

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

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

最佳答案

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

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

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

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

关于c++ - 软件浮点和 x87 或 sse 禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55225910/

相关文章:

GCC 内联汇编 : let compiler decide what register to use for temp value

java - 用Java模拟低精度硬件

c - 如何在 C 中打印 double 据类型

floating-point - 如何在没有下溢的情况下计算对数空间中的总和?

c++ - 如何在arm平台的c程序中调试全局变量损坏?

c++ - 来自 boost Asio deadline_timer 的多个 async_wait

c++ - 需要帮助理解 GCC 给出的 "within a nested template argument list"错误的含义

c - 为什么 malloc 分配的字节数与请求的字节数不同?

c++ - 更快的二进制加法 C++

c++ - 初始化外部变量的用例