(本文是对gem5官方教程gem5: Introduction的学习记录)

目录

 SLICC + 一致性协议

与协议无关的内存组件

互连网络

 Ruby中一个内存请求的完整过程

目录结构

Ruby实现了一个更细节的内存子系统的模拟模型。它建模了inclusive/exclusive cache,包含多种替换策略、一致性协议、互连网络、DMA和内存控制器,以及多种用于初始化内存请求和处理响应的排序器。

特点:

关注点分离。例如,一致性协议规范与替换策略和缓存索引映射是分开的,网络拓扑结构与实现也是分开指定的。丰富的可配置性。几乎所有影响内存层次结构的功能和时间都可以控制。快速的原型。使用一种高级规范语言SLICC来指定各种控制器的功能。

 SLICC + 一致性协议

SLICC:Specification Language for Implementing Cache Coherence,是一种特定领域的语言,用于指定缓存一致性协议。

缓存一致性协议就像一个状态机,SLICC用于指定状态机的行为。

与协议无关的内存组件

排序器(Sequencer)

Sequencer类负责为内存子系统(包括cache和片外存储)装载来自处理器的load/store/atomic访存请求。每一个在内存子系统中完成的访存请求都会通过Sequencer向处理器发送响应。

系统中模拟的每个硬件线程(或核心)都有一个Sequencer。

cache memory替换策略内存控制器

内存控制器负责模拟和服务在模拟系统的所有片上cache中错过的任何请求。还建模了DRAM禁令争用、DRAM刷新和DRAM缓冲的close-page策略。

互连网络

互连网络将内存层次结构的各个组件(缓存、内存、dma控制器)连接在一起。

关键组件:

拓扑路由流量控制路由器微架构

 Ruby中一个内存请求的完整过程

一个内存请求从gem5的核心或硬件上下文通过RubyPort::recvTiming接口(src/mem/ruby/system/RubyPort.hh/cc)进入Ruby的管辖范围。仿真系统中Rubyport实例化的数量等于硬件线程上下文或内核的数量(在非多线程内核的情况下)。每个核心一侧的端口被绑定到相应的RubyPort上。内存请求以gem5 packet的形式到达,RubyPort负责将其转换为Ruby的各个组件都能理解的RubyRequest对象。它还查明请求是否针对某个PIO,并操纵packet以纠正PIO。最后,一旦它生成了相应的RubyRequest对象,并确定该请求是一个正常的内存请求(不是PIO访问),它就会将请求传递给带有端口的Sequencer对象的Sequencer::makeRequest接口(可变ruby port保存指向它的指针)。注意Sequencer类本身是RubyPort类的派生类。在模拟系统中,Sequencer的对象数量与硬件线程上下文的数量(也等于系统中RubyPort对象的数量)相同,Sequencer对象和硬件线程上下文之间是一对一的映射。一旦内存请求到达Sequencer::makeRequest,它会对请求进行各种计算和资源分配,最后将请求推到Ruby的一致性缓存层次结构中以满足请求,同时考虑服务相同的延迟。在考虑L1缓存访问延迟后,通过将请求放入强制队列(mandatory queue)来将请求推入Cache层次结构。mandatory queue(变量名为m_mandatory_q_ptr)有效地充当了Sequencer和SLICC生成的缓存一致性文件之间的接口。L1 cache控制器(由SLICC根据一致性协议规范生成)从mandatory queue中提取请求并查找cache,根据需求进行必要的一致性状态转换,同时/或将请求推到缓存层次结构的下一层。SLICC生成的Ruby代码的不同控制器和组件之间通过Ruby的MessageBuffer类的实例化进行通信(src/mem/ruby/buffers/MessageBuffer.cc/hh),可以作为有序或无序的缓冲区或队列。同时,为了满足内存请求的不同步骤的延迟也在相应的入队和出队调度时被考虑。如果请求的缓存块可以在L1缓存中找到,并且具有所需的一致性权限,则请求被满足并立即返回。否则,请求将通过MessageBuffer被推到缓存层次结构的下一层。请求可以一直到Ruby的内存控制器(在许多协议中也称为Directory)。一旦请求得到满足,它就会通过MessageBuffers在层次结构中向上推。MessageBuffers还充当片上互连建模的一致性消息的入口点。Messagebuffer根据指定的互连拓扑进行连接。因此,一致性信息相应地通过这个片上互连传输。一旦请求的缓存块在L1缓存中具有所需的一致性权限,L1缓存控制器就会根据请求的类型调用相应的Sequencer对象的readCallback或writeCallback方法来通知它。请注意,当Sequencer上的这些方法被调用时,服务请求的延迟已经被隐式地考虑了。然后,Sequencer为相应的请求清除信息,然后调用RubyPort::ruby_hit_callback方法。最终将请求的结果返回到核心或硬件上下文的相应端口。

目录结构

src/mem/

protocols:一致性协议的SLICC规范slicc:实现SLICC解析器和代码生成器ruby

common:常用的数据结构,如:地址(带位操作方法)、直方图、数据块filters:各种Bloom过滤器(来自GEMS的陈旧代码)network:互连实现、示例拓扑规范、网络功率计算、用于连接控制器的消息缓冲区profiler:cache事件、内存控制器事件的分析recorder:cache预热和访问跟踪记录slicc_interface:消息数据结构,各种映射(例如:地址到目录节点),实用函数(例如:地址和int之间的转换,将地址转换为cache line地址)structures:协议无关的内存组件——CacheMemory, DirectoryMemorysystem:glue组件——Sequencer, RubyPort, RubySystem

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: