基于标准DDR总线的内存扩展芯片的设计与实现①

2020-04-21 02:28赵阳洋陈明宇张雪琳
高技术通讯 2020年3期
关键词:事务命令内存

赵阳洋 陈明宇 金 旭 阮 元 张雪琳

(*中国科学院计算技术研究所计算机体系结构国家重点实验室 北京 100190) (**中国科学院大学 北京 100049) (***鹏城实验室 深圳 518055)

0 引 言

计算机领域已进入以数据为中心的大数据时代,大数据所催生的内存计算和具有越来越多核心的处理器,对内存的速度、容量、功耗和可靠性等提出了更高的要求。近年来新兴非易失性随机存储介质(non-volatile memory, NVM) 的访问性能在逐步逼近动态随机访问存储器(dynamic random-access memory, DRAM),因此产生了越来越多的基于新型存储器件和传统DRAM设计新型混合内存的研究[1,2],旨在实现内存的扩展和加速。

新型内存系统需要在总线上接入不同延迟的部件,方便实现网络化或混合存储,为此往往选用异步传输总线,每个事务的请求阶段和响应阶段是相互独立的,以提供更好的灵活性。例如,Intel、AMD和Sun等公司早期曾推出支持全缓冲内存(fully buffered DIMM, FBDIMM)[3]的处理器,但因其无法兼容市场上的通用内存模块,因此没有普及。

在主板芯片组上完成总线事务转换,可以实现兼容通用内存,目前服务器市场的很多公司采用了类似的技术。Intel可扩展内存缓冲(scalable memory buffer, SMB)应用于其高端服务器系统[4]。IBM公司 Power8处理器的内存控制器通过高速串行总线与一个Centaur缓冲芯片相连[5]。这类板上缓冲提供了良好的内存扩展能力,但是处理器与板上缓冲芯片之间的总线事务传输还未形成标准,一是缓冲芯片与其他厂商的处理器不兼容,二是缓冲芯片之间互相不兼容。

混合内存立方体(hybrid memory cube, HMC)[6]是内存颗粒厂商Micron 联合Intel 提出的一种新型内存总线标准,处理器与内存之间只有异步传输总线,内存颗粒采用3维堆叠封装技术将类似缓冲芯片的逻辑晶粒和存储晶粒封装到一个芯片中。HMC提供了良好的带宽和功能扩展性,并可支持存储颗粒的级联。但是HMC架构下的处理器和内存都无法与之前的器件兼容。

综上,各种新型内存系统在异步传输事务时缺乏统一标准,导致兼容性问题。当前主流计算机系统基本仍采用双倍速率(double data rate,DDR)总线协议,为此,产业界一直在积极探索通过DDR总线实现新型内存系统访问的方法,异步传输DDR有可能在未来几年被市场所接受。

利用DDR总线访问闪存(flash) 的产品已经面世,Diablo Technologies[7]公司提出了基于DDR3接口访问闪存的内存通道存储(memory channel storage, MCS) 技术,这套技术被JEDEC 组织采纳为NVDIMM-F标准[8]。但MCS访问闪存依然是按照存储资源的方式读写,只是利用DDR 总线传输数据,还不能被处理器识别为内存。UniMA[9]通过一个修改的DDR总线扩展内存容量,支持不同延迟的存储介质如相变存储器(phase change memory, PCM) 等。该方案虽然基于DDR总线,但修改了协议,内存控制器需要相应做修改。

Intel一种新的内存模组(Apache Pass) 通过DDR4物理兼容的总线与处理器相连[10]。DDR4物理兼容总线DDR-T修改了一组不用的使能、片选信号方向,变成由缓冲端驱动才实现异步传输请求。Samsung也与Netlist联合推出了NVDIMM-P[11],以兼容DDR4的方式实现高性能闪存访问。

上述研究都不可避免地对现有DDR协议做了修改,难以直接应用到当前主流计算机系统中。本文提出了一种在现有的标准DDRx协议上实现异步传输事务的方案,解决新型内存系统的兼容性问题,并进行了流片验证。

1 关键技术分析

根据上一节分析,本文的主要目标是在不修改现有的DDR时序协议基础上,实现基于DDR总线的异步数据传输,以使当前主流处理器可以通过标准DDR总线接口,连接支持可变延迟访问的新型内存系统。内存扩展芯片的外部连接和内部主要功能模块如图1 所示。

图1 系统整体架构

