【问题标题】:Why "execute" located before "memory" in Instruction Set Achitecture?为什么在指令集架构中“执行”位于“内存”之前?
【发布时间】:2012-08-15 17:55:17
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 仅以此为例。处理器可能会“获取”指令,然后对其进行解码,然后执行,然后再“存储”。我的问题是不应该在执行之前运行内存,因为 (%eax) 将访问内存。

标签: processor instruction-set


【解决方案1】:

让我们记住经典的 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(从[%eax]内存中加载字T,然后将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

幻灯片 17 说:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 2020-01-04
    • 2014-02-10
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2021-07-06
    • 2016-03-04
    相关资源
    最近更新 更多