本文描述在存储器层次结构中使用的技术,特别是在构建 Cache 和主内存中。这些技术包括 SRAM(static randomaccess memory)、DRAM(dynamic random-access memory)和闪存(Flash)。这些中的最后一个被用作硬盘的替代品,但是由于其特性基于半导体技术,因此适合在本文中进行介绍。

 

使用 SRAM 满足了减少对 Cache 的访问时间的需求。但是,当发生 Cache 未命中时,我们需要尽快从主存中移出数据,这需要高带宽的内存。可以通过将构成主存储器的许多 DRAM 芯片组织到多个存储体中,并使存储器总线更宽,或者同时执行这两种操作,来实现这种高存储带宽。

 

为了使存储器系统能够满足现代处理器的带宽需求,在 DRAM 芯片内部开始出现一些创新。本文介绍存储器芯片内部的技术以及那些创新的内部结构。

 

随着突发传输存储器的引入(现已广泛用于闪存和 DRAM 中),存储器的延迟主要由访问时间和周期时间来组成。其中访问时间是从发出读请求至收到所需字之间的时间,周期时间是指对存储器发出两次不相关请求之间的最短时间。

 

自 1975 年以来,几乎所有计算机都将 DRAM 用于主存储器,将 SRAM 用于高速缓存,其中的 L1 到 L3 Cache 与 CPU 集成在处理器芯片上。PMD 必须在功率和性能之间取得平衡,并且由于它们具有更适度的存储需求,因此 PMD 使用闪存而不是磁盘驱动器,台式计算机也越来越遵循这一决定。

 

SRAM 技术

SRAM 的首字母代表静态。DRAM 中电路的动态特性要求在读取数据后将其写回,因此访问时间与周期时间之间的差异,并且需要刷新。SRAM 不需要刷新,因此访问时间非常接近周期时间。SRAM 通常每 bit 数据需要使用六个晶体管,以防止信息在读取时受到干扰。SRAM 仅需要最小的功率即可将电荷保持在待机模式。

 

在早期,大多数台式机和服务器系统都将 SRAM 芯片用于其一级、二级或三级 Cache。如今,所有三个级别的 Cache 都已集成到处理器芯片中。在高端服务器芯片中,可能有多达 24 个内核和多达 60 MiB 的 Cache。这样的系统通常每个处理器芯片配置 128~256GiB 的 DRAM。大型的三级片上 Cache 的访问时间通常是二级 Cache 的 2~8 倍。即使是这样,L3 访问时间通常至少比 DRAM 访问快 5 倍。

 

片上 Cache SRAM 通常以与高速缓存的块大小匹配的宽度进行组织,并且 Tag 与每个块并行存储。这样可以在单个周期将整个块读出或写入。当将未命中后获取的数据写到 Cache 中或从 Cache 中写回块时,此功能特别有用。Cache 的访问时间与缓存中的块数成正比,而能耗取决于缓存中的位数(静态功率)和块数(动态功率)。组相联 Cache 会减少对内存的初始访问时间,因为内存的大小较小,但是会增加命中检测和块选择的时间。

 

DRAM 技术

随着早期 DRAM 容量的增长,带有所有必需地址线的封装的成本成为一个问题。解决方案是多路复用地址线,从而将地址引脚的数量减少一半。下图显示了基本的 DRAM 组织。在行访问选通(RAS)期间,首先发送地址的一半。紧随其后在列访问选通(CAS)期间发送的地址的另一半。这些名称来自内部芯片组织,因为存储器是按行和列寻址的矩形矩阵进行组织的。

 

 

DRAM 的附加要求来自其首字母 D 所表示的动态特性。为了在每个芯片上存储更多的位,DRAM 仅使用单个晶体管来存储一个 bit。读取时,将一行放入行缓冲区,CAS 信号可以在其中选择要从 DRAM 读取的行的一部分。由于读取行会破坏信息,因此在不再需要该行时必须将其写回。这种写回以重叠的方式发生,但是在早期的 DRAM 中,这意味着可以读取新行之前的周期时间大于读取一行并访问该行的一部分的时间。

 