其中,处理器通过标准DDR总线接口与内存扩展芯片连接。DDR从设备接收来自主机的访存命令,经过芯片内部的事务处理缓冲模块后,由片上集成的内存控制器访问新型内存。

1.1 满足DDR协议时序要求

从图1 中可以看到,处理器的从设备不再是标准内存颗粒,而是自定制的内存扩展芯片,其访问新型内存的请求延迟不是固定的。为满足DDR协议的时序要求,即在等待一个固定的延迟(如读命令该延迟为tCL)之后及时返回请求信息,在内存扩展芯片中设计了DDR从设备模块。该模块严格满足DDR协议读写时序要求[12]。

另外,处理器在开机后,首先会进入基本输入输出系统(basic input output system, BIOS)。BIOS会按照DDR协议完成内存的初始化,执行一些标准读写操作,训练好DDR总线,确保可以根据DDR总线上DQS信号采样到准确的数据(DQ)。在内存初始化阶段,DDR从设备模块负责处理读写命令,使内存扩展芯片通过读写训练过程,为此在芯片上增加1个8 kB大小的片上随机存储器(random access memory, RAM),在初始化完成后,该片上RAM又可用于存储配置或调试信号。对处理器来讲,访问内存扩展芯片和访问标准内存颗粒的时序是一样的。

但是DDR从设备模块返回数据仅能保证满足DDR总线的时序要求,却无法保证数据的正确性。例如,在读新型内存或者调用内存扩展功能时,获取到读请求数据的延迟通常会超过tCL这一DDR总线读延迟要求,即DDR从设备按时序要求返回的读数据是自定义的无效数据。

1.2 保证异步传输数据正确性

为保证数据正确性,采用twin-load (2次访存)的方法[13]。2次访存是处理器端用一个完整的DDR命令作为访问请求的请求阶段,然后根据请求类型等待合适的时间,再用一个DDR命令作为访问请求的响应阶段。2个DDR命令配对实现异步传输事务。在处理器端,仅需要对发送访问请求的软件做修改,产生可以获取正确数据的DDR读写命令序列。

为支持2次访存方法,内存扩展芯片在事务处理缓冲模块中,分别为读事务和写事务定制专属的状态机,以响应DDR访存命令序列中不同阶段的命令,且负责产生与各阶段匹配的访存命令发送给内存控制器。

异步传输事务由不同的DDR命令序列组合而成,处理时不能只看当前命令信息,必须考虑其上下文。而且,同一命令序列中,各访存请求并没有固定的延迟,内存扩展芯片无法预测下一条命令会在何时到达。

为保证数据正确性,需要为每一个处理中的事务建立一条记录,维护其状态和处理时占用的资源。针对未完成的请求,事务处理缓冲模块维护一个事务信息表(transaction info table, TIT),TIT记录了每一个访存命令的状态,根据其对应表项,确定每个DDR命令的返回数据。

1.3 访存指令扩展

传统内存一直被DDR协议的读写时序限定成一种简单、被动的装置,缺乏有效的扩充功能的手段。如上节所述,应用2次访存的方法后,处理器将单一的读写请求拆分为异步传输的DDR读写命令序列,内存扩展芯片按照每一条事务记录的状态,响应访存请求。该方法同样适用于实现复杂访存指令。为了区别于常规的读写请求,处理器可以为每一种类别的复杂访存指令设定特殊的访存地址,则内存扩展芯片根据访存地址即可判断复杂访存指令类别,并启动相应的状态机响应请求。

为实现访存指令的扩展,内存扩展芯片还需要完成复杂访存指令的解析和处理。为此,在事务处理缓冲模块中设置了一个简单的可编程事务处理单元(transaction processing unit, TPU),用以解析和处理复杂访存指令[14]。

TPU将一条复杂指令看作一个需完整执行的事务,也就是在当前事务完成前不接收其他指令。这样设计的好处是,事务处理单元一旦启动一条复杂指令的处理,就可以按照一个预先设定好的流程进行,期间无需考虑其他访存请求的干扰,功能简单,易于硬件实现。若要支持同时处理多条复杂指令,只需支持事务级的并行,即硬件实例化多个事务处理单元,简单方便。

目前实现的版本中,内存扩展芯片支持的复杂访存指令,包括内存拷贝(memcpy)、预取读(prefetch)、冲刷写(flush)、分散聚集读写(scatter-gather)、清除(clear)、原子加(atom-add)、测试并置位(test & set)、比较并交换(compare & swap)。

