4

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

直到今天,我无法弄清楚为什么在顺序指令中execute位于之前。memory

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

谢谢!

4

1 回答 1

8

让我们记住经典的 RISC 管道,通常研究它:http ://en.wikipedia.org/wiki/Classic_RISC_pipeline 。以下是它的阶段:

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

在 RISC 中,您只能使用loads 和stores 来处理内存。EX内存访问指令的阶段将计算内存中的地址(从寄存器文件中获取地址,对其进行缩放或添加偏移量)。然后地址将被传递到MEM阶段。

您的示例mov (%eax), %ebx实际上是来自内存的负载,无需任何额外计算,甚至可以在 RISC 管道中表示:

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

在真正的 CISC 指令中情况更复杂,例如(从内存中add (%eax), %ebx加载字,然后将 T+ 存储到)。该指令需要在 ALU 中进行地址计算和加法运算。这在最简单的 RISC (MIPS) 管道中不容易表示。T[%eax]%ebx%ebx

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

幻灯片 17 说:

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

在我的示例中,add将在组合的“ MEM+EX”阶段执行几个 CPU 滴答,产生许多停顿。

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

于 2012-12-07T05:28:44.987 回答