本发明涉及存储器的模拟技术领域,特别是涉及一种相变存储器模拟方法和系统。
背景技术:
dram(dynamicrandomaccessmemory,动态随机访问存储器)是一种高速的随机访问存储器,其最大的特点是支持高速的字节级别随机存取,因此被大量用于内存领域,基本已成为内存市场的标准存储设备。dram采用电容作为基本存储单元,以电容的充电与放电两种状态来表示0/1两种数据,而电容的充电状态需要稳定的电压来维持,一旦断电,电容回归复位状态,保存的数据也将丢失,即dram是易失性设备。
dramsim2是一款被广泛使用的dram模拟器,它能精确地模拟dram的每一个操作过程,模拟精度达到时间级别。dramsim2的每一个时钟周期的状态都是可查的,包括控制器内的队列、bank(内存)的状态,刷新进程,读写进程等。并可以将这些模拟的统计信息输出到档案。dramsim2的模拟过程基于trace(轨迹)。trace通常记录了一些典型应用场合下对dram的访问序列。模拟过程中,dramsim2顺序读取访问序列并创建相应的访问请求发送到控制器,由控制器协调模拟过程,并最终输出模拟结果。
与dram相比,pcm(phasechangememory,相变存储器)拥有更高的集成度、更低的能耗、无需定期刷新以及非易失等优点。pcm通常以硫化物作为其基本存储材料,其存储数据依赖于硫化物的两种典型状态。一种为结晶状态(低阻抗状态),对应存储单元的set状态;另一种为非晶态(高阻抗状态),对应reset状态。写操作能改变硫化物的这两种状态,pcm的两种写过程:reset操作给存储单元增加高而短暂的瞬时电流,使晶体瞬间受热并转变成非晶态,而set操作则施加一个低而长的电流冲击,使硫化物有足够的时间结晶,从而转化为晶态。
由于使用pcm产品进行研究代价高,设计方案难,实验周期长等原因,对pcm的内存应用的研究很有限,如何让pcm相关研究者们能更方便地进行相关研究是一个亟待解决的问题。
技术实现要素:
基于此,有必要针对上述问题,提供一种便于对相变存储器进行研究的相变存储器模拟方法和系统。
一种相变存储器模拟方法,包括以下步骤:
在检测到配置有磨损均衡算法时,获取存储区内各存储块中写次数大于预设阈值的数据;
根据预设的时间间隔采用磨损均衡算法对从所述存储块中获取的数据进行迁移;
在接收到事务请求后,从采用所述磨损均衡算法进行数据迁移后所对应的存储块中提取与所述事务请求对应的数据并存入当前行缓冲池中;
根据所述事务请求对所述当前行缓冲池中的数据进行模拟处理,并输出模拟结果。
一种相变存储器模拟系统,包括:
数据获取模块,用于在检测到配置有磨损均衡算法时,获取存储区内各存储块中写次数大于预设阈值的数据;
数据迁移模块,用于根据预设的时间间隔采用磨损均衡算法对从所述存储块中获取的数据进行迁移;
数据提取模块,用于在接收到事务请求后,从采用所述磨损均衡算法进行数据迁移后所对应的存储块中提取与所述事务请求对应的数据并存入当前行缓冲池中;
数据处理模块,用于根据所述事务请求对所述当前行缓冲池中的数据进行模拟处理,并输出模拟结果。
上述相变存储器模拟方法和系统,在检测到配置有磨损均衡算法时,获取存储区内各存储块中写次数大于预设阈值的数据,根据预设的时间间隔采用磨损均衡算法对从存储块中获取的数据进行迁移。在接收到事务请求后,从采用磨损均衡算法进行数据迁移后所对应存储块中提取与事务请求对应的数据并存入当前行缓冲池中。根据事务请求对当前行缓冲池中的数据进行模拟处理,并输出模拟结果。在接收到事务请求后对数据进行模拟处理,可以模拟数据实际的存取行为,为内存系统研究提供原型设计和理论分析基础。针对相变存储器材质非常敏感的寿命问题,通过采用磨损均衡算法对写次数大于预设阈值的数据进行迁移,将写操作尽可能均匀地分布于存储区,防止部分存储块被过早地写坏,规避相变存储器使用寿命短的问题,以更真实地反应相变存储器的工作场景,可以更好地反映相变存储器的特性,让研究者们能更方便地对相变存储器进行相关研究。
附图说明
图1为一实施例中相变存储器模拟方法的流程图;
图2为另一实施例中相变存储器模拟方法的流程图;
图3为一实施例中pcm模拟器的框架图;
图4为一实施例中bankstate类修改的示意图;
图5为一实施例中相变存储器模拟系统的结构图;
图6为另一实施例中相变存储器模拟系统的结构图。
具体实施方式
pcm作为一种新型存储材料,在很多方面的性能都与dram非常类似,比如字节寻址,访问延迟与dram处于同一数量级等,使得pcm有望成为dram的替代品。但pcm也有其缺点:高擦写能耗以及有限的擦写次数(即寿命低),而寿命问题将可能成为阻碍pcm被大规模应用于内存市场的最主要的因素。
写操作是pcm的主要耗损来源。当pcm被反复地加热,硫化物将变得不再稳定,晶态与非晶态之间的界限变得模糊,最终无法正确的记录信息。写寿命是pcm的一个重要指标,通常为十的八次方。超过这个界限,pcm将变得不再可用,写寿命也成为研究者们最为关注的一个指标。磨损均衡是一种常用的延长pcm寿命的技术,其核心思想为数据迁移:将写频繁的数据迁移到写空闲的数据块,使得每一个pcm单元的写频次尽量均匀,从而尽可能延迟pcm的失效时间。
在一个实施例中,一种相变存储器模拟方法,如图1所示,包括以下步骤:
步骤s120:在检测到配置有磨损均衡算法时,获取存储区内各存储块中写次数大于预设阈值的数据。
在检测到有配置磨损均衡算法时,则对数据进行迁移,若没有配置磨损均衡算法则不进行数据迁移。可预先将存储区划分为多个用于存储数据的存储块,各存储块的大小可以相同也可以不同。预设阈值的具体取值也并不唯一,可根据实际情况调整。操作人员可根据实际需求,控制中央处理器发送事务请求对各存储块中存储的数据进行存取操作。写次数大于预设阈值的数据即为写频繁数据,通过实时监控存储区内各存储块中的数据读写操作,提取各存储块中的写频繁数据。
步骤s130:根据预设的时间间隔采用磨损均衡算法对从存储块中获取的数据进行迁移。
预设的时间间隔的具体取值也并不唯一,对数据进行迁移具体可以是将写频繁数据较多的数据块中的写频繁数据,迁移到没有或者有较少写频繁数据的数据块中。磨损均衡算法的具体类型也不唯一,可以是一种也可以是集合多种。本实施例中,磨损均衡算法包括start-gap算法和security-refresh算法,这两种算法不仅效果显著,且算法效率较高,开销较小。可以理解,用户也可以根据自己的需要选择合适的磨损均衡算法。
在一个实施例中,步骤s130中采用磨损均衡算法对从存储块中获取的数据进行迁移,包括步骤132和步骤134。
步骤132:调用磨损均衡算法的地址映射过程,将从存储块中获取的数据的逻辑地址转换成物理地址。不同的磨损均衡算法对应不同的数据迁移策略以及不同的地址映射算法。逻辑地址为写频繁数据迁移前的地址,物理地址为写频繁数据迁移后的数据。
步骤134:根据物理地址执行数据迁移,并拒绝接收事务请求直至数据迁移完成。由于在迁移的过程中数据的实际存储地址并不确定,为了确保数据访问的正确性,在数据迁移过程中控制器将拒绝接收一切上层事务请求。
在pcm存储单元写次数受限的情况下,磨损均衡算法通过将写操作尽可能均匀地分布于存储区,防止部分数据块被过早地写坏,从而有效地提高pcm存储器的写寿命。而随着磨损均衡策略已经成为pcm存储器的标配,在模拟器中直接集成多种常用的磨损均衡算法,不仅使模拟器环境能更加符合真实pcm环境,也极大地方便了使用模拟器的pcm研究人员,他们可以将更多的精力与时间放在他们所关心的特性上,而不是花在如何实现磨损均衡算法上。磨损均衡算法的核心为地址映射和数据迁移。
数据迁移:每隔一定的时间,按固定策略将数据块迁移。之后所有针对这些数据的访问都将被重定向到新的地址,将写操作相对平均地映射到整个存储空间。
地址映射:当数据迁移发生后,数据的存储位置已经改变,当需要再次访问该数据时,需要计算当前访问数据的实际地址,地址映射即为从逻辑地址到实际物理地址的计算方法。
步骤s140:在接收到事务请求后,从采用磨损均衡算法进行数据迁移后所对应的存储块中提取与事务请求对应的数据并存入当前行缓冲池中。
事务请求具体可以包括读请求和写请求,存储块包括多个用于存储数据的数据行。采用磨损均衡算法进行数据迁移导致的地址映射,会根据具体的算法而定。具体可先检测事务请求所对应的数据是否有发生迁移,如果没有则可直接按照原有的存储映射关系获取数据进行操作;如果发生了迁移则在后续的事务请求操作中,从采用磨损均衡算法进行数据迁移后所对应存储块的数据行找到与事务请求对应的数据,并存入与该数据行对应的当前行缓冲池中,以便于进行模拟处理。
步骤s150:根据事务请求对当前行缓冲池中的数据进行模拟处理,并输出模拟结果。
根据事务请求对当前行缓冲池中的数据进行读和写模式处理,并输出模拟结果,模拟数据实际的存取行为,为内存系统研究提供原型设计和理论分析基础。
在一个实施例中,如图2所示,步骤s150之后,相变存储器模拟方法还包括步骤s160。
步骤s160:监控存储区各存储块的写次数,将写次数达到对应预设的写寿命的存储块中的数据拷贝至预设的替换块中,并将对应替换信息更新至替换映射表。
每个存储块在初始化时被分配一个随机的写寿命,如果一个存储块已经达到它的写寿命,则该块无法继续写操作。针对pcm的寿命短的问题进行寿命管理,预先设置的替换块,对写次数超出其寿命的存储块中的数据进行转移,进一步提高pcm的使用寿命,真实地反应pcm的工作场景。
对应地,步骤s140中进行数据迁移时,先根据磨损均衡的地址映射算法将逻辑地址a转换为逻辑地址b,再根据替换映射表检测地址b中的数据是否被替换,若是则根据替换映射表中的信息找到实际的物理地址c并从地址c中取出数据,若否则直接从地址b中取出数据。
进一步地,在一个实施例中,步骤s120之前,相变存储器模拟方法还包括步骤s110。
步骤s110:对存储区进行分块得到存储块,并对每个存储块分配服从正态随机分布的写寿命。
对存储区进行分块得到存储块的方式并不唯一,存储块的写寿命服从期望为μ、标准差为δ的正态随机分布n(μ,δ2)。其中μ和δ均作为参数可供配置。正态分布各方面的特性都非常契合由于工艺误差而产生的随机变量,而且正态分布也已经被广泛应用于描述此类随机变量。
可以理解,在一个较佳实施例中,相变存储器模拟方法还可同时包括步骤s110和步骤s160,加入pcm寿命模型进行存储块划分和寿命管理,很好的契合了pcm材质非常敏感的寿命问题。
在一个实施例中,步骤s140之前,相变存储器模拟方法还包括以下步骤:
若当前行缓冲池已满,获取当前行缓冲池中的被淘汰块,并检测被淘汰块的数据在被加载之后是否被改写。若是,则根据预设的替换映射表将改写后的数据回写至对应的存储块中;若否,则将当前行缓冲池对应的数据行置为空闲。
当前行缓冲池已满即是指存储的数据达到缓存容量,无法加入新的数据。数据从存储区加载到当前行缓冲池再进行处理,如果当前事务请求的数据已经在当前行缓冲池就不需要加载,同时读写都是针对当前行缓冲池进行,不会写入存储区。如果数据不在当前行缓冲池就需要预加载,这个时候如果当前行缓冲池已满就要淘汰掉当前行缓冲池的一个数据块,即被淘汰块。查找被淘汰块的具体策略并不唯一,可以是将存入最早的数据块作为被淘汰块,也可以是将占用容量最大的数据块作为被淘汰块。被淘汰块如果在被加载到当前行缓冲池后被改写了,就需要把改写后的数据回写至缓冲区,如果没有被改写那直接替换掉这一块就行了。可以理解,在进行数据回写时,可通过替换映射表判断需要回写的数据所在的存储块是否进行了坏块替换,如果没有则直接根据原有的存储映射关系进行数据回写;如果发生了坏块替换,则将数据回写至替换映射表中所映射的替换后的数据块中。
对于pcm,数据的读出为非破坏性的,这就意味着当发生bank冲突时,并不一定需要将当前行缓冲池中的数据行回写到存储区。根据前行缓冲池中的数据是否被改写来判断是否执行数据回写过程,更符合pcm的实际工作场景,更好地反映相变存储器的特性,进一步便于对pcm的研究。
上述相变存储器模拟方法,在接收到事务请求后对数据进行模拟处理,可以模拟数据实际的存取行为,为内存系统研究提供原型设计和理论分析基础。针对相变存储器材质非常敏感的寿命问题,通过采用磨损均衡算法对写次数大于预设阈值的数据进行迁移,将写操作尽可能均匀地分布于存储区,防止部分存储块被过早地写坏,规避相变存储器使用寿命短的问题,以更真实地反应相变存储器的工作场景,可以更好地反映相变存储器的特性,让研究者们能更方便地对相变存储器进行相关研究。
为了更好地理解上述相变存储器模拟方法,下面结合基于dramsim2的pcm模拟器进行详细的解释说明。
实验表明pcm与dram在许多特性上非常相似,比如按字节寻址、读写速度近似。在内部结构上,pcm和dram也采用了相同的框架。鉴于dram的技术已相当成熟,同时业界也已有专门针对dram编写的模拟器,在现有dram模拟器基础上进行改进从而编写pcm模拟器就变得可行且相对容易。
基于dramsim2的pcm模拟器将根据dram与pcm的特性差异,在dramsim2的基础上做出如下修改:dram中用来保存数据的电容存在漏电现象,而pcm中的硫化物材料不需要任何电压就可以保存数据,因此pcm模拟器不需要刷新过程。dram的读过程是破坏性读出,即当bank中的某行被读出到行缓冲池后,原单元行中的数据随即丢失。当行缓冲池中的数据要被新的行替换,被替换的行必须回写到存储区,这个过程被称为回写。由于pcm的读过程是非破坏性的,因此被替换行没有被改写并不需要回写。dram中采用的电容在充放电过程几乎没有损耗,而pcm采用的硫化物在写入过程时则会缓慢地损耗,因此寿命问题成了pcm设备中最受关注的问题。在dramsim2的基础上增加寿命模型,以更真实地反应pcm的工作场景。
通过对比dram与pcm的异同,在dram模拟器dramsim2的基础上作出相应的修改,得到应用上述相变存储器模拟方法的基于dramsim2的pcm模拟器,图3为pcm模拟器的框架图。具体修改如下:
一、取消刷新过程
由于dram采有电容存储数据,而电容存在漏电现象,因此需要定期地对dram的数据行进行刷新。事实上,jedec(jointelectrondeviceengineeringcouncil,联合电子设备工程会议)标准规定必须在64ms内对bank的每一行至少刷新一次。在dramsim2的实现中,各rank(排)之间以及各rank内bank之间的刷新相互独立,且刷新过程由内存控制器(memorycontroller类)触发及控制:初始化时,控制器为每个rank保留一个计时器,在每个时间周期,控制器检查各rank的计时器,如果某rank的计时器为零则将一条刷新命令置于命令队列的顶部。该命令会将该rank中所有bank置于刷新状态,并且暂停读写过程直到各rank刷新完成(需要trfc的时间)。然而pcm采有硫化物的两种状态来存储数据,在这两种状态下,若没有外力作用(通常为写电流),存储单元的状态是不会随着时间的变化而发生转变,因此不必采用类似dram的刷新过程来维持存储单元的状态。因此在dramsim2的基础上直接跳过刷新过程。具体做法是:去掉内存控制器中各rank的刷新计时器。在每个时间周期,也不再对各rank做刷新倒计时检查、不再向内存控制器的命令队列插入刷新命令,而其它读写过程则维持原有顺序不变。
取消刷新过程具体如下:
删除memorycontroller类步进函数(update)中对各rank刷新计时器的更新,并且不再检查。
删除memorycontroller类步进函数(update)中对当前buspacket类型为refresh的处理过程,不再需要。
删除memorycontroller类步进函数(update)中对当前状态为refresh的bank的处理过程,不再需要。
删除memorycontroller类中刷新计时器refreshcountdown成员变量以及构造函数中对refreshcountdown的初始化。
删除commandqueue类出队函数(pop)中对刷新过程的处理,不再需要。
删除rank类接收函数(receivefrombus)中对buspacket类型为refresh的处理过程,不再需要。
删除设备配置文件中refresh_period配置项,并删除配置文件读取类(inireader)中对该配置项的相关处理。该配置项指示刷新周期,不再需要。
二、修改行缓冲池的回写过程
dram依靠电容中的电子来存储数据,当bank中的一个数据行经过放大器放大并读出至缓冲池后,原存储单元中的数据就会丢失。dram的这种特性被称为破坏性读取,当cpu(centralprocessingunit,中央处理器)需要访问该bank的另一行时,需要先将当前缓存池的数据行回写至存储区,然后将即将访问的数据行读取到行缓冲池。dram一个完整的读周期如下:
预充电(预激活,preactive)阶段:即前一个内存访问完成后,将当前缓存区中的数据行回写至存储区,并开始激活即将被访问的数据行。该阶段的时延通常用trp表示。
行激活(active)阶段:即行地址激活命令发出后,对行地址进行解析并将对应的行数据读取到行缓冲池,并开始发出列读命令。该阶段时延通常用trcd表示。
列读(read)阶段:即列读命令发出,对列地址解析并将对应单元的数据读出到总线,一个完整的读周期也即完成。该阶段时延通常用cl表示。
对于一个内存读命令,如果目标行已经激活(即当前请求与前一请求访问bank的同一行),表示该行数据已经被读出至行缓冲池,则读命令直接转化为一条列读命令。当当前读命令将导致bank冲突(即当前请求与前一请求访问bank的不同行)时,读命令将转化为三条命令,即预充电、行激活与列读取。
而对于pcm,是否需要将当前缓冲池中的数据行回写到存储区,取决于当前缓冲池中的数据行在激活后是否被修改(写操作),如果已经被修改,则需要回写至存储区,否则不需要回写。一个内存访问命令的流程为:当目标行已经激活,则访问命令直接转化为一条列读命令;当当前访问命令导致bank冲突,且缓冲池中数据行未被修改,访问命令转换为预充电、行激活与列读取命令,此时的预充电命令仅仅将bank置为空闲,并不进行回写;当当前访问命令导致bank冲突,且缓冲池中的数据行已经被修改时,访问命令转换为预充电、行激活与列读取三条命令,且此时的预充电命令执行真正的回写操作。
修改bank的预充电进程具体如下:
在bankstate(内存状态)类中增加bool(布尔型变量)类型属性:isbuffdirty。该属性为true则表示行缓冲池中的数据行已经被修改,在预充电阶段需要回写。若该属性为false则表示行缓冲池或者为空,或者在激活后尚末被修改。图4列出了修改后的bankstate类。
在一个bank被激活(某行被激活)后,将该bank的isbuffdirty属性置false。具体为:在memorycontroller类中步进函数(update)对buspacket类型为activate的处理过程末尾,加入以下代码:
bankstates[rank][bank].isbuffdirty=false;
在一个bank完成写操作之后,将该bank的isbuffdirty属性置为true。具体为:在memorycontroller类中步进函数(update)对buspacket类型为write的处理过程末尾,加入以下代码:
bankstates[rank][bank].isbuffdirty=true;
修改bank的预充电(precharge)过程:若该bank的isbuffdirty为false,则直接跳转到下一个流程。如果isbuffdirty为true,则转至回写过程(该过程将耗时trp个时钟周期)。修改后的预充电处理过程如下:
三、加入pcm寿命模型
与dram(擦写寿命10^12)相比,pcm(擦写寿命10^9)的寿命要短得多,这是由各自的存储材质决定的。因此一般来说,与dram相关的模拟器都不会考虑寿命问题,而对于pcm模拟器在设计时就必须将寿命考虑进去,也即为pcm寿命建立合理的模型。
pcm存储区以数据的存取单位(jedec_data_bus_bits)分块,每个分块在模拟器初始化时被分配一个随机的写寿命,如果一个存储块已经达到它的写寿命,则该块无法继续写操作。
具体地,每个rank中将增加数个(nr)备用块作为备用池,以及一个长度为nr的映射表。当一个存储块写次数超出其寿命(称为坏块),则在备用池中取出一块将其替换,并将替换关系写入映射表中。如果新的坏块出现而备用池耗尽,则整个模拟器停止工作。引入坏块备用池后,对rank的访问流程也将发生改变:每次访问前需要先检查映射表,如果映射表中有目标块的记录,则请求被重定向为访问备用块。
加入寿命模型的具体过程如下:
将每个rank独立分块,每个分块的大小为jedec_data_bus_bits。由于每个rank的大小为:num_rows*num_cols*num_banks*jedec_data_bus_bits,则每个rank分块数(nb)为:num_rows*num_cols*num_banks,其中每个分块的编号分别为row*col*bank。
构造一个随机事件模拟器mr,该随机事件服从期望为μ,标准差为δ的正态随机分布n(μ,δ2),利用mr生成nb个随机数,这nb个随机数则为rank中各分块的寿命。
为每个rank建立一个大小为nr的预留映射表。映射表中的每一行分为两项addr和data,其中addr表示被当前行替换的分块号,而data则为被替换块的数据,大小为分块大小。初始时addr均置为-1,表示没有被该预约行替换的分块。
rank内的地址映射过程如下:取当前buspacket的bank,row,col三项的乘积作为分块的地址ab。依次检查当前rank的预留映射表,若存在某行的addr与ab匹配。则取该行data的地址作为最终地址,地址映射结束。如果没有找到匹配项,则以原(bank,row,col)三元组作为最终地址,映射结束。
每次写操作完成,将对应分块的写寿命减1。若分块的当前寿命为零,则进行坏块替换。
rank内坏块替换过程如下:依次检查当前rank的预留映射表,查找addr为-1的行。若有则记该行为rf,进行块坏替换,若没有找到,则表示预约块已经耗尽,报告写错误,替换结束。进行块坏替换时,将原分块的数据拷贝到rf的data区,并将原分块的块号写入rf的addr。替换过程结束。
四、集成磨损均衡算法
在dramsim2中,内存控制器中设置有一个事务队列(transactionqueue)。当执行更新(update)操作时,事务被逐条解析成对应的总线命令,然后被加入到命令队列中,这个操作需要将事务地址(也即内存访问地址)转换成对应的[rank,bank,row,col]四元组,这个过程被称为地址映射。pcm模拟器中地址映射分为两个过程:磨损均衡地址映射和常规地址映射,且磨损均衡的地址映射要先于常规地址映射进行,磨损均衡地址映射的输出作为常规地址映射的输入。图3中给出了地址映射示意图。
内存控制器在适当的时候会触发数据迁移过程,这个时机取决于具体采用的算法。当数据迁移发生时,控制器将数据迁移对应的读写事务加入事务队列,并等待事务完成,在数据迁移过程中控制器将拒绝接收一切上层事务请求。
pcm模拟器集成了两种比较常用的磨损均衡算法:start-gap及security-refresh算法。这两种算法不仅应该较广,也代表了磨损均衡算法的两种类别(内存控制器级与bank级磨损均衡算法)。
对于start-gap算法实现细节如下:
将整个存储地址分为num_regions个分区,每个分区将独立运行start-gap算法。将每个分区按line_size为单位分块(line_size为jedec_data_bus_bits的整数倍)。
初始化一个迁移队列(migrationqueue),该队列指示当前有哪些分区在进行数据迁移,初始时置空。
每个分区的元数据包括:start指针、gap指针、数据迁移计时器dmcd,以及大小为line_size的gap块。初始时start指针指向0号块、gap指针指向gap块,dmcd置为迁移间隔。
每个transaction被加入到事务队列之前,先调用start-gap算法的地址映射,将虚拟地址转换成物理地址,地址映射将根据start指针与gap指针进行。
每次写操作完成,将dmcd减1,当dmcd减为0时,调用该分区的数据迁移过程。
数据迁移过程:
a.将当前分区指针加入迁移队列。
b.读取gap-1所指向的数据块,生成相应的读请求加入至事务队列。若gap指针指向gap块,则读取该分区最后一块。若gap指针为零则读取gap块。
c.读取完数据后,将数据写入gap指针所指向的数据块,生成相应的写请求并加入至事务队列。
d.gap指针减1。若当前gap指针为零,则gap指针指向gap块,同时将start指针加1。
e.将当前分区指针移出迁移队列。将dmcd重置为迁移间隔。
在memorycontroller的willaccepttransaction方法中加入条件判断:迁移队列不为空时直接返回false。也即数据迁移发生时不再接受来算cpu的请求。
集成security-refresh算法:
security-refresh算法出于安全考虑(防止恶意攻击),将在每个bank内部实现磨损均衡算法。该算法依靠定期的更新映射密钥(key)来逐步进行数据迁移,从而达到磨损均衡的效果。对于security-refresh算法实现细节如下:
将每个bank按照line_size为单位共分为nblock块(line_size为jedec_data_bus_bits的整数倍),line_size即为数据迁移的单位。
初始化bank元数据:包括上一轮映射密钥pk=0,ck为[0,nblock]区间的随机数,当前刷新指针crp=0,数据迁移计时器dmcd=迁移间隔。
每个bank在读写之前,先调用security-refresh的地址映射过程将当前buspacket的存取地址从逻辑地址转换成物理地址。地址映射与pk,ck以及crp有关。
每次写操作完成,将dmcd减1,当dmcd减为0时,调用该分区的数据迁移过程。
数据迁移过程:
a.计算crp^pk=arp,cpr^ck=arc。这两个数即表示当前需要交换数据的两个块号。
b.交换arp,arc两个分块的数据。
c.从crp指针开始向块号增加的方向检索。查找第一个在本轮中尚未交换数据的块。尚未交换数据的块号ablock满足关系:ablock^ck^pk>crp。若找到则将crp指向该块号。若找不到则表示该轮数据迁移已完成,开始新一轮数据迁移(d)。
d.开始新一轮交换:生成[0,nblock]区间内的随机数n作为该轮的映射密钥。将ck置为pk,pk置为n,crp置0,同时将dmcd重置为迁移间隔。
基于dramsim2的pcm模拟器可以对相变存储器内存系统级研究和分析,可以模拟数据实际的存取行为,为内存系统研究提供原型设计和理论分析基础。模拟器可以重复利用,为其他的针对pcm的模拟节约了成本。在基于dramsim2的pcm模拟器中集成寿命管理和磨损均衡算法,提供了相关接口给其他的pcm研究者,可以针对自己的研究使用相应的算法规避pcm使用寿命短的问题,提高性能。
在一个实施例中,一种相变存储器模拟系统,如图5所示,包括数据获取模块120、数据迁移模块130、数据提取模块140和数据处理模块150。
数据获取模块120用于在检测到配置有磨损均衡算法时,获取存储区内各存储块中写次数大于预设阈值的数据。
在检测到有配置磨损均衡算法时,则对数据进行迁移,若没有配置磨损均衡算法则不进行数据迁移。预设阈值的具体取值也并不唯一,可根据实际情况调整。操作人员可根据实际需求,控制中央处理器发送事务请求对各存储块中存储的数据进行存取操作。写次数大于预设阈值的数据即为写频繁数据,通过实时监控存储区内各存储块中的数据读写操作,提取各存储块中的写频繁数据。
数据迁移模块130用于根据预设的时间间隔采用磨损均衡算法对从存储块中获取的数据进行迁移。
预设的时间间隔的具体取值也并不唯一,对数据进行迁移具体可以是将写频繁数据较多的数据块中的写频繁数据,迁移到没有或者有较少写频繁数据的数据块中。本实施例中,磨损均衡算法包括start-gap算法和security-refresh算法,这两种算法不仅效果显著,且算法效率较高,开销较小。可以理解,用户也可以根据自己的需要选择合适的磨损均衡算法。
在一个实施例中,数据迁移模块130包括地址转换单元和数据迁移单元。
地址转换单元用于根据预设的时间间隔调用磨损均衡算法的地址映射过程,将从存储块中获取的数据的逻辑地址转换成物理地址。不同的磨损均衡算法对应不同的数据迁移策略以及不同的地址映射算法。逻辑地址为写频繁数据迁移前的地址,物理地址为写频繁数据迁移后的数据。
数据迁移单元用于根据物理地址执行数据迁移,并拒绝接收事务请求直至数据迁移完成。由于在迁移的过程中数据的实际存储地址并不确定,为了确保数据访问的正确性,在数据迁移过程中控制器将拒绝接收一切上层事务请求。
数据提取模块140用于在接收到事务请求后,从采用所述磨损均衡算法进行数据迁移后所对应的存储块中提取与事务请求对应的数据并存入当前行缓冲池中。
事务请求具体可以包括读请求和写请求,存储块包括多个用于存储数据的数据行,从采用磨损均衡算法进行数据迁移后所对应存储块的数据行找到与事务请求对应的数据,并存入与该数据行对应的当前行缓冲池中,以便于进行模拟处理。
数据处理模块150用于根据事务请求对当前行缓冲池中的数据进行模拟处理,并输出模拟结果。
根据事务请求对当前行缓冲池中的数据进行读和写模式处理,并输出模拟结果,模拟数据实际的存取行为,为内存系统研究提供原型设计和理论分析基础。
在一个实施例中,如图6所示,相变存储器模拟系统还包括寿命监测模块160。
寿命监测模块160用于在数据处理模块150根据事务请求对当前行缓冲池中的数据进行模拟处理,并输出模拟结果之后,监控存储区各存储块的写次数,将写次数达到对应预设的写寿命的存储块中的数据拷贝至预设的替换块中,并将对应替换信息更新至预设的替换映射表。
每个存储块在初始化时被分配一个随机的写寿命,如果一个存储块已经达到它的写寿命,则该块无法继续写操作。针对pcm的寿命短的问题进行寿命管理,预先设置的替换块,对写次数超出其寿命的存储块中的数据进行转移,进一步提高pcm的使用寿命,真实地反应pcm的工作场景。
对应地,数据提取模块140进行数据迁移时,先根据磨损均衡的地址映射算法将逻辑地址a转换为逻辑地址b,再根据替换映射表检测地址b中的数据是否被替换,若是则根据替换映射表中的信息找到实际的物理地址c并从地址c中取出数据,若否则直接从地址b中取出数据。
进一步地,在一个实施例中,相变存储器模拟系统还包括存储区分块模块110。
存储区分块模块110用于在数据获取模块120获取存储区内各存储块中写次数大于预设阈值的数据之前,对存储区进行分块得到存储块,并对每个存储块分配服从正态随机分布的写寿命。
对存储区进行分块得到存储块的方式并不唯一,存储块的写寿命服从期望为μ、标准差为δ的正态随机分布n(μ,δ2)。其中μ和δ均作为参数可供配置。正态分布各方面的特性都非常契合由于工艺误差而产生的随机变量,而且正态分布也已经被广泛应用于描述此类随机变量。
可以理解,在一个较佳实施例中,相变存储器模拟系统还可同时包括存储区分块模块110和寿命监测模块160,加入pcm寿命模型进行存储块划分和寿命管理,很好的契合了pcm材质非常敏感的寿命问题。
在一个实施例中,相变存储器模拟系统还包括数据检测模块。
数据检测模块用于在数据提取模块140在接收到事务请求后,从采用所述磨损均衡算法进行数据迁移后所对应的存储块中提取与事务请求对应的数据并存入当前行缓冲池中之前,若当前行缓冲池已满,获取所述当前行缓冲池中被淘汰块,并检测所述被淘汰块的数据在被加载之后是否被改写;若是,则根据预设的替换映射表将改写后的数据回写至对应的存储块中;若否,则将当前行缓冲池对应的数据行置为空闲。
根据前行缓冲池中的数据是否被改写来判断是否执行数据回写过程,更符合pcm的实际工作场景,更好地反映相变存储器的特性,进一步便于对pcm的研究。
上述相变存储器模拟系统,在接收到事务请求后对数据进进行模拟处理,可以模拟数据实际的存取行为,为内存系统研究提供原型设计和理论分析基础。针对相变存储器材质非常敏感的寿命问题,通过采用磨损均衡算法对写次数大于预设阈值的数据进行迁移,将写操作尽可能均匀地分布于存储区,防止部分存储块被过早地写坏,规避相变存储器使用寿命短的问题,以更真实地反应相变存储器的工作场景,可以更好地反映相变存储器的特性,让研究者们能更方便地对相变存储器进行相关研究。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。