processor - 为什么 "execute"在指令集架构中位于 "memory"之前?

标签 processor instruction-set

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

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

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

谢谢!

最佳答案

让我们记住经典的 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 获取值并将其传回注册文件。控制单元应将寄存器文件设置为模式:“Writing”+“EBX selected”

  • 在真正的 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

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

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

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

    关于processor - 为什么 "execute"在指令集架构中位于 "memory"之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037041/

    相关文章:

    linux - 在 Linux 下确定我的处理器的指令集

    c# - 检索物理核心处理器的数量

    mysql - 使用 NIFI 在增量提取中摄取重复记录,

    operating-system - 什么负责改变多核处理器中内核的负载和频率

    c - 如何确定在 C 程序中执行的 x86 机器指令的数量?

    assembly - PowerPC 操作码表?

    c# - 如何获得程序集 dll 的处理器架构?

    linux - 确定 Linux 中二进制文件的目标 ISA 扩展名(库或可执行文件)

    x86 - 最新的处理器不支持SSSE3指令?

    operating-system - 操作系统权限级别与硬件权限级别