【问题标题】:Why are registers needed (why not only use memory)? [duplicate]为什么需要寄存器(为什么不只使用内存)? [复制]
【发布时间】:2018-01-16 19:07:45
【问题描述】:

我刚刚开始学习汇编(我之前曾与 合作过)。

我想知道为什么我们除了使用内存之外还需要使用寄存器,为什么不只使用内存呢?

我想最明显的原因是在寄存器中进行计算比在内存中进行计算要快得多。但这是唯一的原因吗?

【问题讨论】:

  • 请注意,在寄存器文件中实现寄存器并不少见,这是 sram 的另一个术语。寄存器本身只是一个具有地址和数据总线以及控制信号的片上 SRAM。虽然它是处理器可以运行的最快速度,但请参见下面的答案,内存在芯片外或处理器核心内存中,通常非常非常慢,尤其是 DRAM。
  • 有些处理器大多基于 ram,基于堆栈的处理器基本上认为小型 c 或 pascal、java、python、基于堆栈的虚拟机,但也有使用类似指令集构建的真实机器。
  • 我对这里的答案或我找到的副本(尤其是这个版本的问题)并不完全满意,所以我发布了stackoverflow.com/questions/2360997/…。寄存器和内存之间更重要的区别之一是寄存器编号必须硬编码到机器代码中,而不是索引,因此 CPU 总是立即拥有它们。 x86 被设计为注册机,最初我认为是出于代码密度的原因。这样可以实现高性能。

标签: c++ assembly x86 cpu-architecture cpu-registers


【解决方案1】:

因为 RAM 很慢。很慢。

寄存器放置在内部 CPU,紧挨着 ALU,因此信号几乎可以立即传输。它们也是最快的内存类型,但它们占用了大量空间,因此我们只能拥有有限的数量。增加寄存器数量增加

  • 模具尺寸
  • 信号传输所需的距离
  • 在线程之间切换时保存上下文
  • 指令编码中的位数

阅读If registers are so blazingly fast, why don't we have more of them?

更常用的数据将被放置在缓存中以便更快地访问。过去缓存非常昂贵,因此它们是可选部件,可以单独购买并插入 CPU 外部的插槽中。如今,它们通常与 CPU 在同一个芯片中。缓存由 SRAM 单元构成,这些单元比寄存器单元小,但可能慢几十或几百倍。

主存储器将由 DRAM 制成,每个单元只需要一个晶体管,但比寄存器慢数千倍,因此我们不能在高性能系统中仅使用 DRAM。但是有些嵌入式系统确实使用了register file,所以寄存器也是主存

更多信息:Can we have a computer with just registers as memory?

【讨论】:

  • 这是一个尽可能完整的混合历史的答案。
  • 拥有少量经常使用的内存位置(例如寄存器)也有助于降低指令大小 - 原始的 8 x86 GP 寄存器可以以 3 位索引,与每次指定一个内存相比地址。 OTOH,这只是一种可能的妥协;如果您不介意变慢(或者,如果您的 CPU 和 RAM 一样慢),还有其他可能性。以 6502 为例:它实际上有 1 个 8 位累加器和 2 个索引寄存器 - 周期;但它对前 256 个 RAM 位置具有紧凑形式的内存访问指令,然后可以像寄存器一样使用它们。
  • @MatteoItalia:相关:AVR(具有 32 个 8 位寄存器的 RISC 微控制器)有其寄存器 aliased to memory locations (in its internal SRAM)。 (也描述了as part of this silly question)。这可能反映了内部实现,但是使用单独的快速寄存器文件并检测对这些地址的内存读取/写入并使用回退进行处理,可以实现高性能。
  • @PeterCordes:既然你让我想到了,我想知道有多少低端 MCU 的寄存器比主存储器快得多,因为它们通常都有很少的嵌入式 SRAM(可能相似/与寄存器文件中的一个相同?)作为主存储器,并且不进行特别智能的优化,例如寄存器重命名。也许使用相同类型的内存很常见,但只是 AVR 如此明确地公开它?
  • @MatteoItalia:如果加载/存储在具有内置 SRAM 的硬件上只有 1c 延迟,我不会感到惊讶,但据我了解,EEPROM / 闪存要慢得多。当然,即使您拥有快速 RAM,寄存器仍然很重要,因为在取消引用之前您需要寄存器中的指针。 (正如您所指出的,这就是注册机保持其机器代码编码简单和/或紧凑的方式。)
【解决方案2】:

实际上,有一些微小的实现不会将寄存器与内存分开。例如,它们可以以 512 字节 RAM 的方式公开它,其中前 64 个作为 32 个 16 位寄存器公开,同时可作为可寻址 RAM 访问。或者,另一个例子,MosTek 6502 “零页”(RAM 范围 0-255,访问使用的 1 字节地址)由于 CPU 中的实际寄存器数量很少,因此不能很好地替代寄存器。但是,这很难扩展到更大的设置。

寄存器的优点如下:

  1. 它们是最快的。它们在典型的现代系统中比任何缓存都快,比 DRAM 更快。 (在上面的示例中,RAM 很可能是 SRAM。但几 GB 的 SRAM 非常昂贵。)而且,它们接近处理器。寄存器访问和 DRAM 访问之间的时间差可以达到 200 甚至 1000 之类的值。即使与 L1 缓存相比,寄存器访问通常也快 2-4 倍。

  2. 数量有限。如果显式寻址任何内存位置,典型的指令集将变得过于臃肿。

  3. 它们分别特定于每个 CPU(内核、线程、hart)。 (在固定 RAM 地址充当特殊寄存器角色的系统中,例如 zSeries 所做的那样,这需要在绝对地址中对此类服务区域进行特殊重新映射,并为每个内核分开。)

  4. 它们允许特定的优化,如register renaming。如果使用内存地址,这太复杂了。

此外,有些寄存器无法在单独的 Block RAM 中实现,因为对 RAM 的访问需要对其进行更改。我的意思是最简单的 CPU 设计中的“执行阶段”寄存器,它取“指令提取阶段”、“指令解码阶段”、“ALU 阶段”、“数据写入阶段”等值,并且该寄存器等价于更多复杂的(流水线、无序的)设计;总线访问时也有不同的缓冲寄存器,等等。但是,这些寄存器对程序员来说是不可见的,所以你可能不是故意的。

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2021-11-23
    • 2020-09-14
    • 2017-05-25
    • 2011-03-30
    相关资源
    最近更新 更多