寄存器是计算机中最快的存储器。因此,如果我们想构建一台只有寄存器甚至没有缓存的计算机,这可能吗?我什至想用寄存器代替磁盘,尽管它们自然是易失性存储器。我们是否有一些用于该用途的非易失性寄存器?会变得如此之快!我只是想知道这是否会发生?
10 回答
非常简短的回答是肯定的,理论上你可以,但它在现实生活中并没有真正起作用。让我解释...
内存层次结构存在的原因是因为那些小而快的内存存储每比特非常昂贵(寄存器),而大而慢的内存存储每比特非常便宜(硬盘驱动器)。
大量寄存器非常不切实际的另一个原因是指令需要引用内存位置。当您只有少量寄存器时,您可以将寄存器(或多个寄存器)编号和操作码存储在少数位中,这意味着少量寄存器可以实现短而快速的指令。如果您要拥有数千兆字节的寄存器集合,您将需要能够在指令中引用它们,而这些指令将更长(因此更慢)。请记住,如果一切都是寄存器,有些事情会快得多,但是通过较少数量的寄存器,某些事情(即,您使用计算机所做的大部分事情)会快得多。
拥有大量寄存器也会给处理寄存器读取和写入的硬件增加大量复杂性,这会使一切变慢。
当然,虽然我们大多数人都从计算机的角度来思考,但肯定有一些简单的设备只有寄存器,但它们也只有非常有限的内存量,并且不是为通用计算而设计的。
寄存器速度很快,因为大多数寄存器直接连接到大多数功能单元。当程序加载一个寄存器时,另一个寄存器正在为 ALU 提供数据,而另一个寄存器正在写入来自其他功能单元的结果。
寄存器由触发器等逻辑元件组成,因此来自大多数寄存器的大部分值都可以同时、一直可用。这与在任何时候只有一个选定的地址可用并且只有非常有限数量的读取端口可用的存储器不同。通常,它只是一个读取电路。
然而,这种实现和互连占用了微处理器上的芯片空间。当它用完时,您开始添加内存以增加存储空间。
已经存在具有额外寄存器组的架构。(SPARC!)
现代 GPU 有大约 5MB 的寄存器和非常少的缓存(与 CPU 相比)。所以是的,有一个处理器有很多寄存器是可能的。
但是您仍然需要一个内存层次结构(寄存器 -> 暂存器/缓存 -> 设备内存 -> CPU 内存)。另请注意,GPU 是完全不同的野兽,因为它们从一开始就具有大规模的并行目标,并且 GPU 不是通用的,而是协处理器。
每个 GPU 线程都会占用一些寄存器 - 整个 GPU 程序都是寄存器分配的 - 导致数千个线程可以并行执行/暂停/恢复。线程用于隐藏 GPU 上的内存延迟,而在 CPU 上,巨大的缓存用于此目的。把它想象成超线程被推到了极致。
问题在于cpu内部存在寄存器。由于它存在于 cpu 中,因此具有最小的延迟。也因为它的尺寸较小。当您增加尺寸时,假设您考虑构建一个带有大量晶体管(触发器)的大型处理器来保存寄存器,那么散热、能耗、成本等将是巨大的。此外,当空间增加时,延迟也会增加。所以基本上这样做没有太大区别。它实际上更糟。
这些答案中的大多数都解决了它是否实用。大卫约翰斯通还提到了一个事实,即在每条涉及它的指令中都需要提到一个寄存器名称。此外,在大多数现代指令集中,一条指令总是将其操作数寄存器编码在其中。例如,有mov %eax, %ebx说明,有mov %eax, %ecx说明。它们的二进制表示可能看起来像这样:
| mov | source reg | dest reg |
| 2 | 3 | 3 |
不同之处仅在于dest reg等于 3 而不是 2——但也可能不是!(我还没有检查这些特定指令在 386 中是如何表示的,但我记得在该指令集中有一些示例很容易分解成这样的字段,以及它们不是这样的示例。)
问题是大多数有趣的程序都希望在运行时确定的信息位置上进行操作。例如,在循环的这个迭代中,我们要查看字节 37;下一次迭代我们将对字节 38 等感兴趣。
我不会证明这一点,但我怀疑为了获得接近图灵完整性的任何东西,您的程序将需要:
- 根据其他寄存器中的值寻址寄存器的指令,例如“从寄存器 X 移动到寄存器 Y,其中 X 和 Y 由寄存器 1 和 2 中的值指示”,或
- 自修改代码。
在学校,我们有一台理论计算机,它有 100 个寄存器(加上累加器)和 10 条指令,每条指令都是一个三位十进制数。第一个数字表示操作(加载、保存、算术、跳转、条件跳转、停止),最后两位表示要操作的寄存器。可以为此编写许多示例程序,例如阶乘函数。但很快就发现静态程序只能对一组固定的数据进行操作。如果您想编写一个循环来对列表中的值求和,则需要一条 LOAD 指令,该指令在每次迭代时指向不同的输入寄存器。这意味着您每次都要算术计算加载指令的新代码,并在运行该指令之前修补代码。
对于每个 32 位寄存器,您至少需要 9x32 个异或门。那是很多门。
当您希望寄存器数据通过总线传递时,就会出现更大的问题。哪一个会拿着贝斯?你想添加更多的低音?
假设我们有 10 个寄存器,我们做 10 线总线吗?意思是我们有 10 个总线连接器连接到系统的大部分?那是很多连线,现在您希望寄存器有意义吗?
让我们想想 1kb 的数据需要多少低音?
CPU 中 1024 位 = 1024*9*32 门和 1024 条低音线。
我们知道英特尔正在为一个门使用 30 nm。那是 3000 万门,哪个门的问题更重,但是你打算如何解决低音问题?
你甚至不需要寄存器——可以创建像图灵机这样的东西,它接收输入代码和数据流并产生输出流。这就像计算机开始的东西。
这是可能的,但完全不切实际——即使是今天的低端计算机也有 2 GB 的 RAM。你将如何处理代码中的 20 亿个寄存器(以及你将在哪里填充它们,物理上)?
另外,你会用它做什么,RAM(甚至处理器缓存)的速度是一个问题?要么在 RAM 上运行系统(足够快),要么构建一个专用处理器。
热脱发声器硬件理论板->
如果您设法将地址位的每个排列链接到各个单词 - 那么您可以拥有一个 ram 寄存器系统。想象一下,如果您使用 nand 来制作地址组。(换句话说,将地址的反面链接到翻牌)一个没有,你已经完成了单独的电线寻址+小不开关,这可能是一个螺线管类型的线圈,它不会产生价值。然后每个寄存器或进入相同的输出 - 内容引脚。只有过去的地址才能为输出内容引脚供电。
简单。
您获得如此少的寄存器内存的原因是因为它非常昂贵。这就是我们有内存层次结构的原因。