在用C\C++编写的代码的上下文中的乱序与有序执行

cel*_*vek 9 c c++ cpu-architecture

谁能解释一下(用简单的英语)无序与有序执行?我正在阅读一些理论文本,我觉得我无法理解它.C\C++上下文中的一个小例子可能会有所帮助.有关多核处理器和多线程的特性有哪些?

Hea*_*utt 20

乱序执行是创建微处理器的工程师使用的技术.结果会影响微处理器执行机器指令的方式,我们通常使用"汇编语言"编写.

重要的是要意识到乱序执行不是程序员实现的 - 它是微处理器上的一种机制.程序员可能会编写汇编代码,巧妙地使用特定的实现,但是在后来的微处理器上编写的相同代码可能无法从中获益,因为处理器的设计无序执行可能会有所不同.

有了这个序言,这里是一个潜在的无序执行的例子:

  • 假设我们有一个可以同时执行两条指令的微处理器.
  • 指令访问同一组寄存器,因此同时执行两条指令的能力既不是多核也不是多线程.
  • 如果指令更改了寄存器,则它不能与读取或写入该寄存器的指令同时执行 - 因为中间结果不可用且寄存器将收到错误的结果.
  • 某些示例程序包含以下x86汇编指令:

    1) mov eax, 0
    2) mov ebx, 1
    3) mov edx, 2
    4) inc edx
    5) mov ecx, 3
    
    Run Code Online (Sandbox Code Playgroud)

在第一个时隙期间,指令(1)和(2)一起执行,因为(2)不依赖于(1)的结果.

在第二时隙期间,微处理器确定(3)和(4)不能一起执行 - (4)使用在指令(3)完成之前edx不能正确设置的值2.

可以通过以下几种方式构建微处理器来处理这个问题:

  1. 处理器可以"停止"或"流水线停顿"并且在该时隙仅执行单个指令(3).然后指令(4)将作为下一个时隙的一部分执行,可能与(5)同时执行.

  2. 处理器可以"无序"执行指令而不是(4).在这个例子中,指令(3)和(5)可以同时执行,因为(5)不依赖于(3)或(4)的结果,并且(4)不会因执行(5)而不正确). 因此,(5)可以相对于(4)无序地执行.

值得注意的是,关于无序执行的固件决定是由微处理器内部的晶体管和微代码完成的.

其他有价值的相关主题包括超标量发送,投机执行以及异常提升或提升.


Pot*_*ter 5

程序由内存中的一系列指令组成.处理器按顺序读取指令并执行它们.对于用户,它们似乎按顺序执行.但是,处理器可以通过及时重新排序来加速执行.这有帮助,因为某些指令比其他指令慢,而某些快速指令可能不需要前面的慢速指令的结果.

这是C的一个片段.它并没有真正说明,因为允许编译器在进入CPU之前对操作进行重新排序,但我们可以假设它不是为了参数.

int can_reorder() {
    int a = 4, b = 3;
    int c = a + b; // fast instruction
    int d = a / b; // slow instruction
    return c + a; // fast instruction may complete before division
}
Run Code Online (Sandbox Code Playgroud)

多线程是完全正交的.(几乎)线程A中没有指令取决于线程B中指令的结果,因此CPU可以自由选择执行给定周期中给定执行单元中哪个线程更方便.