您的位置:首页 > 运维架构 > 网站架构

DRAMSim2学习3——模拟器架构()

2017-02-16 11:39 148 查看
DRAMSim2是用C++实现的,作为一个DDR2/3存储系统的面向对象模型,包括一个详细的、周期精确的存储控制器模型,用来给挂在一条标准存储总线的一组DRAM设备发出命令。DRAMSim2核封装在一个单对象中,叫做MemorySystem。存储系统对象要求两个ini文件:设备ini文件与系统ini文件。设备ini文件包含描述特定DRAM设备的参数,比如时序限制与设备功耗,这些参数能够在制造商的数据手册上找到。DRAMSim2包中包含几个Micron DDR2/3设备的ini文件。系统ini文件包含与实际DRAM设备无关的参数。包括的参数比如rank数、地址映射表、调试选项、行缓冲策略、存储控制器队列结构与其它仿真细节。

在MemorySystem对象创建之后,驱动代码注册一个将在请求完成时执行的callback函数。此时,DRAMSim2的初始化才算完成。驱动代码必须为每个存储系统时钟tick调用一个函数,并调用另一个函数来增加存储请求。在数个时钟周期之后,存储请求完成时,DRAMSim2调用提供的callback函数来让前端驱动知道请求已经结束。从一个请求加到DRAMSim2到完成的时间根据当前存储系统状态而变化。因为仿真器的内部被封装到仅由少量函数组成的接口,可以很容易将DRAMSim2挂载到任何种类的前端驱动比如trace
reader、时钟精确的CPU仿真器比如MARSSx86、或离散事件仿真框架比如SST。

DRAMSim2既可以编译为单独的二进制文件,也可编译为共享库。在单独模式下,DRAMSim2仿真从disk上存储的trace读取命令。在共享库模式下,DRAMSim2提供创建MemorySystem对象与加入请求的基本功能。

除了C++ STL,DRAMSim2并不依赖外部库。

仿真内部

来自CPU的请求以执行顺序缓冲进入transaction queue。这些请求被转换为DRAM命令并放入command queue,这些命令可以有不同的结构,如per rank或per rank per bank。存储控制器记录系统中每个memory bank的状态,并利用这些信息来决定下一次发出哪个请求。存储控制器可从命令队列以乱序任意发出请求,只要它不在依赖的读之前发出写命令、或违反时序限制。乱序发出请求有助于提高bank利用率,提高带宽,降低延迟。在open page模式,DRAMSim2将保持row
open并优先响应已经打开行的请求。这样可以减少行预充电的开销,这些行可能在不久的将来被使用。相对地,closed page模式将在每个请求之后立即对行进行预充电;这对局部性较差的workload很有好处。

在仿真的DRAM设备从存储控制器收到命令与数据之后,使用rank中第二组bank的状态进行错误检查,确保收到命令的时序是有效的。如果仿真器以timing-only模式编译,则不存储来自writes的数据,并且reads响应中不包含数据。或者,配置DRAMSim2来对writes存储数据并对reads返回数据。许多CPU仿真器与其它前端驱动并不关心实际数据,所以默认不存储数据以减少仿真器的存储使用。

当读写完成时,仿真器记录请求的带宽和延时。这些统计数据以epoch求均值,epoch的长度可由用户配置。在每个epoch之间,仿真器输出详细的带宽、延时与功耗统计到一个.vis文件与控制台(或一个日志文件)。.vis文件能载入到DRAMVis。

除了仿真驱动器的读写请求外,DRAMSim2存储控制器也对DRAM刷新进行建模。刷新进行过程中发出的read请求必须比其它请求等待更长时间。这样的长延时能造成被存储访问阻塞处理器主要的性能损失,并能很大程度地影响整体系统性能。

最后,DRAMSim2使用Micron描述的功率模型来计算每个bank状态转换的功耗。DRAMSim2也包括heuristics来将设备设定为低功耗模式来减少低存储活动时的功耗。低功耗模式的开关可由ini文件中的一个标志控制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DRAMSim2