【问题标题】:Can we have a computer with just registers as memory? [closed]我们可以拥有一台只有寄存器作为内存的计算机吗? [关闭]
【发布时间】:2011-04-17 10:58:51
【问题描述】:

寄存器是计算机中最快的存储器。因此,如果我们想构建一台只有寄存器甚至没有缓存的计算机,这可能吗?我什至想用寄存器代替磁盘,尽管它们自然是易失性存储器。我们是否有一些用于该用途的非易失性寄存器?会变得如此之快!我只是想知道这是否会发生?

【问题讨论】:

  • 很多uC都是这样的,没有RAM,只有寄存器。
  • 你能举个例子吗?
  • 在一定的范围内,是的——不过不要指望千兆字节的寄存器内存。此外,芯片空间非常昂贵并且是一个硬限制,而且处理器产生的热量将变得难以控制。所以总的来说,这个想法是不可行的。

标签: memory cpu-architecture cpu-registers


【解决方案1】:

非常简短的回答是是的,理论上你可以,但在现实生活中并不能真正发挥作用。让我解释一下……

存在内存层次结构的原因是因为那些小而快的内存存储每比特非常昂贵(寄存器),而大而慢的内存存储每比特非常便宜(硬盘)。

大量寄存器非常不切实际的另一个原因是指令需要引用内存位置。当您只有几个寄存器时,您可以将寄存器(或多个寄存器)编号和操作码存储在少数位中,这意味着寄存器数量少,指令短而快速。如果您将拥有数 GB 的寄存器集合,您将需要能够在指令中引用它们,而这些指令将更长(因此更慢)。请记住,如果所有内容都是寄存器,有些事情会快得多,但寄存器数量越少,某些事情(即您使用计算机执行的大部分操作)会快得多。

拥有大量寄存器还会增加硬件的复杂性,该硬件处理寄存器的读取和写入,这会使一切变慢。

当然,虽然我们大多数人都从计算机的角度来思考,但肯定有一些简单的设备只有寄存器,但它们也只有非常有限的内存量,并且不是为通用计算而设计的。

您可能也有兴趣my answer to Assembly: Why are we bothering with registers?

【讨论】:

  • 肯定有一些只有寄存器的简单设备——当然不是冯诺依曼存储程序机器?程序将存储在哪里?如果它存储在“寄存器”中,程序计数器间接寻址这些寄存器,那么它们就不是传统意义上的寄存器。 (或者它们是内存映射的,所以你的寄存器文件也是内存的两倍。例如,AVR 微控制器具有内部 SRAM,并将寄存器映射到其中的低 32 个字节。)寄存器的一个标准属性是你可以' t 间接解决它们。
【解决方案2】:

寄存器速度很快,因为大多数寄存器直接连接到大多数功能单元。当程序加载一个寄存器时,另一个寄存器正在为 ALU 提供数据,而另一个寄存器正在写入来自其他功能单元的结果。

寄存器由触发器等逻辑元件组成,因此大多数寄存器中的大部分值都可以同时、一直可用。这与在任何时候只有一个选定的地址可用并且只有非常有限数量的读取端口可用的存储器不同。通常,它只是一个读取电路。

然而,这种实现和互连占用了微处理器上的芯片空间。用完后,您开始添加内存以增加存储空间。

已经存在具有额外寄存器组的架构。 (SPARC!)

【讨论】:

  • 寄存器文件根本与 L1d 高速缓存的数据阵列没有区别:两者都是多端口 SRAM 存储器。 (我不是在谈论带有标签比较器和其他东西的整个缓存,只是通过 set 和 offset 寻址的数据本身)。但是寄存器文件更小更快,具有更多的读写端口。 (通常与 CPU 需要的数量一样多,以避免争用。)现代 L1d 缓存通常是多端口的,例如读 + 读/写,或读 + 读 + 写。 (也许还有另一个端口,这样它就可以在不阻塞 CPU 的情况下与 L2 通信。)
  • 寄存器也很特殊,因为绕过转发将数据从add r0, r1, r2 的结果获取到add r0, r0, r0 的输入,而无需写回寄存器文件并读取它。寄存器不是间接可寻址的(在大多数 ISA 上),因此识别写入后读取只是比较寄存器编号的问题。
【解决方案3】:

现代 GPU 具有大约 5MB 的寄存器和非常少的缓存(与 CPU 相比)。所以是的,有一个处理器有很多寄存器是可能的。

但是您仍然需要一个内存层次结构(寄存器 -> 暂存器/缓存 -> 设备内存 -> CPU 内存)。另请注意,GPU 是完全不同的野兽,因为它们从一开始就具有大规模的并行目标,并且 GPU 不是通用的,而是协处理器。

每个 GPU 线程都会占用一些寄存器 - 整个 GPU 程序都是寄存器分配的 - 导致数千个线程可以并行执行/暂停/恢复。线程用于隐藏 GPU 上的内存延迟,而在 CPU 上,巨大的缓存用于此目的。把它想象成超线程被推到了极致。

