首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测平台间浮点行为的差异

如何检测平台间浮点行为的差异
EN

Stack Overflow用户
提问于 2019-03-22 13:11:12
回答 2查看 212关注 0票数 2

我可以执行哪些检查来确定它们在两个硬件平台的浮点行为中有什么不同?

验证IEE-754的遵从性或检查已知的bug可能就足够了(可以解释我观察到的输出的差异)。

我通过/proc/cpu查看了CPU标志,并且都声称支持SSE2:

但它们看起来很难使用。我已经构建了TestFloat,但我不知道该如何处理它。主页上写着:

不幸的是,TestFloat的输出并不容易理解。要负责任地使用TestFloat,就需要对IEEE有详细的了解。

理想情况下,我只想要一个或两个程序或一些简单的配置样式检查,我可以运行和比较两个平台之间的输出。

理想情况下,我会将其转换为配置检查,以确保在一个在配置时而不是在运行时异常行为的平台上编译非便携代码的尝试。

背景

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

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

在这两台机器上本地编译的代码在另一台机器上运行,但是对于一种测试,其行为取决于在哪台机器上运行代码。

Clarification --在机器A上编译的可执行文件在复制到机器B上运行时,就像在机器B上编译的可执行文件一样,而visa则相反。

它可能是一个未初始化的变量(尽管在val研中什么都没有出现)或许多其他事情,但我怀疑原因可能是浮点的不可移植性的使用。也许一台机器对浮点程序集的解释不同于另一台机器?实施者已经证实他们知道这件事。这不是我的代码,我也不想完全重写它来测试它。不过,重新编译是可以的。我想验证我的假设。

相关问题中,我正在研究如何启用软件浮点。这个问题是从另一个方面处理这个问题。

更新

我在配置检查的道路上尝试了以下基于@chux的提示。

代码语言:javascript
复制
#include <iostream>
#include <cfloat>

int main(int /*argc*/, const char* /*argv*/[])
{
   std::cout << "FLT_EVAL_METHOD=" << FLT_EVAL_METHOD << "\n";
   std::cout << "FLT_ROUNDS=" << FLT_ROUNDS << "\n";
#ifdef __STDC_IEC_559__
   std::cout << "__STDC_IEC_559__ is defined\n";
#endif
#ifdef __GCC_IEC_559__
   std::cout << "__GCC_IEC_559__ is defined\n";
#endif
   std::cout << "FLT_MIN=" << FLT_MIN << "\n";
   std::cout << "FLT_MAX=" << FLT_MAX << "\n";
   std::cout << "FLT_EPSILON=" << FLT_EPSILON << "\n";
   std::cout << "FLT_RADIX=" << FLT_RADIX << "\n";
   return 0;
}

在两个平台上提供相同的输出:

代码语言:javascript
复制
./floattest 
FLT_EVAL_METHOD=0
FLT_ROUNDS=1
__STDC_IEC_559__ is defined
FLT_MIN=1.17549e-38
FLT_MAX=3.40282e+38
FLT_EPSILON=1.19209e-07
FLT_RADIX=2

我还在找可能不一样的东西。

EN

回答 2

Stack Overflow用户

发布于 2019-03-22 16:32:27

OP有两个目标,有点冲突。

  1. 如何检测平台间浮点行为的差异(?)
  2. 我只想要一个或两个程序或一些简单的配置样式检查,我可以运行和比较两个平台之间的输出。

是的,有些差异很容易发现,但有些差异可能非常微妙。

样本底流设定什么时候结果不是不正常?

对于一般问题,没有简单的测试。

建议之一是:

  1. 修改编码目标,以允许名义上的差异。
  2. 查看是否定义了_STDC_IEC_559__,并希望这对您的应用程序来说足够了。考虑到其他各种因素,如FLT_EVAL_METHODFLT_ROUNDS以及优化级别,代码仍然可以兼容,但提供不同的结果,但是程度将更易于管理。
  3. 如果需要超高的一致性,不要使用浮点。
票数 0
EN

Stack Overflow用户

发布于 2019-03-28 11:52:20

我发现了一个名为妄想症的程序,它可以对浮点行为进行一些检查。这是基于威廉·卡汉原始的偏执程序,发现了臭名昭著的奔腾除臭剂。

虽然它没有检测到我的测试系统中的任何问题(因此不足以回答这个问题),但它可能会引起其他人的兴趣。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55300378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档