另外,为了防止由于单元中的电荷泄漏(假设未读取或写入)而造成的信息丢失,必须定期“刷新”每个位。幸运的是,只需读取该行并将其写回,就可以同时刷新一行中的所有位。因此,存储系统中的每个 DRAM 必须在一定的时间范围内(例如 64 ms)访问每一行。DRAM 控制器其中就包括用于定期刷新 DRAM 的硬件。

 

此要求意味着该存储系统有时不可用,因为它正在发送信号告诉每个芯片刷新。刷新的时间是行激活和预充电,该预充电也将行写回(大约需要 2/3 的时间来获取数据,因为不需要选择列),而 DRAM 的每一行都需要这样做。因为 DRAM 中的存储矩阵在概念上是平方的,所以刷新中的步数通常是 DRAM 容量的平方根。DRAM 设计人员试图将花在刷新上的时间保持在总时间的 5%以下。实际上,对于 SDRAM、DRAM 控制器(通常在处理器芯片上)试图通过避免打开新行并在可能的情况下使用块传输来优化访问。

 

根据经验,Amdahl 建议内存容量应随处理器速度线性增长,以保持系统平衡。因此,1000MIPS 处理器应具有 1000 MiB 的内存。处理器设计人员依靠 DRAM 来满足这一需求。过去,他们预计容量每三年提高四倍,即每年提高 55%。不幸的是,DRAM 的性能以非常慢的速度增长。性能提高较慢的主要原因是行访问时间的减少较小,而行访问时间的减少取决于诸如功率限制和单个存储单元的充电容量(以及大小)之类的问题。

 

改善 DRAM 芯片内部的内存性能:SDRAM

尽管非常早的 DRAM 包含一个缓冲器,该缓冲器允许对单个行进行多列访问,而无需进行新的行访问,但它们使用了异步接口,这意味着每个列访问和传输都涉及与控制器同步的开销。在 1990 年代中期,设计人员将时钟信号添加到 DRAM 接口,以便重复的传输不会承担该开销,从而创建了同步 DRAM(SDRAM)。除了减少开销外,SDRAM 还允许添加突发传输模式,在这种模式下可以进行多次传输而无需指定新的列地址。通常,通过将 DRAM 置于突发模式,可以在不发送任何新地址的情况下进行八次或更多次 16 位传输。

 

为了克服随着 DRAM 密度增加而从内存获得更多带宽的问题,使 DRAM 变得更宽。最初,他们提供了一种四位传输模式。在 2017 年,DDR2、DDR3 和 DDR DRAM 拥有多达 4、8 或 16 位总线。

 

在 2000 年代初期,引入了进一步的创新:双倍数据速率(DDR),它使 DRAM 在时钟的上升沿和下降沿都能传输数据,从而使峰值数据速率加倍。

 

最后,SDRAM 引入了 banks,以帮助进行电源管理,缩短访问时间并允许对不同 banks 进行交错和重叠访问。对不同 banks 的访问可以相互重叠,并且每个 bank 都有自己的行缓冲区。在 DRAM 中创建多个 banks 实际上可以将另一个段添加到该地址,该段现在由 banks 号、行地址和列地址组成。发送指定新 bank 的地址时,必须打开该 bank,这会导致额外的延迟。Banks 和行缓冲区的管理完全由现代内存控制接口处理,因此,当后续访问为打开的 banks 指定同一行时,访问可以快速发生,仅发送列地址。

 

为了启动新的访问,DRAM 控制器发送一个 bank 和行号(在 SDRAM 中称为激活,在以前称为 RAS- 行选择)。该命令将打开该行并将整个行读入缓冲器。然后可以发送列地址,并且 SDRAM 可以传输一个或多个数据项,具体取决于它是单项请求还是突发请求。在访问新行之前,必须对 bank 进行预充电。如果该行位于同一 bank 中,则可以看到预充电延迟;但是,如果该行在另一个 bank 中,则关闭该行并进行预充电可能会与访问新行重叠。在同步 DRAM 中,每个命令周期都需要整数个时钟周期。

 

