寄存器的速度为何比内存更快?

转载自知乎 https://www.zhihu.com/question/20075426 侵删


作者:胡雨松
链接:https://www.zhihu.com/question/20075426/answer/16473901
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

Memory大致包含了一下几种器件。
锁存器(Latch)。锁存器是电平敏感的,一般来讲作为构成寄存器(register)一部分出现。在时序电路中不会单独出现,不然容易引起时序错误。
寄存器(Register)。寄存器是沿敏感的。1bit的寄存器也叫(触发器)Flip-flop。最常见的Flip-flop结构是这样的:

通常不算输出的话,一个Flip-flop是由16个晶体管(Transistor)组成的 @又见山人 。
Register的速度最快,消耗的晶体管也最多,所以一般作为时序电路的组成部分。所以ALU里面其实也是包含了register的。也有register专门用来储存数据的情况,比如说shift register array,但是它们的存储容量通常非常小。要知道几个kb的register的占用面积就是相当惊人的!
SRAM(Static Random Accessible Memory)。1bit由6个晶体管组成,一般作为片上存储器使用(On-chip-memory)。它消耗的晶体管比较多,但是速度快(仅次于register)。在CPU中作为cache的组成单元,大小是几MB到几十MB。Cache不是由register组成的, @时国怀 。
DRAM(Dynamic Random Accessible Memory)。一般1bit由一个晶体加一个电容组成。虽然面积小,但是速度慢,而且需要刷新。所以通常当内存用,存储几个GB的数据。
ROM(Read Only Memory)。这个就不说了。

================================以下是答案===============================
registers are closer to the ALU than memory 不靠谱。因为register本身就是memory的一种。这里即使当内存理解也不对。应该这么说,register本身的结构决定了它能比构成内存的DRAM工作在更高的时钟频率,所以才用在速度需求最快的地方(靠近ALU)。
另外,给register的时钟频率就是CPU工作的时钟频率,cache(无论一级二级还是三级)也和CPU同频。所以从理论上讲,cache和register是一样快的。不过因为cache里面的东西不一定就是需要的,如果不需要的话就要一级一级往下读取,实在找不着才往内存里面找。在往下级找数据的时候CPU是需要等待的。


又见山人芯片(集成电路)话题优秀回答者 集成电路工程师,…
56 人赞同
‘“registers are closer to the ALU than memory" 可以解释得通吗?或者说,需要有所补充?’

这么说也不是不可以,但这种说法真正的问题在于混淆了因果。做个类比就是,刘翔因为跑得快上了奥运会,不是因为他上了奥运所以跑得快。

从计算机体系结构角度而言,需要把不同速度和容量的memory分层级,得到效率和成本间较好的平衡。最需要经常访问的数据放在速度最快容量最小的寄存器和L1 cache里,访问量最少的数据放在最慢最大的内存条里,以此类推。

一个相当粗略和不精确的描述如下:

寄存器(register)经常自身就是CPU用的触发器,往往与CPU同时钟同频,当然是最快最方便的。但这玩意一个要20多个晶体管,多了芯片面积吃不消。

SRAM的优势在于速度较快,与一般半导体工艺兼容,因此被当作cache放在芯片内部离CPU近的地方,发挥其速度快的长处。但是这玩意存储密度小(一个bit要6个晶体管),放太多就贵了。

DRAM天生速度慢但存储密度高,正好适合做内存条这种东西。


时国怀 USB,驱动开发,RTOS
22 人赞同
"registers are closer to the ALU than memory"
可以认为基本上是对的,这里先来看看访问速度的比较:

一条汇编指令大概执行过程是(不是绝对的,不同平台有差异):

取指(取指令)、译码(把指令转换成微指令)、取数(读内存里的操作数)、计算(各种计算的过程,ALU负责)、写回(将计算结果写回内存),有些平台里,前两步会合并成一步,某些指令也不会有取数或者回写的过程。

再提一下CPU主频的概念:首先,主频绝对不等于一秒钟可以执行的指令个数,每个指令的执行成本是不同的,比如x86平台里汇编指令INC就比ADD要快,具体每个指令的时钟周期可以参考intel的手册。

为什么要提主频?因为上面的执行过程中,每个操作都需要占用一个时钟周期,对于一个操作内存的加法,就需要5个时钟周期,换句话说,500Mhz主频的CPU,最多执行100MHz条指令。

仔细观察,上面的步骤里不包括寄存器操作,对于CPU来说读/写寄存器是不需要时间的,或者说如果只是操作寄存器(比如类似mov BX,AX之类的操作),那么一秒钟执行的指令个数理论上说就等于主频,因为寄存器是CPU的一部分。

然后寄存器往下就是各级的cache,有L1 cache,L2,甚至有L3的,以及TLB这些(TLB也可以认为是cache),之后就是内存,前面说寄存器快,现在说为什么这些慢:

对于各级的cache,访问速度是不同的,理论上说L1 cache(一级缓存)有着跟CPU寄存器相同的速度,但L1 cache有一个问题,当需要同步cache和内存之间的内容时,需要锁住cache的某一块(术语是cache line),然后再进行cache或者内存内容的更新,这段期间这个cache块是不能被访问的,所以L1 cache的速度就没寄存器快,因为它会频繁的有一段时间不可用。

