【Gem5】在memory system里创建SimObject

3 在memory system里创建SimObject

在本章节,我们创建一个简单对象在CPU和内存总线之间。下一个章节添加逻辑让它成为一个简单的阻塞式单处理器缓存。

3.1 Gem5主端口和从端口

深入内存对象之前,应首先了解gem5的主从端口。因为所有的memory对象都是通过这些端口连接一起的。

这些端口实现了3种不同的memory system mode:timing,atomic,functional。其中最重要的mode是timing mode。因为timing mode是唯一生成正确模拟结果的模式。其它模式一般用在特殊的情形。

atomic mode对于转发(fastforwarding)模拟和加速模拟器来讲比较有用。这个模式假设在memory system中没有事件(event)会发生。相反地,所有内存请求都是通过一个长长的调用链(callchain)执行。

functional mode更好的一个说法是debug mode。

3.2 Packets

Gem5中,packets通过接口发送。一个Packet由内存请求对象MemReq组成。MemReq保存一些原始请求信息诸如请求者、地址、请求类型(read or write)。

Packet也有一个MemCmd,这是数据包的当前命令。该命令可以在数据包的整个生命周期中变化(比如当存储器命令满足了,请求变成相应)。常见的MemCmd包括ReadReq读取请求,ReadResp读取相应,WriteReq写入请求,WriteResp写入响应。还有缓存和许多其它命令类型的写回请求(WritebackDirtyWritebackClean)。

Packet还保留请求的数据或指向数据的指针。

最后数据包被用来在classic cache中作为跟踪一致性的单元。因此大多数packet代码都是classic cache一致性协议所特有的。然而,packet用于gem5中内存对象之间的所有通信,即使他们不涉及一致性(比如DRAM控制器和CPU型号)。

所有端口的接口函数都接受一个Packet指针作为参数。

3.3 Port interface

Gem5中有两种类型的端口:主端口和从端口。每当你实现一个内存对象的时候,你要至少实现这些类型的端口之一(主or从)。要这么做,需要创建一个新的类继承自MasterPortSlavePort。主接口发送请求,从接口接收请求。

下图是一个简单的master-slave接口:

Simple master-slave interaction

所有的端口接口都需要一个PacketPtr作为一个参数。这些函数(sendTimingReq, recvTimingReq, etc.)接收一个参数PacketPtr

为了发射一个request的packet,master调用sendTimingReq。相对应的,函数recvTimingReq在slave中被调用并且参数是同一个PacketPtr

recvTimingReq有一个布尔返回值,这个返回值直接发回到调用的master。true代表packet被slave接收,false代表不能被接收并且请求需要过一段时间再次发送。

master或slave在接收到请求或响应时可能处于忙碌状态。下图展示了当原始请求发送时,slave繁忙的情形:

Slave busy interaction

上图这种情况,slave返回了false。当master调用了sendTimingReq后接收到false,它必须一直等到它的函数recvReqRetry被执行。仅仅当这个函数被master调用,才允许重新调用sendTimingReq。上图仅显示了失败了一次的情况,其实实际上可能会发生数次。注意:必须由master跟踪失败的packet而不是slave(slave不保存失败的packet的对应指针)。

同样,master忙碌时,下图显示了这种情况,slave直到接收到recvRespRetry后才能调用sendTimingResp

Master busy interaction

3.4 简单的内存对象例子

这个简单的对象仅仅在CPU端和内存端之间实现请求的传送。下一章节添加逻辑让它成为一个cache。

下图就是这样的一个简单的memory object所在的系统结构图:

../_images/simple_memobj.png

1.声明SimObject

就像我们之前创建一个简单的SimObject一样。第一步就是创建一个SimObject的Python文件。我们将会调用这个内存对象并且创建这样的python文件SimpleMemobj.pysrc/learning_gem5/simple_memobj下。

from m5.params import *
from m5.proxy import *
from MemObject import MemObject

class SimpleMemobj(MemObject):
    type = 'SimpleMemobj'
    cxx_header = "learning_gem5/simple_memobj/simple_memobj.hh"

    inst_port = SlavePort("CPU side port, receives requests")
    data_port = SlavePort("CPU side port, receives requests")
    mem_side = MasterPort("Memory side port, sends requests")

对于这个对象,我们要从MemObject继承,但是不能从SimObject对象继承。因为我们在创建一个和内存系统交互的对象。MemObject类有两个纯粹的虚函数getMasterPort and getSlavePort

这个对象有3个端口,两个端口是和CPU的指令和数据端口连接,还有一个是和memory bus连接。这些端口都没有默认值。

当然别忘了创建SConscript文件并声明这个python文件。

2.定义SimpleMemobj类

现在我们创建一个头文件SimpleMemobj.

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
gem5学习基础完整版,介绍了gem5环境的安装,以及一些基本概念。 gem5仿真器是用于计算机系统体系结构研究的模块化平台,涵盖系统级体系结构以及处理器微体系结构。1、多个可互换的CPU型号。 gem5提供了四种基于解释的CPU模型:简单的单CPI CPU; 有序CPU的详细模型和无序CPU的详细模型。 这些CPU模型使用通用的高级ISA描述。 此外,gem5具有基于KVM的CPU,该CPU使用虚拟化来加速仿真。 2、完全集成的GPU模型,可以执行真实计算机ISA,并支持与主机CPU共享的虚拟内存。 3、NoMali GPU模型。 gem5带有集成的NoMali GPU模型,该模型与Linux和Android GPU驱动程序堆栈兼容,因此无需进行软件渲染。 NoMali GPU不产生任何输出,但可以确保以CPU为中心的实验产生代表性的结果。 4、事件驱动的内存系统。 gem5具有详细的,事件驱动的内存系统,包括高速缓存,交叉开关,探听过滤器以及快速而准确的DRAM控制器模型,用于捕获当前和新兴内存的影响,例如内存。 LPDDR3 / 4/5,DDR3 / 4,GDDR5,HBM1 / 2/3,HMC,WideIO1 / 2。 可以灵活地布置组件,例如,以具有异构存储器的复杂的多级非均匀高速缓存层次结构来建模。 5、基于跟踪的CPU模型,可播放弹性跟踪,这些跟踪是由附着到乱序CPU模型的探针生成的依赖项和定时注释的跟踪。 跟踪CPU模型的重点是以快速,合理的方式而不是使用详细的CPU模型来实现内存系统(高速缓存层次结构,互连和主内存)的性能探索。 6、异构和异构多核。 可以将CPU模型和缓存组合到任意拓扑中,从而创建同构异构的多核系统。 MOESI侦听缓存一致性协议可保持缓存一致性。 7、多种ISA支持。 gem5将ISA语义与其CPU模型解耦,从而实现对多个ISA的有效支持。 目前gem5支持Alpha,ARM,SPARC,MIPS,POWER,RISC-V和x86 ISA。 有关更多信息,请参见支持的体系结构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值