从 1980 年到 1995 年,DRAM 按照摩尔定律进行扩展,每 18 个月将容量增加一倍(或 3 年内增加 4 倍)。从 1990 年代中期到 2010 年,容量增长速度变慢,两次增长之间的间隔时间约为 26 个月。从 2010 年到 2016 年,容量仅增加了一倍!下表显示了各种 DDR SDRAM 的容量和访问时间。从 DDR1 到 DDR3,访问时间缩短了约 3 倍,或每年约 7%。DDR4 相比 DDR3 改善了功耗和带宽,但是具有类似的访问延迟。

 

 

如上表所示,DDR 是一系列标准。DDR2 通过将电压从 2.5V 降至 1.8V 来降低 DDR1 的功耗,并提供更高的时钟速率:266、333 和 400 MHz。DDR3 将电压降至 1.5 V,最大时钟速度为 800MHz。DDR4 于 2016 年初批量供货,但预计在 2014 年将其电压降至 1–1.2 V,最大预期的时钟频率为 1600 MHz。DDR5 不太可能在 2020 年或更晚之前达到量产。

 

随着 DDR 的引入,内存设计人员越来越关注带宽,因为很难缩短访问时间。较宽的 DRAM、突发传输和双倍数据速率均导致内存带宽快速增加。DRAM 通常在称为双列直插式内存模块(DIMM)的小板上出售,该模块包含 4~16 个 DRAM 芯片,通常将其组织为 8 字节宽(+ ECC),用于台式机和服务器系统。将 DDR SDRAM 封装为 DIMM 时,它们的峰值 DIMM 带宽会令人困惑。因此,DIMM 名称 PC3200 来自 200 MHz×2×8 个字节,即 3200 MiB / s。为避免混淆,芯片本身被标记为每秒位数而不是时钟速率,因此 200 MHz DDR 芯片称为 DDR400。下表显示了 I / O 时钟速率、每芯片每秒的传输次数、芯片带宽、芯片名称、DIMM 带宽和 DIMM 名称之间的关系。

 

 

减少 SDRAM 内的功耗

动态存储芯片的功耗包括读写中使用的动态功耗和静态或待机功耗。两者都取决于工作电压。在最先进的 DDR4 SDRAM 中,工作电压已降至 1.2 V,与 DDR2 和 DDR3 SDRAM 相比,功耗大大降低。存储体的增加还降低了功耗,因为仅读取单个存储体中的行。

 

除了这些更改之外,所有最新的 SDRAM 都支持掉电模式,通过告诉 DRAM 忽略时钟来进入该模式。掉电模式会禁用 SDRAM,内部自动刷新除外。下图显示了 2 GB DDR3 SDRAM 在三种情况下的功耗。从低功耗模式返回所需的确切延迟取决于 SDRAM,典型的延迟是 200 个 SDRAM 时钟周期。

 

 

图形数据 RAM

GDRAM 或 GSDRAM(Graphics orGraphics Synchronous DRAMs)是基于 SDRAM 设计的一类特殊的 DRAM,为处理图形处理单元的更高带宽需求而量身定制。GDDR5 基于 DDR3,早期的 GDDRs 基于 DDR2。由于图形处理器单元(GPU)的每个 DRAM 芯片比 CPU 需要更多的带宽,因此 GDDR 具有几个重要的区别:

   

1. GDDR 具有更宽的接口:32 位。

   

2. GDDR 在数据引脚上具有更高的最大时钟速率。为了允许更高的传输速率而不会引起信号问题,与通常以可扩展的 DIMM 阵列排列的 DRAM 不同,GDRAM 通常直接连接到 GPU 并通过将它们焊接到板上而连接。

 

总的来说,这些特性使 GDDR 的运行带宽是 DDR3 DRAM 的 2 至 5 倍。

 

封装创新:堆叠或嵌入式 DRAM

