简短的答案
解码和执行指令的步骤与上一条指令的下一步并行执行。这种技术称为流水线。请参阅下面的在RISC处理器上。
由于等待状态和加载/存储操作花费时间而不是寄存器到寄存器的等待状态和所花费的时间,单周期RISC体系结构通常平均每个周期少于一条指令。延迟插槽为您提供了一个体系结构挂钩,可以让您重新获得一些时间。请参阅下面的在RISC处理器上。
指令周期是执行一条指令所需的时间长度。这将随体系结构和(在某些情况下)说明而变化。例如,关于MIPS R2000 / 3000之类的大多数说明都需要一个周期。涉及内存访问(加载/存储,分支)的指令需要一个以上的周期,尽管延迟插槽表示您可以在延迟插槽中执行其他操作(可能只是NOP)。非流水线架构可以具有几个时钟周期的指令周期,通常随寻址模式而变化。请参阅下面的关于RISC处理器,传统CISC体系结构和硬连线体系结构。
多问题设计可以通过并行执行多个指令来在某种程度上模糊此概念。
CISC处理器可以具有花费不同时间长度的指令。时钟周期的确切数目取决于体系结构和指令。在CISC ISA上采用的时钟周期数量不一,这是它们难以构建为高流水线体系结构的原因之一。请参阅下面的传统CISC体系结构。
更长的答案
对于单个问题MIPS,SPARC或其他CPU,所有(对于第一近似值)指令都将在一个周期内发出,尽管它们可能具有称为“延迟插槽”的内容。
在RISC处理器上
在这种情况下,单发布CPU是指CPU不会像现代CPU那样进行任何动态依赖关系分析和指令的并行发布,即它们只有一个执行单元来执行从备忘录中读取它们的顺序。稍后再详细介绍。
大多数较早的RISC处理器都是单问题设计,并且这些类型仍广泛用于嵌入式系统中。一个32位单问题整数RISC内核可以在大约25,000-30,000个门中实现,因此这种类型的CPU内核具有非常低的功耗和非常小的占用空间。这使得它们容易且便宜地集成到SOC(片上系统)产品中。
RISC CPU设计采用流水线技术-指令的处理分多个阶段进行,每个指令在每个时钟周期都通过管道向下传递到下一级。在大多数情况下,单问题流水线CPU将在每个时钟周期执行接近一条指令的指令。
一些架构具有分支指令或从存储器中加载/存储的指令,其中代码可以看到存储器访问所花费的额外周期。
例如,在SPARC V7 / V8设计中,实际执行分支之后的下一条指令将在分支本身发生之前执行。通常,您会在分支后的插槽中放入一个NOP,但是如果您发现有用的东西,则可以在其中放入另一个指令。
MIPS R2000 / R3000体系结构在加载/存储指令中具有类似的延迟槽。如果您从内存中加载了一个值,则该值实际上不会在另一个周期中出现在寄存器中。您可以在插槽中放入NOP或执行其他操作,如果您发现有用的操作与您刚发出的加载操作无关,则可以这样做。
如果内存比CPU慢(通常是这种情况),则可能会在内存访问中获得其他等待状态。等待状态会将CPU冻结一个或多个时钟周期,直到完成内存访问为止。在实践中,这些等待状态和额外的内存访问时间意味着单问题CPU设计平均每个时钟周期少于一条指令。延迟插槽为您提供了一些可能的机会,可以在发生内存操作时通过执行一些其他指令来优化代码。
传统CISC处理器
CISC处理器的设计可以使指令花费不同的时间长度。通常,他们会直接在硬件中实现更复杂的指令,而这些指令必须在RISC CPU上的软件中完成。
直到M68K和Intel 386为止,大多数大型机体系结构和几乎所有PC设计都是传统的微编码CISC CPU。与RISC CPU相比,这些设计的每时钟速度更慢,并且使用的门更多。
微码
在此处的仿真中可以看到微编码架构(MOS 6502)的示例。可以在图像顶部看到微码。
微码控制数据流和在CPU中激活的动作,以执行指令。通过遍历微代码中的步骤,您可以激活CPU的各个部分,通过ALU移动数据或执行其他步骤。可以在多个时钟周期内协调CPU中的可重用组件以执行一条指令。在6502的情况下,一些流水线操作也可以由微代码执行。
与硬连线芯片相比,微编码设计使用的硅更少,但可能要花费几个时钟周期来完成一条指令。根据设计的不同,这些CPU每条指令将花费不同的时间长度。
硬连线架构
硬连线设计(不一定与微码相互排斥)可以同步执行一条指令,或者可以有自己的协调器来跨多个时钟周期执行某项操作。与同等功能的微码设计相比,它们通常更快,但要付出更多专用硬件的代价,因此实现起来更昂贵。
一个著名的例子是原始的Amdahl 470/6 CPU,它是某些IBM System / 370型号上CPU的直接替代品。在IBM的370个CPU大量基于微代码的时候,Amdahl CPU是一种硬接线设计。Amdahl CPU大约比他们更换的IBM CPU快3倍。
毋庸置疑,IBM并没有为此感到好笑,这导致了一场法庭之战,最终迫使IBM开放其大型机架构,直到几年前同意书到期为止。
通常,这种硬接线设计仍不像RISC CPU那样快,因为变化的指令时序和格式不能像RISC设计那样提供足够的流水线。
多问题设计
大多数现代CPU是多个问题体系结构,可以在一个线程中一次处理多个指令。该芯片可以对传入的指令流进行动态依赖性分析,并在不依赖于先前计算结果的情况下并行发出指令。
这些芯片的吞吐量取决于代码中可以实现多少并行性,但是大多数现代CPU在大多数代码上平均每个周期要处理几条指令。
现代的Intel和其他x86 / X64 ISA CPU都有一个层,可以将老式的CISC指令集解释为微指令,可以通过流水线RISC样式的多问题内核提供微指令。这会增加一些具有用于流水线设计的ISA的CPU(即RISC体系结构,例如ARM或PowerPC)所没有的开销。
VLIW设计
VLIW设计(也许是最著名的Intel Itanium)从未成为主流架构,但是IIRC上有许多使用这种设计的DSP架构。VLIW设计使一个指令字包含多个并行发出的指令使多个问题变得显式。
它们依赖于良好的优化编译器,这些编译器确定了依赖性和并行性的机会,将指令放入每个指令字可用的多个插槽中。
VLIW体系结构非常适合数值应用,因为矩阵/阵列运算趋向于提供广泛的并行性机会。Itanium在超级计算应用程序中占有一席之地,并且至少有一种超级计算机体系结构-Multiflow TRACE-是使用这种类型的ISA生产的。
内存和缓存
现代的CPU比内存快得多,因此从内存中直接读取会产生数百种等待状态,这些状态会阻塞CPU,直到内存访问完成为止。现在,在多层中进行的缓存将最新使用的内存位置保存在缓存中。由于CPU通常花费大量时间在循环中执行代码,因此这意味着您可以很好地重用最近使用过的内存位置。此属性称为“参考位置”。
在获得参考位置的地方,CPU可以接近最佳速度运行。高速缓存未命中到下一个级别会导致许多等待状态。高速缓存未命中到主内存可能会导致数百次。
因此,CPU芯片的实际吞吐量可能在很大程度上取决于内存访问模式的效率。整本书都针对优化代码而写,这本身就是一个复杂的话题。