🗒️从三极管到bank冲突,RAM原理学习
type
status
date
slug
summary
tags
category
icon
password
AI summary
You can design better software, if you unsderstand the hardware
从DRAM的一个memroy cell的电路开始,理解RAM存储原理与读写过程,然后学习cell/array/bank/rank的组织方式,理解一个RAM chip的读写原理,理解了这些,自然就知道了为什么会有地址对齐,bank冲突。
本文只是个人学习笔记记录。
推荐阅读材料
Youtube-Random Access Memory:非常好的视频讲解,看完就懂了。
DRAM的工作原理:非常好的图文讲解,看完就懂了。
几个问题
带着问题学习:
- DRAM是dynamic random-access memory的缩写,这里的dynamic random-access是什么意思?
- 为什么会有地址对齐,为什么如果需要读取未对齐的数据,可能需要两个cycle? (这里描述不严谨)
- Cuda里面为什么会有bank冲突?怎么在CPU上没有怎么听说
Cell

上图是一个DRAM memory cell的结构,能够存储一个bit的数据。
右边是一个电容,中间是一个三极管,上面横着的是word line(有的也叫address line,名字不重要),左边竖着的叫bit line.
右边的电容就是实际存储数据的容器,电容里面充满电荷,电容两端电压超过可检测阈值时,代表1,否则代表0.
理想情况下,word line不激活,电容和bit line没有连接,电容存储的电荷应该能一直保持,但实际由于电子一直在做不规则运动,电容存储的电荷会慢慢流逝,所以为了保持电容存储的1永远是1,需要动态定期对电容进行充能刷新。这也是DRAM中D的含义: dynamic. 对应的SRAM的S则是Static,不需要刷新。 需要定期刷新,是DRAM速度比SRAM速度慢的原因之一。
中间的三极管是一个开关作用,由于三极管的物理特性,当上方work line激活时,下方两个极就导通,电容和bit line连接。一句话来说,上图电路中,word line激活,则电容和bit line激活,否则电容和bit line断开。
读
假设阈值电压是0.5V。
给bit line一个0.5V的电压,然后将wordline激活,电容与bit line连通,此时根据电容两端电压的情况,bit line会产生一个微小的波动,经过放大器后能被捕捉到,也就能读出电容存储的数据。
写
写1就是给C充电,写0就是放电。
读写的详细讲解,请看上面的推荐材料。
Array

多个cell按照上图排列形成的二维平面就是Array。

左上那几根是行地址线,左下那几根是列地址线,正下方的那根是数据输出线。
如果想要读取某一个bit,我们需要激活对应行的word line,再将对应列的bit line出来的数据取出来。
从上面的结构可以发现,一次只能读取某一行的数据,不能通过读取两行的数据,因为同一列的不同行,使用的是同一条bit line,如果同时激活多行的word line,不同行之间的数据会流向同一根bit line,产生干扰。
一个问题
从上图看,我们可以一次性读取一行的多个bit,所以当我们访问DRAM的一个byte时,是不是对应了上图一行中挨着的8个bit呢? 并不是的,这涉及到RAM chip的结构,看了后续rank部分就知道了。
bank
由于成本和物理的原因,单个Array不能做太大,一般来说Aarray是长方形的,行数比列数多。

虽然单个array不能做大,但是我们可以同时用多个array啊,多个array就形成了一个bank, 如下图:

上面的一个bank有8个array,所有array共享地址线,每个array都贡献一根data line,一共8根,一次输出8bit。
从上图就可以发现,当我们访问DRAM的一个byte时,并不是一个array的一行的连续8个bit,实际上一个byte的8个bit是一个bank内,8个array的同一个位置的一个bit。真是非常的Amazing.
可以发现,这种一个bank内有多个array的特点,不仅可以增大memroy容量,也可以增加访问速度,因为一次可以同时读取8个array里的数据。
Burst Mode
一个array是一个2d结构,逻辑上我们可以一次读取一个array的一行的多个bit,这就是burst Mode。但是数据线的数量是固定的,所以实际流程是:先将一行的多个bit cache到放大器中,然后通过数据线每次输出一个bit。
这个bit数叫做 Burst Len。
DDR Gen | DDR2 | DDR3 | DDR4 | DDR5 |
Burst Length | 4 | 8 | 16 | >=16 |
chip & rank