2017 年 DRAM 中的最新创新是封装创新,而不是电路创新。它将多个 DRAM 以堆叠或相邻的方式放置在与处理器相同的封装中。(嵌入式 DRAM 也用于指将 DRAM 放置在处理器芯片上的设计)。将 DRAM 和处理器放置在同一封装中可降低访问延迟(通过缩短 DRAM 和处理器之间的延迟),并可能通过允许更多连接来增加带宽。处理器与 DRAM 之间的连接速度更快,因此一些生产商将其称为高带宽内存(High BandwidthMemory,HBM)。

 

该技术的一种版本是使用焊点技术将 DRAM Die 直接放置在 CPU Die 上。假设有足够的热量管理,则可以以这种方式堆叠多个 DRAM。另一种方法是仅堆叠 DRAM,并使用包含连接的基板(中介层)将它们与 CPU 放在单个封装中。下图展示了这两种不同的互连方案。已经证明了可以堆叠多达 8 个芯片的 HBM 原型。对于特殊版本的 SDRAM,这种封装可以包含 8 GiB 内存,数据传输速率为 1 TB / s。2.5D 技术目前可用。因为必须专门制造芯片以堆叠,所以大多数早期使用很有可能会用在高端服务器芯片组中。

 

 

在某些应用程序中,可能会在内部封装足够的 DRAM 以满足应用程序的需求。例如,NvidiaGPU 正在使用 HBM 开发用作专用集群设计中的节点,并且 HBM 可能会成为高端应用的 GDDR5 的后继产品。在某些情况下,可能会使用 HBM 作为主存储器,尽管目前的成本限制和散热问题使该技术无法用于某些嵌入式应用程序。

 

Flash 存储器

Flash 是一种 EEPROM(电子可擦除可编程只读存储器),通常是只读的,但可以擦除。Flash 的另一个关键特性是无需任何电源即可保存其内容。我们专注于 NAND Flash,它比 NOR Flash 具有更高的密度,并且更适合于大型非易失性存储器。缺点是访问是顺序的,并且写入速度较慢,如下所述。

 

Flash 用作 PMD 中的辅助存储,其方式与笔记本电脑或服务器中磁盘的功能相同。此外,由于大多数 PMD 的 DRAM 数量有限,因此 Flash 还可以充当内存层次结构的一级。

 

Flash 使用的架构与标准 DRAM 完全不同,并且具有不同的属性。最重要的区别是:

   

1. 对 Flash 的读取是连续的,并且是读取整个页面,该页面可以是 512 字节、2 KiB 或 4 KiB。因此,NAND Flash 在从随机地址访问第一个字节时会有较长的延迟(约 25us),但是可以以约 40 MiB / s 的速度访问页面块的其余部分。相比之下,DDR4 SDRAM 到第一个字节大约需要 40 ns 的时间,并且可以 4.8 GiB / s 的速度传输其余行。比较传输 2 KiB 内容的时间,NAND 闪存大约需要 75μS,而 DDR SDRAM 则需要不到 500 ns,这使 Flash 慢了大约 150 倍。但是,与磁盘相比,从 Flash 读取 2 KiB 的速度要快 300 到 500 倍。从这些数字中我们可以看到为什么闪存不是替代 DRAM 替代主存储器的候选者,而是替代磁盘的候选者。

   

2. 在重写覆盖 Flash 之前,必须先对其擦除,然后按块而不是单个字节或字进行擦除。此要求意味着,当必须将数据写入 Flash 时,必须将整个块组装为新数据,或者将要写入的数据与块的其余内容合并。对于写操作,Flash 的速度比 SDRAM 慢 1500 倍,是磁盘的 8 到 15 倍。

   

3. Flash 是非易失性的(即使不加电,它也会保留其内容),并且在不进行读写时消耗的功率要少得多。

   

4. Flash 限制了任何给定块的写入次数,通常至少为 100000。通过确保写入块在整个存储器中的均匀分布,系统可以使 Flash 系统的寿命最大化。这种技术称为写均衡,由 Flash 控制器处理。

   

5. 高密度 NAND Flash 比 SDRAM 便宜,但比磁盘贵:Flash 大约为 2 美元 / GiB,SDRAM 为 20 美元至 40 美元 / GiB,磁盘为 0.09 美元 / GiB。在过去的五年中,Flash 的成本降低速度几乎是磁盘的两倍。

 