上述复杂访存操作在主流计算机系统中经常使用,往往由处理器维护一个访存指令序列,序列中每一条指令的处理都要处理器读源数据或写入目的数据,数据经由复杂存储层次进出处理器。但在内存扩展芯片中增加TPU后,处理器仅需将复杂访存指令处理所需的信息,用一个DDR写命令写入特殊的访存地址,然后在一段时间之后,用一个DDR读命令获取该地址的响应信息即可。对指令序列的解析和处理,全部交由TPU完成,避免处理器大量读写动作,从而提高带宽利用率,降低数据进出处理器的功耗。

1.4 访存加速

内存扩展芯片基于DDR总线实现了异步传输访存请求,支持新型内存可变的访问延迟,其代价是增加了单条访存指令的访问延迟。但是当访存指令序列批量传输时,仍有可能通过优化访存请求序列,或应用预取、分散聚集读写等复杂访存指令,实现批量访存请求的加速。

为此,在事务处理缓冲模块中,增加了命令调度模块,以调度所有访存请求并转发给内存控制器。同时,增加了一个以64字节为单位的内部RAM作为行缓存(读写位宽是标准的DDR突发长度),以存储从内存中读入的数据,加速处理器端的访问请求。

2 内存扩展芯片

2.1 芯片设计

本文基于DDR3 SDRAM标准内存接口,设计内存扩展芯片,命名为Memory Extension Chip,可用于内存加速和内存扩展。芯片内部结构如图2 所示,其中DDR从设备部分按照DDR协议读写时序响应访存请求,事务处理缓冲部分实现读写事务异步传输以及复杂访存指令扩展。

图2 内存扩展芯片内部结构图

内存扩展芯片除上述功能模块外,为方便测试和调试,片内集成了一个单发射32位结构的GS132处理器核,一个反向DDR3的PHY(物理层)控制器,一个SPI(串行外设接口)控制器,一个UART(串口)控制器。另外,还包含一个用于控制测试信号的寄存器测试模块。

整个芯片工作流程如下,芯片接收DDR3命令及数据,然后经过缓冲,发送相应的访存命令及数据到标准内存条;从标准内存条返回的数据存放在缓冲中,下次DDR访问命令到达后直接返回结果。该过程中内存扩展芯片可以进行重发送操作,从而实现内存加速功能。

2.2 芯片信息

基于DDR3 SDRAM标准接口的内存扩展芯片,采用中芯国际40 nm工艺,经流片得到芯片基本信息如表1 所示。芯片正常工作表面温度区间为-40~85 ℃。

表1 内存扩展芯片基本信息

2.3 板卡介绍

内存扩展芯片板卡如图3 所示。其底部可以直接插入标准内存插槽,顶部可连接标准内存条。中间方框部分为内存扩展芯片。

图3 内存扩展芯片板卡

本文主要验证DDR从设备和事务处理缓冲两部分的功能,因此当前芯片版本未选用新型NVM内存。如果要连接新型内存,只要适配专门的控制器和总线接口即可。

3 验证与测试

芯片测试在龙芯3A2000主板进行,主频950 MHz,测试平台如图4 所示,共占用2个内存通道(memory channel,MC),MC1槽和MC0槽都是靠近风扇的通道。其中MC1槽插入标准2 GB内存条,用于启动操作系统;MC0槽插入内存扩展芯片子卡,有4 GB寻址空间,子卡上又插了4 GB标准内存条,作为2次访存操作的实际内存。过程监控装置(Process Monitor, PMON) 为闪存芯片,存储3A2000开机启动时的BIOS源码。

图4 龙芯3A2000测试平台

测试结果表明,在DDR3-1066频率下,内存扩展芯片的全部逻辑模块功能正确,运行稳定。性能评估结果如表2~表5所示。

表2列出了内存扩展芯片单次访存请求获取正确数据的延迟。在大量(大于5 000次)随机读请求测试下,单个读请求的平均延迟时间约为400 ns。在大量连续地址访存时,单个读请求的平均延迟时间小于100 ns。在2次访存机制下,单个读请求需连续读取同一地址,而内存控制器处理相同地址的连续读间隔要远大于不同地址的连续读间隔。因此,读请求并行执行可以降低平均延迟。经测试,当并行度为4时,单个读请求的平均延迟为300 ns。

