不同的 CPU 内核是否会对相同的浮点运算给出不同的结果?

Could different CPU cores give different results of the same floating point operation?

提问人:Physician 提问时间:3/5/2023 最后编辑:TylerHPhysician 更新时间:11/15/2023 访问量:125

问:

在正在运行的程序中,在同一 CPU 上从一个内核切换到另一个内核,是否会产生编码相同浮点算术运算的同一组值和指令的不同结果?

我之所以问这个问题,是因为我有一个程序,它运行的是整数到双倍的固定计算,结果在运行几秒钟后发生了变化,并将新结果保留了几秒钟。结果的变化非常小,但我对此没有任何解释。

  • 这是确切的代码。
  • 请记住,这是一个使用 winapi 的窗口应用程序。
  • 这是一个 HID 输入读数的测试项目。
  • 正在测试的数据是 BYTE winapi 类型,它只是一个无符号字符。
  • 在向 Windows 的 RawInputAPI 注册后,它会定期从轮询 HID 接收值。
  • 它取值从 0 到 255;
  • 我所做的只是在 -1.0 到 1.0 范围内将其转换为双倍;

法典:

BYTE& InputValue = DIH_Data.bRawData[2];
int ivalue = 0;
double value = 0.0;
ivalue = InputValue - 128;
value = ((double)ivalue) / 128.0;
OutputDebugString(std::to_wstring(value).c_str());
OutputDebugString(L"\n");

结果:

  • 所有读数都非常一致,符合预期;
  • 但是,我有以下两个结果:
    • 第一读数:0.648430
    • 其他读数:0.648438
  • 这些似乎都来自255个输入值中的83个。我不知道为什么他们有不同的读数。
C++ 多线程 浮点 CPU 内核

评论

3赞 Jérôme Richard 3/5/2023
不可以,只要程序写得很好(例如,没有未定义的行为),并且您不使用异国情调的 CPU 硬件。请注意,硬件并未完全免受物理问题(如单个事件影响或电子问题)的影响。不过,这种情况非常罕见,特别是如果您的 CPU 已正确冷却并且您使用 ECC 内存(在执行长时间运行的程序的计算机中非常关键)。软件错误很可能是问题所在,但如果没有完整的代码分析,就不可能说。
2赞 Jérôme Richard 3/5/2023
我假设该程序是确定性的,也就是说,它不使用当前时间来计算随机种子之类的东西,或者不执行任何系统调用(例如。IO),这可能会导致不同的结果。顺便说一句,影响结果的常见软件错误通常是缓冲区溢出或竞争条件
0赞 Solomon Slow 3/5/2023
什么计算会产生不可重复的结果?是迭代的吗?你可以在这里展示什么吗?
1赞 Jérôme Richard 3/6/2023
也可能是打印问题。我建议您打印二进制表示,以便进行检查。请注意,舍入模式可以手动调整(请参阅:stackoverflow.com/questions/6867693)。AFAIK,它与进程或线程相关联,因此调度不应影响它(否则实际上会很危险),但外部库可能会更改它。
1赞 chux - Reinstate Monica 3/6/2023
@Physician 你是对的。

答: 暂无答案