为什么“执行”位于指令集架构中的“内存”之前?

时间:2012-08-20 11:45:29

标签: processor isa

3年前我学习了处理器架构。

直到今天,我无法弄清楚execute在顺序说明中位于memory之前的原因。

执行指令[ mov (%eax) %ebx]时,是否需要不访问内存?

谢谢!

1 个答案:

答案 0 :(得分:7)

让我们记住经典的RISC管道,通常会对其进行研究:http://en.wikipedia.org/wiki/Classic_RISC_pipeline。这是它的阶段:

  • IF =指令提取
  • ID =指令解码
  • EX =执行
  • MEM =内存访问
  • WB =注册回写

在RISC中,您只能使用loadstore来处理内存。并且用于存储器访问指令的EX阶段将计算存储器中的地址(从寄存器文件获取地址,缩放它或添加偏移量)。然后地址将传递到MEM阶段。

你的例子,mov (%eax), %ebx实际上是来自内存的加载而没有任何额外的计算,它甚至可以在RISC管道中表示:

  • IF - 从指令存储器中获取指令
  • ID - 解码指令,将“eax”寄存器作为操作数传递给ALU;记住“ebx”作为WB的输出(在控制单元中);
  • EX - 在ALU中计算“eax + 0”并将结果传递给下一阶段MEM(作为内存中的地址)
  • MEM - 从EX阶段(从ALU)获取地址,转到内存并获取值(此阶段可能需要几个滴答以达到内存并阻塞管道)。将值传递给WB
  • WB - 从MEM获取值并将其传递回寄存器文件。控制单元应将寄存器文件设置为模式:“写入”+“EBX选择”

在真正的CISC指令中情况更复杂,例如add (%eax), %ebx {从T内存加载[%eax]字,然后将T + %ebx存储到%ebx)。该指令需要ALU中的地址计算和加法。这在最简单的RISC(MIPS)流水线中无法轻易表现出来。

第一个x86 cpu(8086)没有流水线,它随时只执行单个指令。但是自80386以来,有6个阶段的管道,这比RISC更复杂。有关其管道的介绍,将其与MIPS进行比较:http://www.academic.marist.edu/~jzbv/architecture/Projects/projects2004/INTEL%20X86%20PIPELINING.ppt

Slide 17说:

  • 英特尔将memEX阶段结合起来以避免加载和停顿,但确实会为地址计算创建停顿
  • mips中的所有阶段都需要一个周期,因为英特尔在某些阶段可能需要多个阶段。这会产生不对称的性能

在我的示例中,add将在合并的“MEM+EX”阶段中执行多个CPU刻度,从而产生许多停顿。

现代x86 CPU具有非常长的流水线(典型的是16级),并且它们在内部是类似RISC的cpus。解码器阶段(3阶段或更多阶段)将大多数复杂的x86指令分解为一系列内部RISC类微操作(有时在微指令的帮助下生成每条指令最多450微操作;更典型的是2-3微操作)。对于复杂的ALU / MEM操作,将有微操作用于地址计算,然后微操作用于存储器加载,然后微操作用于ALU操作。微操作将取决于它们,并计划用于不同的执行端口。