标准数学函数在不同 CPU 上的再现性

2024-05-26

我正在做一个需要大量数学计算的项目。打开新的测试机后,我注意到很多测试都失败了。但同样重要的是要注意,测试在我的开发机器以及其他开发人员的某些机器上也失败了。经过跟踪值并与旧机器的值进行比较后,我发现一些功能(此时我只发现cosine)math.h 有时会返回略有不同的值(例如:40965.8966304650828827e-01 和 40965.8966304650828816e-01,-3.3088623618085204e-08 和-3.3088623618085197e-08).

New CPU:英特尔至强金牌 6230R(Intel64 系列 6 型号 85 步进 7)

Old CPU:确切型号未知(Intel64 Family 6 Model 42 Stepping 7)

My CPU:英特尔酷睿 i7-4790K

测试结果不取决于Windows版本 (7 and 10进行了测试)。

我尝试使用与标准库静态链接的二进制文件进行测试,以排除为不同进程和 Windows 版本加载不同库的情况,但所有结果都是相同的。

使用 /fp:precise 编译的项目,切换到 /fp:strict 没有任何改变。

使用 Visual Studio 15 中的 MSVC:19.00.24215.1(适用于 x64)。

如何使计算完全可重现?


由于您使用的是 Windows,我很确定不同的结果是因为 UCRT 在运行时检测 FMA3(融合乘加)指令是否可用于 CPU,如果是,则在余弦等超越函数中使用它们。这给出了结果略有不同 https://stackoverflow.com/a/29086451/3740047。解决办法就是拨打电话set_FMA3_enable(0);在你的一开始main() or WinMain()功能,如描述的here https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/get-fma3-enable-set-fma3-enable?view=msvc-170.

如果您希望在不同操作系统之间也具有可重复性,事情就会变得更困难甚至不可能。参见例如this https://randomascii.wordpress.com/2013/07/16/floating-point-determinism/博客文章。