因2次访存机制,内存扩展芯片单个读请求的平均延迟大于标准DDR3 SDRAM读延迟。但相比PCIe接口约800 ns的延迟,内存扩展芯片约300 ns的读延迟仍有优势。

表2 单个读请求平均延迟

Random Access是高性能计算挑战基准(HPC challenge benchmark, HPCC) 中用于评测内存随机访问性能的程序。它测量了计算机对随机生成的内存地址每秒可以进行多少次更新操作。测试数据量为1 GB,测试结果单位为每秒千兆更新(Giga-uPdates per second, GUPS)。内存系统在访存请求序列为大量随机读写时,性能最差。因为针对大量访存序列的优化调度基本失效,而应用2次访存(twin-load)方法又会造成额外访存开销,导致性能下降。在测试时,软件将标准测试程序中对目标数据元素的读写操作改为twin-load 2次访存方式。如表3 所示,加入内存扩展芯片后,随机访问性能仅能达到原系统的17%。但考虑到新型NVM内存系统的读延迟大约是DRAM的3~4倍,写延迟更是大了一个数量级,因此内存扩展芯片如果用于NVM扩展,即便在其性能最差的场景下,仍然不会成为系统的性能瓶颈。

表3 Random Access性能测试

应用复杂访存指令会提升访存性能。在芯片设计中,scatter-gather一次读操作可以读出8个随机64字节的数据。虽然在建立TIT(1次访存)、配置TPU(1次访存)和读回数据(2次访存)阶段增加了访存操作,但理论上仍然会有性能提升。为此,进行了数据量为1 GB的随机读测试,比较scatter-gather读和使用本地内存读数据的效率,结果如表4所示,时间单位是时钟周期数(T),加入内存扩展芯片后,scatter-gather随机访问性能为原系统的2.32倍。

表4 Scatter-gather性能测试

复杂访存指令在内存扩展芯片上独立执行,有可能避免CPU大量数据的读写动作,从而提高带宽的利用率。为此,进行了内存拷贝(memcpy)带宽测试,其功能为从源地址的起始位置开始,拷贝若干字节到目标地址中。结果如表5 所示,其中,基准(baseline)为处理器运行函数memcpy()访问本地内存;过芯片内存拷贝(Chip_memcpy)为加入内存扩展芯片后,处理器向芯片发送内存拷贝复杂指令访问内存,数据不经过CPU和高速缓存。在基准情况下,分别测试了8 kB、128 kB、1 MB、4 MB、32 MB、256 MB等多种数据量的带宽,随数据量增加,带宽会有所下降,达到32 MB数据量以后,带宽趋于稳定。这是高速缓冲(cache)容量有限导致的。而在过芯片内存拷贝时,带宽基本不受数据量影响。表5中基准选择稳定带宽测试结果,过芯片内存拷贝选择4MB带宽测试结果,可见利用芯片加速内存拷贝可以将性能提升67%。

表5 Memcpy性能测试

4 结 论

本文基于现有的DDR协议,设计实现了内存扩展芯片,在满足DDR总线标准时序要求的同时,支持可变延迟的扩展内存访问,支持访存加速指令的扩展,实现了为内存端增加智能性,可用于内存加速和内存扩展。经过测试验证,该芯片逻辑功能正确,运行稳定。在DDR3-1066频率下,该芯片可满足标准DDR3 SDRAM读写时序,并在龙芯3A系列主板上顺利启动Linux内核。其性能评估结果为,单次访存请求获取正确数据的平均延迟约为300 ns。增加内存扩展芯片后,随机访问性能可达到原系统的17%。在应用复杂指令访存后,随机访问性能则可达原系统的2.32倍。与系统函数实现软件内存拷贝相比,内存扩展芯片独立执行内存拷贝,带宽可达其1.67倍。

内存扩展芯片主要面向数据中心领域应用,板卡通过连接标准内存插槽,可以方便地接入系统。未来的工作可以修改更多应用程序,将读写事务分解为内存扩展芯片可以识别的复杂访存序列,以使用内存扩展芯片的加速功能;进一步扩展复杂访存指令,以提升内存智能性;适配新的控制器和总线接口,以连接新型内存。

猜你喜欢
事务命令内存
只听主人的命令
河湖事务
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
移防命令下达后
基于OCC-DA-MCP算法的Redis并发控制
这是人民的命令
内存搭配DDR4、DDR3L还是DDR3?
基于优先级的多版本两阶段锁并发控制协议
移动实时环境下的数据一致性研究