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