gpt4 book ai didi

cpu - 编译器完成的指令重新排序与 cpu 完成的指令重新排序之间有什么关系?

转载 作者:行者123 更新时间:2023-12-05 03:03:04 27 4
gpt4 key购买 nike

好的,所以编译器可以出于性能原因自由地重新排序代码片段。让我们假设一些代码片段,在没有应用优化的情况下直接翻译成机器代码,看起来像这样:

machine_instruction_1
machine_instruction_2
machine_instruction_3
machine_instruction_4
machine_instruction_5

但是一个聪明的编译器决定原来的顺序是非常低效的并且重新排序相同的代码使得结果机器指令的新顺序如下:

machine_instruction_5
machine_instruction_4
machine_instruction_3
machine_instruction_2
machine_instruction_1

到目前为止一切顺利。

这是棘手的部分开始的地方。生成的机器指令将由 cpu 执行,只要保留代码逻辑,cpu 可以出于性能原因以任何它认为合适的方式再次重新排列它们。由于我们正在处理两个“层”的指令重新排序:

  • 第一个,由于编译器优化
  • 第二个,由于cpu乱序执行

是什么让编译时指令重新排序相关? cpu 看到的只是一系列原始机器指令,没有迹象表明编译器执行了任何先前的优化。如果 cpu 引入了它自己的重新排序“层”,为什么它不会使编译器设置的指令顺序无效?基本上,是什么迫使 cpu 尊重编译器优化?编译时重排序和运行时重排序如何“协同”,后者如何补充前者?

最佳答案

在考虑指令执行时,必须考虑的是程序语义。只要遵守这一点,任何顺序都是正确的。具体来说,这是由“依赖性”描述的,它指示某些指令是否需要关于程序正确行为的给定顺序。例如考虑以下程序

1 x <= y+3
2 z <= 2*x
3 w = 5*y
4 y = 2*a

说明 1 和 2 是相关的。如果修改了它们的相对顺序,则程序不符合程序员的要求,并且禁止任何重新排序。由于不同的原因,在 y 被 1 和 3 使用之前,4 不能原封不动地执行。存在不同类型的依赖关系,包括在考虑控制流时。

编译器和硬件尝试重新排序程序以提高效率,同时尊重依赖关系。事实上,他们的行为是互补的。

编译器可以考虑比处理器更大的重组,并使用更复杂的启发式方法来完成重组。编译器可以对程序有很大的了解,并对大部分代码进行重新排序。理论上,如果没有违反依赖关系并且编译器认为它可以提高程序执行,则可以替换距离为 1000 的指令。它可以完全重组代码、展开循环等。相反,处理器具有相对有限的预取指令窗口,可以考虑重新排序,任何重新排列只能涉及关闭指令,并且基于在一个周期内可以完成的简单方法。

但是处理器有很大的优势。它可以进行动态 重新排序并响应随机事件。在给定的时间,它会根据依赖性和数据可用性考虑可以执行哪些指令,并相应地重新排序代码。这是基于动态依赖性的,例如,如果先前依赖指令的结果由于高速缓存未命中而不可用,它将执行其他遵守依赖性的指令。连续运行具有相同输入数据的相同程序可能会导致不同的排序,具体取决于分支预测错误、缓存未命中等。

所以编译器和处理器之间没有竞争,而是高效协作。

关于cpu - 编译器完成的指令重新排序与 cpu 完成的指令重新排序之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54244337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com