L1 cache下面是L2 cache,甚至L3 cache,这些都有跟L1 cache一样的问题,要加锁,同步,并且L2比L1慢,L3比L2慢,这样速度也就更低了。

最后说说内存,内存的主频现在主流是1333左右吧?或者1600,单位是MHz,这比CPU的速度要低的多,所以内存的速度起点就更低,然后内存跟CPU之间通信也不是想要什么就要什么的。

内存不仅仅要跟CPU通信,还要通过DMA控制器与其它硬件通信,CPU要发起一次内存请求,先要给一个信号说“我要访问数据了,你忙不忙?”如果此时内存忙,则通信需要等待,不忙的时候,通信才能正常。并且,这个请求信号的时间代价,就是够执行几个汇编指令了,所以,这是内存慢的一个原因。

另一个原因是:内存跟CPU之间通信的通道也是有限的,就是所谓的“总线带宽”,但,要记住这个带宽不仅仅是留给内存的,还包括显存之类的各种通信都要走这条路,并且由于路是共享的,所以任何请求发起之间都要先抢占,抢占带宽需要时间,带宽不够等待的话也需要时间。

以上两条加起来导致了CPU访问内存更慢,比cache还慢。

举个更容易懂的例子:

CPU要取寄存器AX的值,只需要一步:把AX给我拿来,AX就拿来了。
CPU要取L1 cache的某个值,需要1-3步(或者更多):把某某cache行锁住,把某个数据拿来,解锁,如果没锁住就慢了。
CPU要取L2 cache的某个值,先要到L1 cache里取,L1说,我没有,在L2里,L2开始加锁,加锁以后,把L2里的数据复制到L1,再执行读L1的过程,上面的3步,再解锁。
CPU取L3 cache的也是一样,只不过先由L3复制到L2,从L2复制到L1,从L1到CPU。
CPU取内存则最复杂:通知内存控制器占用总线带宽,通知内存加锁,发起内存读请求,等待回应,回应数据保存到L3(如果没有就到L2),再从L3/2到L1,再从L1到CPU,之后解除总线锁定。

这个链接是个图,可以看看CPU离主存(main memory)有多远,这个图没画寄存器,可以理解为:所有的L1 cache下面是寄存器,寄存器下面是CPU


达达lee 潜水/摄影/骑马/画画/开飞机/烹饪 以上都…
13 人赞同
转载一篇文章:为什么寄存器比内存快?

计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。

同样都是晶体管存储设备,为什么寄存器比内存快呢?

Mike Ash写了一篇很好的解释,非常通俗地回答了这个问题,有助于加深对硬件的理解。下面就是我的简单翻译。

原因一:距离不同

距离不是主要因素,但是最好懂,所以放在最前面说。内存离CPU比较远,所以要耗费更长的时间读取。

以3GHz的CPU为例,电流每秒钟可以振荡30亿次,每次耗时大约为0.33纳秒。光在1纳秒的时间内,可以前进30厘米。也就是说,在CPU的一个时钟周期内,光可以前进10厘米。因此,如果内存距离CPU超过5厘米,就不可能在一个时钟周期内完成数据的读取,这还没有考虑硬件的限制和电流实际上达不到光速。相比之下,寄存器在CPU内部,当然读起来会快一点。

距离对于桌面电脑影响很大,对于手机影响就要小得多。手机CPU的时钟频率比较慢(iPhone 5s为1.3GHz),而且手机的内存紧挨着CPU。

原因二:硬件设计不同

苹果公司新推出的iPhone 5s,CPU是A7, 寄存器有6000多位(31个64位寄存器,加上32个128位寄存器)。而iPhone 5s的内存是1GB,约为80亿位(bit)。这意味着,高性能、高成本、高耗电的设计可以用在寄存器上,反正只有6000多位,而不能用在内存上。因为 每个位的成本和能耗只要增加一点点,就会被放大80亿倍。

事实上确实如此,内存的设计相对简单,每个位就是一个电容和一个晶体管,而寄存器的设计则完全不同,多出好几个电子元件。并且通电以后,寄存器的晶体管一直有电,而内存的晶体管只有用到的才有电,没用到的就没电,这样有利于省电。这些设计上的因素,决定了寄存器比内存读取速度更快。

原因三:工作方式不同

寄存器的工作方式很简单,只有两步:(1)找到相关的位,(2)读取这些位。

内存的工作方式就要复杂得多:

(1)找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。)

(2)将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。

(3)将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。

(4)确定数据在哪一个内存块(chunk)上,从该块读取数据。

(5)数据先送回内存控制器,再送回CPU,然后开始使用。

内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。

为了缓解寄存器与内存之间的巨大速度差异,硬件设计师做出了许多努力,包括在CPU内部设置缓存、优化CPU工作方式,尽量一次性从内存读取指令所要用到的全部数据等等。


标签: none

添加新评论