【问题标题】:How to disable out of order execution of CPU [duplicate]如何禁用CPU的乱序执行[重复]
【发布时间】:2018-10-24 11:18:38
【问题描述】:

众所周知,现代 CPU 能够同时执行多个命令:https://en.wikipedia.org/wiki/Out-of-order_execution

因此,我们可能会得到如下事实:

当我们执行c++代码时:x = a + b; y = c + d;y = c + d;可能会在x = a + b;之前执行。

我的问题是是否可以禁用 CPU 的乱序执行?

【问题讨论】:

  • 如果功能相同,有什么区别?
  • 请注意,在 CPU 上乱序执行的指令粒度很少会匹配 C++ 等高级语言中的单个语句。另请注意,C++ 编译器本身可能会重新排列语句甚至表达式或表达式的一部分。
  • 至于你的问题,为什么你想做这个?您需要解决的真正问题是什么?用例是什么?这看起来很像XY problem
  • 问题是您为什么要这样做?除非出现任何错误,否则 CPU 仅在新顺序不会产生任何可观察到的影响时才允许重新排序执行。编译器还将重新排序执行,并且比 CPU 执行的乱序执行的程度要大得多。
  • @LieRyan 总是有幽灵/崩溃。 :P:P:P

标签: c++


【解决方案1】:

不,您不能在拥有此类硬件机制时停用它。这就是为您提供性能的原因。这就是 CPU 的设计方式。

C++ 保证的是,您将无法看到您想要的正确顺序与您将得到的结果之间的差异。这也是像英特尔这样的供应商将确保组装的东西。

查看https://www.youtube.com/watch?v=FJIn1YhPJJc&frags=pl%2Cwn 了解 C++ 执行模型。

【讨论】:

  • 因为英特尔是主要的 CPU 供应商而出现故障?
  • 因为我只提到了主要的,而不是所有使用乱序执行的。
【解决方案2】:

您应该关心的只是程序的含义。这不是迂腐,而是整个语言的设计基础。

C++ 程序描述了程序的含义。它不是源代码与计算机真正应该做的事情的一对一映射。

如果你想这样,你将不得不用汇编或一些中世纪的老式语言编写代码,但即便如此,你也很难告诉现代 CPU 不要做所有聪明的事情它的设计目的是为了支持有用的程序。当然,我不知道有任何开箱即用的开关、标志或设置会导致这种情况发生。它会违背 CPU 的架构。

最终,构建和编程差异引擎可能会更好;)

【讨论】:

  • 不,你的程序的意义并不是你应该关心的全部。实际执行可能会产生灾难性后果,例如 Spectre 和 Meltdown。
  • @EricPostpischil 在编写 C++ 时,您应该只关心程序的含义。 Spectre 和 Meltdown 的后果不是 C++ 程序作者的责任,这就是内核补丁修复这些问题的原因。当然,我们可能会提出一些极端情况例外,但它们不是一般规则,我无法想象它们适用于此。
  • 处理器设计缺陷的后果不是 C++ 作者的“责任”的指控并不意味着 C++ 作者询问这些事情、思考后果是完全合理的可能是,了解他们如何影响他们的角色的问题和原因,考虑他们可以提供的缓解措施,即使这不是他们的“责任”,与处理器设计人员进行讨论,以及以其他方式提高他们的专业知识和参与。
  • @EricPostpischil 当然,人们应该询问、思考、学习和推理编译程序将要做什么以及为什么。那太棒了。只是一个人不应该写他们的原始 C++ 代码,认为计算机有义务或应该有义务一次执行他们的源代码行,就像写的一样。理解并接受 C++ 是一种抽象,而你所做的只是指定程序的含义,这一点至关重要。
  • @EricPostpischil 另外,我不同意您使用“指控”一词,它具有非常消极/指责的含义,根本没有必要。让我们保持专业。
【解决方案3】:

您无法在硬件级别(CPU 级别)停用重新排序。

但是,您可以通过使用debug 的优化级别来确保编译器不会重新排序。

这将有助于调试程序,但会使您的代码变慢。不建议在生产代码中使用。

【讨论】:

    【解决方案4】:

    无法从程序中禁用乱序执行,这是Memory Barrier 的众所周知的问题。由于问题后果只出现在多线程程序中,因此您必须使用同步原语来确保执行顺序。

    【讨论】:

    • 竞争条件最多与乱序执行相关。
    • 问题是关于在单个线程中重新排序,而不是关于线程之间的排序。
    • 巧合的是,lfence 也是 x86 上常用的序列化指令,但这并不是内存屏障的真正含义
    • @TobySpeight 以一般方式回答了该问题,包括单线程程序和多线程程序。在单线程程序中没有缺陷。有什么问题?
    • @EuriPinhollow 不,正如您在 Wiki 示例中看到的那样,没有竞争条件,但处理重新排序在第一个线程中显示了意外结果。
    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多