作为对“你应该使用一些宽容”的评论的回应,我不同意将此作为一般性声明。当然,有许多应用程序都需要采用这种方法。但我确实认为它can是获得完全相同的浮点结果的合理要求对于某些应用,至少在使用同一操作系统时(在本例中为 Windows)。事实上,我们也遇到了同样的问题set_FMA3_enable不久以前。我是一名交通模拟软件开发人员,诸如 10^-16 之类的微小差异经常会累积并最终导致完全不同的模拟结果。当然,人们应该使用不同的种子运行多次模拟并对所有种子进行平均,从而使不同的行为与最终结果无关。但是:有时客户会在特定种子的特定模拟时刻遇到问题(例如应用程序崩溃或实体的不正确行为),并且由于 CPU 不同而无法在我们的开发人员计算机上重现它,这使得更难诊断并解决问题。此外,如果测试系统由较旧和较新的 CPU 混合组成,并且测试用例未绑定到特定资源,则意味着有时测试可能会毫无理由地出现偏差(片状测试)。这当然是不希望的。要求精确的再现性也使编写测试变得更加容易,因为您不需要启发式阈值(例如样本数量的公差或一些猜测值)。此外,我们的客户希望特定版本的程序的结果保持稳定,因为他们将其流量网络校准(或多或少......)为真实数据。这有点值得怀疑,因为(再次)人们实际上应该关注平均值,但现实中的天真期望通常会获胜。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准数学函数在不同 CPU 上的再现性 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 按成员序列化

    我已经实现了template
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 机器的最大 TCP 连接数

    我正在 NET 中创建一个 Windows 服务 N 个客户端可以连接到该服务 该服务启动 TCP 侦听器并接受客户端连接 我面临的问题是我只能打开 10 个到该服务的连接 Listener AcceptTcpClient 方法仅接受 10
  • PHP:限制 foreach() 语句? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何限制 foreach 语句 假设我只希望它运行前 2 个 eaches 或其他什么 方法有很多 一种是使用计数器 i 0 foreac
  • 如何将外部程序集的类型添加到工具箱控件? (WPF)

    我正在尝试在我的 WPF 应用程序中执行类似的操作 ToolboxControl ctrl new ToolboxControl Assembly assembly Assembly LoadFile file var category n
  • 如何在控制台中访问 Angular2 组件特定数据?

    有没有办法在控制台中访问 Angular2 特定组件的特定数据以进行调试 就像 Angular1 能够在控制台中访问其组件值一样 更新4 0 0 StackBlitz 示例 https stackblitz com edit angular
  • 插入耳机时有什么方法可以强制音频通过扬声器吗?

    我已经尝试过推荐的 setSpeakerphoneOn true 以及不推荐的 AudioSystem setForceUse AudioSystem FOR MEDIA AudioSystem FORCE SPEAKER 但两者都不起作用
  • $httpBackend .whenGet 不是 Angular 中的函数

    我正在尝试创建一个虚拟服务来获取 Angular 中的数据 我正在使用 ngMockE2E 我的 Mock 代码如下所示 function use strict var app angular module productResourceM
  • 使用 awk 解析日志文件

    我尝试使用以下代码解析日志文件 if line match then awk 2 vFiler echo vFiler 解释 有一些行以这样的模式开头 或 vol 后跟名称 我想找到所有以 或 vol 并将后面的字符串设置为等于变量 但我真
  • .htaccess 中 PDF 和图像文件的规范标题链接

    我正在尝试为我的网站上的许多 PDF 和图像文件设置 Canonical 链接 文件夹结构示例 index php docs file pdf folder1 file pdf folder2 file1 pdf file2 pdf img
  • 如何在 Android 中实现 React Native UI 组件方法

    我很清楚 对于react native本机模块 我们可以使用 ReactMethod导出一个方法并从 JSX 调用它 但是我们如何在 React Native 原生 UI 组件中做同样的事情呢 在文档中我只看到 ReactProp被提及 如
  • Excel 公式或 VBA:在具有 2 列条件的单独表中查找匹配的地址 - 无辅助列

    我需要公式结构方面的帮助 我有2张桌子 我想找到 a 列和 b 列相等的匹配项并获取表 2 中的地址 它们将是唯一的条目 例如 项目信息表 A B C 1 Name Company Project 2 Chris Evans Apple I
  • “服务 X 的应用程序端点为零”,除非我在代码中添加端点 - 为什么?

    我跟着这篇 MSDN 文章 http msdn microsoft com en us library ms733069 aspx完全创建托管在托管 NT 服务中的 WCF 服务 当我在服务控制台中单击 开始 时 我会在事件查看器中看到以下
  • 什么是冒烟测试?它对我有什么作用?

    我以为我理解烟雾服务器用于持续集成来衡量项目的性能和测试覆盖率 这基本上是正确的吗 对程序进行冒烟测试意味着什么 它是否仅仅意味着持续应用烟雾服务器上定义的测试 以便能够查明特定时间范围内的性能下降情况 这另一个问题 https stack
  • 调整 JTable 大小以适合行数

    我有一个JTable它将动态填充 我希望表始终调整大小以适应行数 我不需要任何滚动 因为表格位于面板中 并且需要打印面板的内容 我试过这个 Dimension d itemsTable getPreferredSize scrollPane
  • 如何使用 YUI Compressor.Net MSBuild 任务 2.3.0.0

    我尝试在网上搜索此问题的解决方案 但似乎很不清楚 听起来人们正在看到这一点 但解决方案似乎对我不起作用 我已从 NuGet 下载并安装 YUICompressor NET MSBuild 2 3 0 0 到我的项目中 我创建了一个 MSBu
  • “struct hack”在技术上是未定义的行为吗?

    我要问的是众所周知的 结构的最后一个成员具有可变长度 技巧 事情是这样的 struct T int len char s 1 struct T p malloc sizeof struct T 100 p gt len 100 strcpy
  • 如何保持 git 存储库的公共和私有版本同步?

    我正在 Github 上发布一个开源 Rails 应用程序 可能是 MIT 许可证 我还想维护一个项目的私人分支 分支 我们将使用它作为付费服务的一部分 在这种情况下组织存储库的最佳方式是什么 而且 当我有两个项目的更新时 如何保持项目同步
  • 应用示例,使用Android备份服务

    您知道任何 Android 应用程序 开源 如果可能的话 它使用安卓备份服务 http developer android com guide topics data backup html 我需要有关如何在实际应用程序中使用备份服务的示例
  • Objective C 中最好的多线程方法?

    我正在开发一个 iPad 应用程序 目前正在努力寻找多线程的最佳方法 让我用一个简化的例子来说明这一点 我有一个包含 2 个子视图的视图 一个目录选择器和一个包含所选目录中所有图像缩略图的图库 由于 下载 和生成这些缩略图可能需要相当长的时
  • 如何使用 jquery live 停止事件冒泡?

    我试图停止一些事件 但 stopPropagation 不适用于 实时 所以我不知道该怎么做 我在他们的网站上找到了这个 现场活动不会在 传统方式 不能 使用 stopPropagation 停止或 停止立即传播 例如 以两次点击事件为例
  • 标准数学函数在不同 CPU 上的再现性

    我正在做一个需要大量数学计算的项目 打开新的测试机后 我注意到很多测试都失败了 但同样重要的是要注意 测试在我的开发机器以及其他开发人员的某些机器上也失败了 经过跟踪值并与旧机器的值进行比较后 我发现一些功能 此时我只发现cosine ma