有人能用简单的英语解释乱序与有序执行吗?我正在阅读一些理论文本,我觉得我无法理解它。 C \ C ++上下文中的一个小例子可能会有所帮助。有关多核处理器和多线程的特性有哪些?
答案 0 :(得分:19)
乱序执行是创建微处理器的工程师使用的技术。结果会影响微处理器执行机器指令的方式,我们通常使用“汇编语言”编写。
重要的是要意识到乱序执行不是程序员实现的 - 它是微处理器上的一种机制。程序员可能会编写汇编代码,巧妙地使用特定的实现,但是在后来的微处理器上编写的相同代码可能无法从中获益,因为处理器设计的无序执行可能会有所不同。 / p>
使用该序言,这是一个潜在的无序执行的例子:
某些示例程序包含以下x86汇编指令:
1) mov eax, 0
2) mov ebx, 1
3) mov edx, 2
4) inc edx
5) mov ecx, 3
在第一个时隙期间,指令(1)和(2)一起执行,因为(2)不依赖于(1)的结果。
在第二个时隙期间,微处理器确定(3)和(4)不能同时执行 - (4)使用edx
的值,该值将无法正确设置为2
指令(3)完成。
可以通过以下几种方式构建微处理器来处理这个问题:
处理器可以“停止”或“流水线停顿”并在此时隙仅执行单个指令(3)。然后指令(4)将作为下一个时隙的一部分执行,可能与(5)同时执行。
处理器可能“无序”执行指令而不是(4)。在这个例子中,指令(3)和(5)可以同时执行,因为(5)不依赖于(3)或(4)的结果,并且(4)不会因执行(5)而不正确)。 因此,(5)可能相对于(4)无序执行。
值得认识到,关于无序执行的固件决策是由微处理器内部的晶体管和微代码完成的。
其他有价值的相关主题包括超标量发送,投机执行以及异常提升或提升。
答案 1 :(得分: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
}
多线程完全正交。 (几乎)线程A中没有指令取决于线程B中指令的结果,因此CPU可以自由选择执行给定周期内给定执行单元中哪个线程更方便。
答案 2 :(得分:1)
让我们说我们有一个处理器。它做了一个字节循环。让我们调用传入的字节周期指令H E A F B D C G.处理器可以在它们不相关时一次执行2条指令。但是它无法知道指令的总传入量。相反,它有一个窗口,它可以看到传入的字节并尝试对它们重新排序。这是无序处理器的质量。你会明白为什么。
让我们说我们的处理器只能看到前面的3个字节来重新排序它们。最佳的方式就是去过AB CD EF GH。乱序进程(窗口为3)将不再是H EF AB DC G.
因此,如果进程者可以访问所有进程,则需要4个周期才能执行所有指令。因为它可以重新排序一切。如果出现故障(以及3个字节的窗口),则需要5个周期(H EF AB DC G)。如果没有乱序执行,它将是(H E A F B DC G)7个周期。 (DC碰巧按照正确的顺序 - 在处理器的眼中)。
没有处理器并行架构。它会完成所有事情(8个周期)。一次不做多个指令
乱序执行是试图最大化并行执行。
我从这段视频中学到了很多东西: https://www.youtube.com/watch?v=gLsdS0zQ82c
此外,当涉及到mutlicoring时 - 它似乎与乱序执行无关。一个核心处理器仍然可以同时执行多个操作。因此将受益于无序架构。 https://en.wikipedia.org/wiki/Superscalar_processor
使用: 指令级并行