相变存储技术(Phase-Change MemoryTechnology,PCM)

相变存储器(PCM)几十年来一直是活跃的研究领域。该技术通常使用一个小的加热元件来改变块状衬底在其具有不同电阻特性的晶体形式和非晶形式之间的状态。每一位对应于覆盖衬底的二维网络中的交叉点。通过感测 x 点和 y 点之间的电阻(因此称为忆阻器)来完成读取,通过施加电流来改变材料的相位来完成写入。与 NAND Flash 相比,缺少有源器件(如晶体管),可降低成本并提高密度。

 

2017 年,美光和英特尔开始提供 Xpoint 存储芯片,该芯片被认为是基于 PCM。预计该技术将比 NAND Flash 具有更好的写入耐久性,并且由于消除了在写入之前擦除页面的需要,因此与 NANDFlash 相比的写入性能提高了十倍。读取延迟也比 Flash 好 2 到 3 倍。最初,它的价格预计会略高于 Flash,但是写入性能和写入耐久性方面的优势可能使其具有吸引力,尤其是对于 SSD。如果这项技术可以很好地扩展并且能够实现进一步的成本降低,那么固态磁盘技术将取代磁盘,磁盘已成为主流的非易失性主要存储设备,已经使用了 50 多年。

 

提高存储器系统的可靠性

大型 Cache 和主存储器显着增加了在制造过程中以及在操作过程中动态发生错误的可能性。由电路变化引起且可重复的错误称为硬错误或永久性故障。硬错误可能在制造期间发生,也可能在操作期间发生电路变化(例如,多次写入后 Flash 单元发生故障)。所有 DRAM、Flash 和大多数 SRAM 都制造有备用行,因此可以通过编程用备用行替换有缺陷的行来容纳少量的制造缺陷。动态错误是对单元内容的更改,而不是电路的更改,称为软错误或瞬态故障。

 

动态错误可以通过奇偶校验位进行检测,并可以通过使用纠错码(ECC)进行检测和修复。因为指令高速 Cache 是只读的,所以奇偶校验就足够了。在较大的数据高速 Cache 和主存储器中,ECC 用于检测和纠正错误。奇偶校验仅需要开销的一小部分就可以检测到一系列位中的单个错误。由于奇偶校验不会检测到多位错误,因此必须限制由奇偶校验位保护的位数。每 8 个数据位一个奇偶校验位是一种典型的比率。ECC 可以检测两个错误并纠正单个错误,每 64 个数据位的开销为 8 位。

 

在非常大的系统中,多个错误以及单个存储芯片完全故障的可能性变得十分明显。为了解决此问题,IBM 引入了 Chipkill,许多大型系统(例如 IBM 和 SUN 服务器以及 Google 集群)都使用了这项技术。Chipkill 本质上与磁盘使用的 RAID 方法类似,其分散数据和 ECC 信息,在单个存储器芯片完全失效时,可以从其余存储器芯片中重构丢失数据。根据 IBM 的分析,假设有 10000 个的服务器(每个处理器 4 GiB 存储器),在三年的运行中产生无法恢复的错误数目如下所示:

 

仅奇偶校验:大约 90000 个,或者说每 17 分钟发生一次不可恢复的(或无法检测到的)故障。

 

仅适用于 ECC:大约 3500 个,或者说每 7.5 小时大约有一个未检测到或无法恢复的故障。

 

Chipkill:每 2 个月大约发生一次未被发现或无法恢复的故障。

 

解决此问题的另一种方法是在错误率与 Chipkill 相同的情况下找到可以保护的最大服务器数量(每个服务器具有 4 GiB 存储器)。采用奇偶校验,即使是只有一个处理器的服务器,其不可恢复的错误率也将高于具有 10000 个服务器的、受 Chipkill 保护的系统。对于 ECC,具有 17 个服务器的系统的故障率将与具有 10000 个服务器、受 Chipkill 保护的系统的故障率大致相同。因此,对于仓库级计算机,其具有 50000~10000 个服务器,需要 Chipkill 技术来保护。