【讨论】:

    【解决方案4】:

    问题在于 CPU 内部存在寄存器。由于它存在于 cpu 中,因此它具有最小的延迟。也因为它的尺寸较小。当您增加尺寸时,假设您考虑构建一个带有大量晶体管(触发器)的大型处理器来保存寄存器,那么散热、能耗、成本等将是巨大的。此外,当空间增加时,延迟也会增加。所以基本上这样做没有太大区别。它实际上更糟。

    【讨论】:

      【解决方案5】:

      这些答案中的大多数都解决了它是否实用。大卫约翰斯通还提到了一个事实,即在每条涉及它的指令中都需要提到一个寄存器名称。此外,在大多数现代指令集中,一条指令总是将其操作数寄存器编码在其中。例如。有mov %eax, %ebx 指令,还有mov %eax, %ecx 指令。它们的二进制表示可能看起来像这样:

      | mov | source reg | dest reg | 
      |  2  |     3      |     3    |
      

      不同之处仅在于dest reg 等于3 而不是2——但也可能不等于! (我还没有检查这些特定指令在 386 中是如何表示的,但我记得在该指令集中有一些示例很容易分解成这样的字段,以及它们不是这样的示例。)

      问题是大多数有趣的程序都希望在运行时确定的信息位置上进行操作。例如。在循环的这个迭代中,我们要查看字节 37;下一次迭代我们将对字节 38 等感兴趣。

      我不会证明这一点,但我怀疑为了获得接近图灵完备性的任何东西,您的程序需要:

      • 根据某些 other 寄存器中的值寻址寄存器的指令,例如“从寄存器 X 移动到寄存器 Y,其中 X 和 Y 由寄存器 1 和 2 中的值指示。”,或
      • 自修改代码。

      在学校,我们有一台理论计算机,它有 100 个寄存器(加上累加器)和 10 条指令,每条指令都是三位十进制数。第一个数字表示操作(加载、保存、算术、跳转、条件跳转、暂停),最后两位表示要操作的寄存器。可以为此编写许多示例程序,例如阶乘函数。但很快就发现静态程序只能对一组固定的数据进行操作。如果您想编写一个循环来对列表中的值求和,则需要一个 LOAD 指令,该指令在每次迭代时指向不同的输入寄存器。这意味着您每次都要通过算术计算加载指令的新代码,并在运行该指令之前修补代码。

      【讨论】:

        【解决方案6】:

        对于每个 32 位寄存器,您至少需要 9x32 个异或门。那是很多门。

        当您希望寄存器数据通过总线传递时,就会出现更大的问题。哪一个会拿着贝斯?你想添加更多的低音?

        假设我们有 10 个寄存器,我们做 10 线总线吗?意思是我们有 10 个总线连接器连接到系统的大部分?那是很多连线,现在你想让寄存器意味着什么吗?

        让我们想想 1kb 的数据需要多少低音?

        CPU 中有 1024 位 = 1024*9*32 门和 1024 条低音线。

        我们知道英特尔正在为一个门使用 30 nm。 那是 3000 万门,哪个门的问题更重,但是你打算如何解决低音问题?

        【讨论】:

        • “谁来拿贝斯?” Paul McCartney?
        【解决方案7】:

        您甚至不需要寄存器 - 可以创建像图灵机这样的东西,它接收输入代码和数据流并产生输出流。这就像计算机开始的东西。

        【讨论】:

        • 我认为我们确实需要内存,图灵机甚至需要内存来保持机器的状态,虽然我不知道这台机器在现实世界中如何实现!
        【解决方案8】:

        这是可能的,但完全不切实际——即使是今天的低端计算机也有 2 GB 的 RAM。你将如何处理代码中的 20 亿个寄存器(以及你会将它们填充到哪里,物理上)?

        另外,如果 RAM(甚至处理器缓存)的速度是一个问题,您会如何处理它?要么在 RAM 上运行系统(足够快),要么构建一个专用处理器。

        【讨论】:

        • 20 亿个寄存器在每条指令中需要一个或多个 31 位寄存器字段。我建议寄存器字段是基本操作码之外的一个单独的 32 位字。我会物理地将寄存器放在一个或多个单独的芯片上。显然这会导致性能下降,所以我会在 CPU 芯片上设置一小组“超寄存器”。
        【解决方案9】:

        火爆硬件理论板->

        如果您设法将地址位的每个排列链接到各个单词 - 那么您可以拥有一个 ram 寄存器系统。想象一下,如果您使用 nand 来制作地址组。 (换句话说,将地址的反面链接到翻牌)一个没有,你只用电线完成了寻址+小不开关,这可能是一个螺线管类型的线圈,它不会值。然后每个寄存器或进入相同的输出 - 内容引脚。只有过去的地址才能为输出内容引脚供电。

        简单。

        【讨论】:

          【解决方案10】:

          您获得如此少的寄存器内存的原因是它非常昂贵。这就是我们有内存层次结构的原因。

          【讨论】:

          • 这是一个抽象的问题,寻找这些计算机的技术可能性,成本与这个问题无关。
          猜你喜欢
          • 2012-01-14
          • 2013-08-04
          • 2015-03-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-11
          • 1970-01-01
          • 2020-02-15
          • 2016-11-05
          相关资源
          最近更新 更多