我正尝试按照 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/