RISC / CISC指令执行多少个时钟周期?


13

根据Harris和Harris的《数字设计和计算机体系结构》,有几种实现MIPS处理器的方法,包括以下几种:

所述单周期微架构执行在一个周期的整个指令。(...)

多周期微架构在一系列更短的周期执行的指令。(...)

流水线微架构适用于流水线单周期微架构。

架构通常分为RISC或CISC。从RISC与CISC

RISC处理器仅使用可以在一个时钟周期内执行的简单指令。

由于MIPS是RISC体系结构,因此我对上述定义感到困惑,想知道它们之间是否没有任何矛盾。进一步来说:

  1. 如果可以将RISC指令划分为更短的周期(提取,解码等),那么如何说仅需一个时钟周期即可执行整个指令?执行每个步骤都不需要一个时钟周期吗?
  2. 它是否真的需要一个时钟周期执行一个RISC指令?例如,如果发生高速缓存未命中并且处理器必须等待慢速DRAM,会发生什么情况?这不应该使指令的执行时间延长很多吗?
  3. 一个指令周期到底是什么?是一条指令完成所花费的时间(即一个/多个时钟周期)吗?
  4. 一条CISC指令在时钟/指令周期中需要花费多长时间?

2
通常不少于一个:-)。
罗素·麦克马洪

Answers:


22

RISC和CISC的实际定义是如此混乱和模糊,现在它们几乎毫无意义。现在,最好将它们更多地考虑为“哲学”,因为CISC架构具有更丰富的指令集和更强大的单独指令(例如DIV等),而RISC指令集则是无骨且快速的,并留给编译器来实现复杂的操作。甚至据称CISC指令集(如x86)都被转换为Intel和AMD芯片中的内部指令,并且实现得更像RISC处理器。要回答您的问题:

  1. 最初的学术RISC处理器(也许我认为可能是第一个商业版本)确实确实每个周期执行一条指令,包括获取和解码。这是可能的,因为数据路径非常干净,因为每个阶段的操作都简单且定义明确。(这里的权衡只能通过这种方式实现非常简单的指令)。一旦进入现实世界,事情就会变得模糊。诸如流水线和超标量体系结构之类的事情使简单的RISC / CISC二分法变得不可能。

  2. 原始的RISC芯片尝试每个周期执行一条指令,并且如果寄存器文件中有可用数据,它们也可以执行。当然,如果处理器必须使用DRAM,则需要更长的时间。RISC是关于“尝试”每个周期执行一条指令。

  3. 一个指令周期是指两次提取之间所花费的时间。

  4. 在很大程度上取决于指令和指令集的体系结构。即使在CISC架构中,某些指令也可以非常快速地执行(例如,向左或向右移位)。有些执行速度非常慢(10s或更多的周期)。VAX体系结构(可能是CISC哲学的顶峰)具有非常复杂的指令。顺便说一句,CISC体系结构通常比RISC体系结构更易于组装,因为它几乎就像一种高级语言!


5

简短的答案

  1. 解码和执行指令的步骤与上一条指令的下一步并行执行。这种技术称为流水线。请参阅下面的在RISC处理器上。

  2. 由于等待状态和加载/存储操作花费时间而不是寄存器到寄存器的等待状态和所花费的时间,单周期RISC体系结构通常平均每个周期少于一条指令。延迟插槽为您提供了一个体系结构挂钩,可以让您重新获得一些时间。请参阅下面的在RISC处理器上。

  3. 指令周期是执行一条指令所需的时间长度。这将随体系结构和(在某些情况下)说明而变化。例如,关于MIPS R2000 / 3000之类的大多数说明都需要一个周期。涉及内存访问(加载/存储,分支)的指令需要一个以上的周期,尽管延迟插槽表示您可以在延迟插槽中执行其他操作(可能只是NOP)。非流水线架构可以具有几个时钟周期的指令周期,通常随寻址模式而变化。请参阅下面的关于RISC处理器,传统CISC体系结构硬连线体系结构

    多问题设计可以通过并行执行多个指令来在某种程度上模糊此概念。

  4. 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芯片的实际吞吐量可能在很大程度上取决于内存访问模式的效率。整本书都针对优化代码而写,这本身就是一个复杂的话题。


3

对学生来说这是一种简化。

每个不平凡的处理器都是流水线。一端有一个预取单元,用于铲除指令,中间有多个执行单元,它们在进行实际工作,而发行单元负责声明对寄存器或存储器的写操作完成后的指令。如果有多个执行单元(例如,整数ALU,浮点ALU和向量单元),则有可能在每个时钟周期发出(有时称为“退休”)多个指令。CPU如何在每个周期内交付多个指令?在这方面有更多细节。

如您所说,如果存在缓存未命中延迟怎么办?英特尔超线程是一种新颖的解决方案:两个CPU状态寄存器,一个控制逻辑和发布单元。一个虚拟CPU停止运行后,立即切换到另一个虚拟机的状态。(这本身就是过度简化)

其结果是现代CPU手册给出了很多模糊的指令时序,并且例如,如果您试图从不应该具有此功能的硬件实时输出视频,则很难编写出周期精确的时序代码。

(对“一条CISC指令在一个时钟/指令周期中需要多长时间?”的具体答案是“在制造商的参考手册中查找,并且每条指令都有定时”)


0

其他人已经写了很多很好的材料,所以我的回答要简短:在过去(1980年在这里),当时的8位处理器(6800、6502,Z80、6809等)被考虑在内。 CISC。某些指令可以在2个时钟周期内执行,但是这些指令很简单,例如设置/清除处理器状态寄存器中的标志位。其他指令可能需要2到6个甚至9个时钟周期才能执行。这些处理器具有一些功能非常强大的指令,Z80具有一些内存块清除指令,这些指令会将相同的值写入内存中的一系列字节中,从而有效地在一条指令中清除了一个大块,只需设置几个寄存器并执行LDIR指令(加载,递增和重复)。

6502处理器(来自内存)具有56条指令,但13种寻址模式可创建功能强大的指令集。

RISC进行了很长时间,并采用了不同的方法,它具有少量指令,所有指令都在一个时钟周期内执行。这些程序往往更长一些,并且占用更多的内存,因为这些指令执行的操作很简单,因此您需要更多的指令。

如果我没记错的话,RISC架构的首次尝试是晶片机还是Acorn Risc处理器?


可以说,第一个流水线RISC类型的体系结构是Seymour Cray设计的CDC 6600。在RISC一词被广泛使用之前的几十年。MIPS,ARM和其他一些RISC微处理器设计可以追溯到1980-1985年,第一批使用这些芯片的商用硬件在1980年代中期问世。
ConcernedOfTunbridgeWells

单个晶片机芯片的速度非常快,但与通常与RISC芯片关联的架构类型不同。 en.wikipedia.org/wiki/Transputer#Architecture
ConcernedOfTunbridgeWells,

我在一个防静电盒中有几个晶片机,只是一个历史微处理器集合的一部分。从未使用过它们,那时候尝试它们会很有趣。
院长

@ConcernedOfTunbridgeWells我刚刚看过CDC 6600指令集。尽管设计似乎体现(并预期)了RISC的某些原理,但浮点除法指令需要29个周期来执行!而且,除法指令的包含也违反了典型的RISC原则,但是感谢您的有趣评论!
crgrace 2015年

RISC的主要属性是流水线指令的获取/解码/执行机制和加载存储体系结构(即没有寻址模式,具有隐式内存访问以计算地址)。实际上,某些RISC指令集(例如IBM POWER)实际上很大,但仍使用装入/存储方法来确保一致的执行时间。
ConcernedOfTunbridgeWells
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.