DSP

Ruby_gem5中的介绍节选

2019-07-13 17:43发布

Ruby多处理器存储系统 高水平的Ruby的组件 Ruby实现详细的内存子系统的仿真模型。Ruby建模具有各种替换策略的私有/共享Cache层次的架构,一致性协议的实现、互联网络架构、DMA和内存控制器,初始化内存请求并处理响应的各种测序仪(sequencer)。Ruby中的模型是模块化,灵活和高度可配置。这些模型的三个关键方面: 1.分离关注点——例如,一致性协议独立于Cache替换策略和索引映射,网络拓扑由不同的实现指定。 2.丰富的可配置性——几乎任何方面影响内存层次结构功能和定时控制。 3. SLICC快速原型——一个高级规范语言,用于指定各种控制器的功能。 下面的图片,显示了一个Ruby中的主要组件的高级视图。   SLICC +一致性协议 SLICC(Specification Language forImplementing Cache Coherence)代表规范语言实现缓存一致性。这是一个领域特定语言,用于指定缓存一致性协议。从本质上讲,一个缓存一致性协议的行为像一个状态机。SLICC用于指定的行为状态机。由于其目的是模型的硬件尽可能,SLICC强加限制可以指定的状态机。例如,SLICC可以限制的数量,可以发生在一个周期的转换。除了协议规范,SLICC也结合在一起的一些组件的内存模型。如下图中可以看到,状态机的输入从输入端口连接网络和队列在网络的输出端口输出,因此捆绑缓存/内存控制器连接网络本身。 以下是支持的Cache一致性协议: MI_example:示例的Cache一致性协议,一级Cache。 MESI_Two_Level: 单芯片,2级缓存,strictly-inclusive层次结构。 MOESI_CMP_directory:多个芯片,2级缓存,non-inclusive(严格的包容性和排斥)的层次结构。 MOESI_CMP_token:2级缓存,待完成。 MOESI_hammer:单片,2级私有缓存,必须严格保持其独占性的层次结构。 Garnet_standalone:Garnet网络协议运行在一个独立的方式。 MESI Three Level:三级缓存,strictly-inclusive层次结构。 常用符号和数据结构描述了协议的细节在这里。   协议独立的内存组件 定序器 高速缓冲存储器 缓存替换策略 内存控制器 独立于缓存一致性协议组件有:定序器、缓存内存结构、缓存替换策略和内存控制器。定序器负责喂养内存子系统(包括缓存和片外存储器)的加载/存储/原子内存请求处理器。每个内存请求完成时后内存子系统通过定序器向处理器发出回复信号。在模拟系统中每个线程或核心都会有一个相对应的定序器。Cache Memory的模型是set-associative缓存结构,其具有参数化的大小、结合性、更换策略的性质。L1、L2、L3Cache(如果存在)系统都是由Cache Memory来完成实例化的。缓存替换策略集成了Cache Memory,所以不同实例的Cache Memory可以使用不同的替代政策的选择。目前两个替代政策:LRU(近期最少使用算法)和Pseudo-LRU(伪LRU算法)。内存控制器负责模拟和服务片上缓存的模拟系统的任何请求。目前内存控制器相对简单,但是模型DRAM禁止争用,DRAM忠实地刷新。它还模型close-page政策DRAM缓冲区。 互连网络 互连网络将各种组件内存层次结构(缓存、内存、dma控制器)连接在一起。
互连网络的关键组件为: 1.     拓扑结构 2.     路由器 3.     流量控制 4.     路由器微结构 更多细节参考链接 如何调用互连网络 简单的网络结构 ./build/ALPHA/gem5.debug                  configs/example/ruby_random_test.py                   --num-cpus=16                    --num-dirs=16                    --network=simple                   --topology=Mesh_XY                    --mesh-rows=4 默认网络很简单,和默认的拓扑是crossbar。 Garnet网络结构 ./build/ALPHA/gem5.debug                      configs/example/ruby_random_test.py                        --num-cpus=16                       --num-dirs=16                        --network=garnet2.0                       --topology=Mesh_XY                       --mesh-rows=4  拓扑结构 各种控制器之间的连接是通过Python文件指定的。所有外部链接(控制器和路由器)之间是双向的。所有内部链接(路由器)之间是单向的——这使得每个方向的体重在每个链接偏见路由决策。 相关文件: src/mem/ruby/network/topologies/Crossbar.py src/mem/ruby/network/topologies/CrossbarGarnet.py src/mem/ruby/network/topologies/Mesh_XY.py src/mem/ruby/network/topologies/Mesh_westfirst.py src/mem/ruby/network/topologies/MeshDirCorners_XY.py src/mem/ruby/network/topologies/Pt2Pt.py src/mem/ruby/network/Network.py src/mem/ruby/network/BasicLink.py src/mem/ruby/network/BasicRouter.py 拓扑描述: Crossbar:每个控制器(L1/L2/Directory)连接到一个简单的开关。 每个开关连接到核心交换机横梁(建模)。这可以从命令行调用--topology=Crossbar。 CrossbarGarnet:每个控制器(L1/L2/Directory)连接到其他控制器通过一个CrossbarGarnet路由器(内部模型Crossbar和分配器)。 这可以从命令行调用--topology=CrossbarGarnet。 Mesh_*:此拓扑需要目录的数量等于cpu的数量。路由器/交换机的数量等于系统中cpu的个数。每个路由器/交换机连接到一个L1,L2(如果存在),和一个目录。在网格的行数必须是指定的通过--mesh-rows。这个参数就可以创建非对称网格。 Mesh_XY:XY路由算法的网络拓扑结构。x-directional链接都是有偏见的重量为1,当所有y-directional链接是有偏见的重量2。这迫使所有消息使用X-links首先,使用Y-links之前。它可以从命令行调用--topology=Mesh_XY。 Mesh_westfirst:西方优先路由网络拓扑结构。所有west-directional链接是有偏见的重量1,其他链接是有偏见的重量为2。这迫使所有消息先使用west-directional链接,在使用其他链接。它可以从命令行调用--topology=Mesh_westfirst。 MeshDirCorners_XY:此拓扑需要目录的数量等于4。路由器/交换机的数量等于系统中cpu的个数。每个路由器/交换机连接到一个L1,L2(如果存在)。每一个角落路由器/交换机连接到一个目录。它可以从命令行调用--topology=MeshDirCorners_XY。在网格的行数必须是指定的--mesh-rows。XY路由算法。 Pt2Pt:每个控制器(L1 / L2 / Directory)连接到其他控制器通过一个直接的联系。这可以从命令行调用--topology=Pt2Pt。 每个拓扑中,每个环节和每个路由器独立可以传递一个参数,覆盖默认值(BasicLink.py和BasicRouter.py)。   目录结构 src/mem/ protocols::SLICC对一致性协议的描述 slicc:对于SLICC解析器的实现和代码生成器 ruby common:经常使用的数据结构,如地址、柱状图、数据块 filters: network:实现互连的拓扑示例规范、网络功率的计算,消息缓冲区用于连接控制器。 profiler:分析缓存事件,内存控制器事件 recorder:缓存预热和访问跟踪记录 slicc_interface:消息数据结构,各种映射(如地址目录节点)、效用函数(如地址之间的转换和int,地址转换为高速缓存线路地址) structures:协议独立内存组件Cache-Memory Directory-Memory system:胶组件——定序器,RubyPort,RubySystem