我相信,如果它困扰着你,那么任何问题都是愚蠢的。我有这个关于管道衬里的问题?
什么是管道内衬?
理论说:“使用流水线,CPU 在第一条指令完成之前开始执行第二条指令。流水线导致更快的处理,因为 CPU 不必等待一条指令完成机器周期。”
我的问题是考虑我正在使用单处理器系统,一次只能执行一条指令,当我的 CPU 忙时,如何同时执行获取下一条指令的操作?如果我缺乏概念上的清晰度,请给我一些启发。如果有单独的硬件可以同时处理,那是什么?请解释。
我相信,如果它困扰着你,那么任何问题都是愚蠢的。我有这个关于管道衬里的问题?
什么是管道内衬?
理论说:“使用流水线,CPU 在第一条指令完成之前开始执行第二条指令。流水线导致更快的处理,因为 CPU 不必等待一条指令完成机器周期。”
我的问题是考虑我正在使用单处理器系统,一次只能执行一条指令,当我的 CPU 忙时,如何同时执行获取下一条指令的操作?如果我缺乏概念上的清晰度,请给我一些启发。如果有单独的硬件可以同时处理,那是什么?请解释。
流水线与单处理器系统与多处理器系统无关。它与认真思考在硬件中在机器上执行单个指令所采取的步骤有关。
想象一下,您要实现 MIPS 的“立即加法”指令,addi $d, $s, $t
它将存储在名为 的寄存器$s
中的整数与$t
直接编码在指令中的整数相加,并将结果存储在名为的寄存器中$t
。想想你需要采取哪些步骤来做到这一点。这是分解它的一种方法(仅作为示例,这不一定对应于真实硬件):
addi
指令,就解析出源寄存器和目标寄存器以及要添加的文字整数。现在请记住,所有这些都需要在硬件中构建,这意味着与这些事物中的每一个都相关联的物理电路。如果您一次执行一条指令,这些电路中有四分之三将处于空闲状态,一直无所事事。流水线利用了这一观察:如果处理器需要addi
连续执行两条指令,那么它可以:
所以现在,即使每条指令需要 4 轮处理,处理器总共只用了 5 轮就完成了两条指令。
由于有时您必须等待一条指令完成才能知道下一条指令(甚至下一条指令是什么)该做什么,因此这变得复杂,但这是基本思想。
确实有用于获取的单独硬件。有一大堆独立的硬件,排列在管道中。每个部分同时执行单独指令的一部分。在每个时钟沿,一个阶段的结果会传递到下一个阶段。
我不会试图将为期一年的大学课程塞进这个文本框,而是指向一本教科书,该教科书清楚地详细解释了整个主题:
想想那些你看到工厂在运作的地方是如何制作的或其他电视节目。想想你可能读过或看到的关于汽车工厂的事情。“汽车”从框架或车身开始在工厂中移动,并在移动时添加东西。如果你坐在建筑物的外面,你会看到轮胎、油漆罐、电线和钢卷进入建筑物,并且源源不断的汽车驶出。仅仅因为它是单个(单处理器)工厂并不意味着它不能拥有装配线(管道)。具有流水线的单处理器实际上并不一定一次执行一条指令,就像工厂中的汽车一次制造一辆汽车一样。那辆车的一点点构造发生在它经过的每个车站,
管道中典型的简单阶段是获取、解码和执行三个阶段。执行一条指令需要三个时钟,最少(由于 I/O 速度慢,通常更多)可以说管道中的三个阶段。虽然指令 a 处于执行阶段,但您有指令 b 正在解码并且指令 c 正在获取。回到汽车厂,他们可能会生产“每 7 分钟一辆车”,这并不意味着制造一辆汽车需要 7 分钟,制造一辆汽车可能需要一周时间,但他们每 7 分钟就开始一辆新的,平均每个车站的时间是这样的,你可以每 7 分钟推出一个。同样在这里,使用管道并不意味着您可以以处理器的时钟速率获取、解码和执行所有三个步骤。就像工厂一样,它更像是一个普通的东西。如果您可以以处理器时钟速率馈送流水线中的每个阶段,那么它将在每个时钟完成一条指令(如果设计为这样做的话)。这些天来,您无法快速提供数据/指令,并且存在管道停顿等,这导致您必须重新开始或放弃一些进度并备份一些。
Pipelining is simply taking an assembly line approach to executing instructions in a processor.
我认为当代码中有分支时使用它,并且逻辑预测将采用哪个分支,并将该分支的指令预加载到缓存中。如果预测被证明是错误的,那么它需要丢弃这些指令并加载备用指令,从而导致损失。但我相信代码中的某些模式可以使预测更频繁,特别是对于一遍又一遍地重复模式的现代编译器。
我不了解实际的实现,但我并不认为需要额外的硬件,尽管它对于最佳速度很有用。