指令基础
指令基础
Branching
除了加载或存储,
例如,可以通过查找两个寄存器中的或来实现类似
Cycles
我们都熟悉以兆赫兹或千兆赫兹(每秒数百万或数亿个周期)给出的计算机速度。之所以称为时钟速度,是因为它是计算机内部时钟的脉动速度。
在处理器内使用脉冲以保持其内部同步。在每个滴答声或脉冲时,可以开始另一种操作;就像时钟拍打鼓的人一样,使划船者的桨保持同步。
Fetch, Decode, Execute, Store
执行一条指令包括一个特定的事件周期。提取,解码,执行和存储。例如,要在
-
提取:将指令从内存中获取到处理器中。
-
解码:内部解码它要做的事情(在本例中为
add ) 。 -
执行:从寄存器中获取值,然后将它们实际相加
-
存储:将结果存储回另一个寄存器(Retiring the instruction
) 。
CPU 内部结构
在内部,

您可以看到指令进入并被处理器解码。
寄存器文件是
算术逻辑单元(Arithmetic Logic Unit, ALU)是
地址生成单元(Address Generation Unit, AGU)处理与高速缓存和主存储器的对话,以将值获取到寄存器中,以供
Pipeling
正如我们在上面看到的,当
另一个比喻可能是将管道想象为填充大理石的软管,除非大理石是
但是,分支指令会对这种模型造成严重破坏,因为它们可能会或可能不会导致执行从另一个地方开始。如果您正在流水线工作,则基本上必须猜测分支将走的路,因此您知道将哪些指令带入管道。相反,如果处理器的预测不正确,则一切正常。相反,如果处理器的预测不正确,则会浪费大量时间,必须清理管道并重新启动。此过程通常称为管道冲洗,类似于必须停止并清空软管中的所有弹珠。
Reordering
实际上,如果
1: r3 = r1 * r2
2: r4 = r2 + r3
3: r7 = r5 * r6
4: r8 = r1 + r7
指令
但是,在编写非常底层的代码时,某些指令可能需要一些有关操作顺序的安全性。我们称这种需求记忆语义。如果您需要获取语义,这意味着对于此说明,您必须确保所有先前说明的结果均已完成。如果您需要发布语义,则是说此之后的所有指令都必须查看当前结果。另一个更为严格的语义是内存屏障或内存屏障,它要求操作在继续之前已提交给内存。
在某些体系结构上,处理器可以为您保证这些语义,而在另一些体系结构上,则必须明确指定它们。尽管您可能会看到这些术语,但大多数程序员无需直接担心它们。
CISC v RISC
划分计算机体系结构的常见方法是复杂指令集计算机(CISC)和精简指令集计算机(RISC
-
尽管
RISC 使汇编编程变得更加复杂,但是由于几乎所有程序员都使用高级语言,而将汇编代码的生成工作留给了编译器,因此其他优点胜过了这个缺点。 -
因为
RISC 处理器中的指令要简单得多,所以芯片内部有更多的寄存器空间。从内存层次结构中我们知道,寄存器是最快的内存类型,最终所有指令都必须对寄存器中保存的值执行,因此在其他条件相同的情况下,更多的寄存器将导致更高的性能。 -
由于所有指令都在同一时间执行,因此可以进行流水线操作。我们知道流水线化要求将指令流不断地输入到处理器中,因此,如果某些指令花费很长时间而另一些指令却不需要,流水线就变得很复杂,无法有效执行。
EPIC
在本书的许多示例中都使用过的
传统上组织进入的指令流是硬件的工作。程序按顺序发布指令;处理器必须向前看,并尝试做出有关如何组织传入指令的决定。
因此,订购指令的逻辑可以从处理器转移到编译器。这意味着编译器编写者需要更聪明地尝试为处理器找到最佳的代码顺序。由于处理器的许多工作已移交给编译器,因此处理器也得到了显着简化。