计算机体系结构学习(6)——存储器组织、Banking
(2024-07-17 10:27:49)
标签:
it |
分类: 技术 |
存储是计算系统的重要组成之一,从应用角度,现在计算系统需要处理的数据是非常庞大的;从性能角度,提升内存的访问速度对流水线停顿等有着极大的改善;从能耗角度,内存访问消耗的能量大约是一次复杂加法的几百倍,大部分的性能能耗其实用在了移动数据上;从安全角度,研究存储系统可以提升安全性与可靠性。
这篇文章我们将介绍存储器基础,并介绍banking技术。
1. 存储组织
1.1 虚拟 -> 物理内存
从程序员的角度看内存是:
程序员看到的是虚拟内存,可以认定虚拟内存的容量是无限的。
实际上,物理内存的大小是十分有限的,通过系统软件与硬件协同,会将虚拟内存地址映射到物理内存,系统自动管理物理内存空间,且对程序员是不可见的。
虚拟内存的好处是,程序员无需关心内存大小,一个小小的物理空间可以对外表现为很大的内存,但是系统软件架构会更难设计。
不过现在我们先忽略虚拟到物理内存的映射,先只考虑物理内存,后续的文章会更详细地介绍虚拟内存。
1.2 存储单元
常用的存储单元有:
存储单元 访问速度 价格 一般用于
触发器/锁存器 非常快,能够并行访问 非常贵 内部寄存器(RegFile)
SRAM 较快 较贵 Cache
DRAM 较慢,且为破坏性读 较便宜 主存
flash、硬盘、磁盘 非常慢,且为非易失性内存 非常便宜 外存
Register
在与非门构成的DFF中,主从锁存都需要4个与非门,一共就是8个与非,每个与非门需要4个mos管,也就是说一个DFF需要32个mos管,存储密度低
在同步电路中,通常使用DFF缓存数据,几乎不需要响应时间,速度最快,是整个存储系统层次的最顶层
通常用于做CPU内部寄存器,保存指令执行过程中临时存放的操作数和中间(或最终)的操作结果
SRAM(Static Random Access Memory)
用两个交叉耦合的反相器存储1bit数据(4个晶体管)
用2个晶体管实现访问
组成为:6个晶体管
贵、快、存储密度较低
DRAM(Dynamic Random Access Memory)
用电容的充电情况表示存储的数据,如果是充满电的则存储的是1,反之存的为0
通过对电容充放电,实现写数据
从DRAM读数据是破坏性的,需要刷新
组成为:1个电容+1个晶体管
慢、便宜、存储密度较高
1.3 内存阵列
一个有N位地址线、M位数据的内存,有
一个4*3的内存阵列如下图,根据地址译码,驱动相应行,读出这一行存储的数据:
其中的存储单元常采用DRAM、SRAM:
2. 搭建更大容量的内存
大容量的内存需要更多的存储单元,但是存储器越大,也意味着访问越慢,那么如何做到大内存、且访问不是特别慢呢?
一个思路是,把内存分成更小的阵列,并将它们互连到输入/输出总线上。
2.1 Banking
问题:一个单片的大内存阵列访问耗时很长,并且不能并行进行多个访问
目标:减小内存阵列访问的延迟,并且使能够并行访问内存
基本思想:把一个大阵列分成多个banks,使它们在同一个周期/连续周期内能够独立地访问
例如,将内存分成16个banks,这样就可以在每个周期完成一个bank的访问,也可以一次访问N个banks(要访问的数据在不同的bank中):
广义的内存结构为:
Channel → Rank → Bank
2.2 DRAM子系统
自上而下地看DRAM内存系统:
Channel → DIMM (Dual in-line memory module):
DIMM → Rank:
Rank → Chip:
Chip → Bank:
Bank → row&column:
Bank内部实际上还被划分为Sub-Banks,例如下面两张图:
Kim et al., “A Case for Exploiting Subarray-Level Parallelism
in DRAM,” ISCA 2012
Seshadri+, “In-DRAM Bulk Bitwise Execution Engine,” ADCOM
2020
2.3 举例:Cache在内存系统的实现
Cache指高速缓存,一般把常用的数据、指令放在Cache中。
假设物理内存空间的低64bit为Cache区域,从Rank0的8个Chip下面的、第一个Bank中的、Row0 Col0
处获得8bit数据,作为cache的8bit存储空间:
(蓝色的为row buffer)
由于banking机制,这8bit的数据是可以并行访问的,这也是cache高速的原因。
以此类推,继续获得第二个8bit数据:
这样一个64bit的cache块需要8个周期实现数据传输,一次读取8bit数据。
2.4 访问内存Bank的步骤
1) 行译码,驱动响应字线
2) 被选择的bits驱动位线
3) 放大行数据信号,读到row buffer
4) 列译码,选择行中相应的数据输出
5) 提前给位线充电,为下一次访问做好准备
参考:
ETH苏黎世联邦理工学院 Onur Mutlu教授的《数字设计与计算机体系结构》课程

加载中…