进一步,多个bank组成了一个chip。如上图,一个chip有8个bank,一个bank有8个array。
但是需要注意的是不同bank之间并不共享地址线。具体来说,比如上图,给到Memroy Controller的地址里有3位是代表bank地址的,通过bank地址来选择对应的bank进行操作。所以DRAM的地址组成包括了bank,row,col。
类似的,多个bank逻辑上也是可以同时访问的。Cuda编程里的bank冲突就是指,一个wrap的32个线程同时访问一个或少数几个bank,而对同一个bank的访问只能串行,因此就会消耗更多的cycle。解决bank冲突就是想办法让一个wrap内的32个线程,同时访问32个bank上的数据,这样32个bank的访问可以并行,一个cycle可能就完成了。
rank
类似多个chip组成一个rank


值得注意的是,一个rank内的多个chip是共享地址线的, 也就是说每次都会访问所有chip上的同一个位置的bank。bank内部则是访问所有array的同一个位置的cell。
上图中一个bank有8个chip,一个bank有8个array,所以数据线为:8 * 8 = 64
地址对齐
在上图的结构中,一次访存的最小粒度实际是64bit=8个byte,也就是DRAM地址是以数据线宽度为单位的。 但是我们程序员能控制的地址代表的数据最小粒度是一个byte。 两者是不匹配的,这是造成地址对齐的根本原因。
我们用程序员地址代表我们在程序中控制的地址,其逻辑上,访问数据粒度为1个byte.
用DRAM地址代表DRAM地址线的地址,其访问数据的粒度为数据线宽度,这里为8个byte.
假如我们访问一个int64_t, 其程序员地址:
0x0
,那么我们一次访存就可以取出来。对应DRAM地址为0x0
.假如我们访问一个int64_t, 其程序员地址:
0x4
, 则需要两次次访存,需要将第一次的后4个byte和第二次的前4个byte进行拼接。两次分别的DRAM地址为:0x0
, 0x1
DRAM小结
DRAM层次为: cell -> array -> bank -> chip -> rank, rank就是我们插的内存条
array通过 行地址 和 列地址 定位到一个cell(bit).
bank内的多个array共享地址线,每次都会访问所有array的相同位置的cell。
给到chip的地址包含bank地址,所以chip内每次只会激活一个bank。
rank内的多个chip共享地址线,包括bank地址,每次都会访问所有chip的相同位置的bank。
DRAM地址由三部分组成:bank地址,行地址,列地址。
由于DRAM组织层次以及地址线共享的物理关系,造成了DRAM地址和程序员地址的粒度不统一,进一步引入了地址对齐的问题。
由于有burst mode的存在,访问连续地址会有性能优势。(这里和CPU cache无关,而是DRAM芯片的特性)
DRAM的dynamic代表需要定期刷新电容电荷,random则代表了访问任意一个地址需要的时间都是一样的。
SRAM

SRAM的cell和DRAM cell不同,它不需要定期刷新,所以是 Static RAM,也更快。
同时一个DRAM CELL只需要一个晶体管,而SRAM CELL需要6个,使得SRAM需要更大的面积,更高的成本。
通常SRAM的层次组织到chip就为止了,并且可以同时访问多个bank,不像DRAM内,chip内一次只会访问一个bank。
Bank 冲突
在NV GPU的SRAM中,有32个bank,并且这32个bank可以在同时访问.
NV调度的基本单位是一个wrap-32个thread, 如果某一条访存指令,32个thread访问的都是不同的bank,那么一个cycle就可完成,反之如果都访问同一个bank,则需要串行等待,因为一个bank一次只能读取一个地址的数据。 (并且SRAM似乎没有Burst mode)
为了避免bank 冲突,则需要程序员精心编排一个wrap内不同thread的同一条指令的访存地址,让他们尽量分布在不同的bank上。
总结
DRAM是dynamic random-access memory的缩写,这里的dynamic random-access是什么意思?
为什么会有地址对齐,为什么如果需要读取未对齐的数据,可能需要两次访存?
nv gpu 里面为什么会有bank冲突?怎么在CPU上没有怎么听说
经过学习,这几个问题都有了答案。
Prev
Bank Conflict Free问题建模,异或方法的数学原理
Next
TPU 脉动阵列 笔记
Loading...