Gem5 学习 1 - Gem5 及其 文件结构

本文参考
http://www.m5sim.org/Source_Code
https://blog.csdn.net/qq_40918707/article/details/105511535
ivy_reny的gem5专栏

Gem5的安装配置可以参考我的博客ubuntu18.04 配置 gem5
本文默认已经完成了GEM5的编译

Gem5

gem5提供了多种CPU模型、系统模型以及存储器模型。

  • CPU模型:Atomic、Timing、In- order、O3(Out of Order)
  • 系统模型:SE(System-callemulation)、FS(Full System)
  • 存储模型:Classic、Ruby。

GEM5特征

1、GEM5的设计特征

面向对象、Python集成、领域特定语言DSL、标准化接口

面向对象和python集成

  • GEM5用C++和python混合编写
  • GEM5中所有主要的仿真单元都称为SimObject,它们使用相同的方法进行配置、初始化、统计与序列化(checkpoint)
  • SimObject包括具体的硬件单元模型比如处理器核、cache、互联单元与设备,也包括更为抽象的比如负载和与之相关联的用于系统调用仿真的处理内容。
  • 每个SimObject由两个类表示,一个Python类,一个C++类。Python类定义SimObject参数并进行基于脚本的配置。C++类包含了SimObject状态与剩余的行为,包括关键性能的仿真模型。
  • 对于不同的组件SimObject,GEM5中使用Python进行集成,即Python负责初始化、配置和模拟控制。仿真器一开始就立即执行Python代码;标准的main()函数、命令行处理与启动代码都是用Python编写的。

领域特定语言DSL我也不是很了解
标准化接口

  • 标准化接口主要是包括端口(port)接口和消息缓冲接口(message buffer)
  • 端口用来连接两个内存对象(memory object)。在Classic内存系统中,端口接口连接包括CPU到cache、cache到总线、以及总线到设备和存储器的所有内存对象。
  • 端口支持三种访问数据的机制,即timing、atomic和functional,以及用来确定拓扑结构和调试的接口。
  • Timing模型用于建模存储器访问的时序细节,请求通过消息发送给存储系统,而响应则是通过其它消息异步地返回;
  • Atomic模型用于获取时序信息,但并非基于消息,发生atomic调用(通过函数调用),同步地实现操作的状态改变,这种方式性能更高但是精度较低,因为没有对消息的互操作进行建模;
  • Functional模型对模拟器状态进行更新,而并不改变任何时序信息,用于debug、系统调用仿真与初始化。

2、GEM5系统模型

GEM5支持两种不同的系统模型:SE(syscall emulation)和FS(full system)模型
SE:

  • SE模型能够仿真大部分操作系统级服务,能够取得很好功能模拟加速比
  • 运行独立的程序或者MP上的程序集
  • 建模用户可见的ISA加上共同的系统调用
  • 模拟系统调用,特别是通过调用主机OS
  • 简化地址转换模型,没有调度

FS:

  • FS模型模拟完整的全系统,包括OS,运行在用户态和核心态的线程调度以及各种设备。能够精确模拟系统时间等开销
  • 为启动操作系统
  • 建模裸硬件,包括设备
  • 中断、异常、特权指令、错误处理函数
  • 仿真UART输出
  • 仿真的帧缓冲输出

3、CPU 模型
GEM5支持四种不同的CPU模型:AtomicSimple,TimingSimple,In-Order,Out-Order(O3)。

  • 不同的CPU的模拟在速度和精确度之间的权衡不同。CPU四种模型可以在模型中任意切换,支持“热插拔”。四种CPU模型之所以被称为“热插拔”是因为CPUs共享通用部件和接口。
  • AtomicSimple是最简单规模的模型,一个cycle完成一条指令的执行,memory 模型比较理想化,访存操作为原子性操作。适用于快速功能模拟。
  • TimingSimple模拟器也是无流水线的模拟,但是使用了存储器访问时序模型,用以统计存储器访问延迟。
  • In-Order模型是GEM5模拟的新特性,强调指令时序与仿真精度,流水级为默认五级流水:取值、译码、执行、访存、写回。并且模拟了cache部件、执行部件、分支预测部件等。
  • O3模拟器是流水级模拟,O3模拟器模拟了乱序执行和超标量执行的指令间依赖,以及运行在多CPU上的并发执行的多线程。默认7级流水:取值、译码、重命名、发射、执行、写回、提交。模拟了物理寄存器文件、IO、LSQ、ROB功能部件池等。主要参数为流水管道间延迟、硬件线程数、IQ/LSQ/ROB项数、FU延迟、物理寄存器重命名、分支预测、访存依赖预测等。

4、支持ISA种类详解

  • ALPHA。ALPHA是GEM5中最常用的ISA。这种体系结构基于DEC Tsunami 系统,能够启动未修改Linux2.4/2.6 kernels 和 FreeBSD,并且能够扩展至64核。
  • ARM。模拟了Cortex-A9,支持Thumb,Thumb-2,VFPv3和NEON指令集。
  • X86。模拟了64位x86CPU,能够在SMP的配置模式下启动原始Linux kernel。
  • SPARC。模拟了UltraSPARCT1处理器,能够启动Solaris操作系统。 PowerPC。模拟了基于POWER ISAv2.06B的32位处理器。
  • MIPS。模拟了32位处理器核。

5、存储器系统
GEM5继承了M5和GEMS两种不同的存储器系统。M5的Classic mode存储器是最简单的模型,它提供了简洁快速的可配置性。GEMS的Ruby模型注重于精确度并且支持不同的cache一致性协议。

Gem5 文件结构

当我们下载一个gem5,并按照教程进行编译之后,主目录下文件夹的布局如图
在这里插入图片描述

build

具体内容参考博客
https://blog.csdn.net/ivy_reny/article/details/54093190

gem5需要按照如下指令进行编译,
scons <build dir>/<configuration>/<target>

scons build/X86/gem5.opt
编译生成的文件夹,编译时如果没有指定指令集类型,只是使用scons,就默认在build/ALPHA/中生成gem5.debug
我的build文件夹内部

同一build目录下的所有目标默认认为是由同一主机平台编译,并且共享相同的全局变量设置。这些全局变量设置位于build/variables.global文件中。 在这里插入图片描述

其中<build dir>通常是主目录下的build文件夹

<configuration>是编译选项,可以选择ISA类型、CPU模式、Ruby一致性协议等,这些被编译过的选项保存在build/variables目录下
在这里插入图片描述
<target>是要建立的gem5类型,如gem5.opt gem5.debug

目前支持的版本如下:

  • gem5.debug :关闭了优化。保证变量不会被优化掉,功能不会被意料外的内联(inlined),以及控制流行为正常。该版本与gdb类的工具合作良好,然而关闭优化会造成该版本明显慢于其它版本。当使用gdb或valgrind等工具并且不希望任何细节被模糊掉时应该选择该版本,否则建议选择其它版本。
  • gem5.opt :打开优化的同时保留了部分调试功能。该版本良好地平衡了模拟速度与调试观察,是所有环境中最优的版本。
  • gem5.fast : 打开优化并关闭调试部分。最优的速度,代价是不能进行运行时错误检查与调试输出。如果确信所有功能可以正确运行并想要获得峰值性能,建议使用该版本。
  • gem5.prof : 类似于gem5.fast,但仍然保留了一些功能可以用于gprof分析工具。该版本不常用,但可以用于找出gem5中应当被注意的部分以提升性能。
  • gem5.perf : 同gem5.prof,但是instrumentation使用google perftools,允许被google-pprof分析。该分析版本是gem5.prof的补充,可能可以在所有基于Linux的系统中替换gem5.prof。
    在这里插入图片描述
    表同样来源刚才链接的博客
    总之日常使用建议用.opt格式,用于分析建议使用prof或者perf

build-opts

构建不同ISA或其他选项的默认设置文件,里面有一些X86 ALPHA等
在这里插入图片描述
刚才说的编译选项<configuration>会默认在build_opts文件夹下搜索,如果配置文件在特殊的位置,需要使用–default来指定位置

configs

用python编写的模拟配置脚本。目录中的文件提供一些基本的预打包功能来帮助简化编写配置,并提供了一些示例,可以直接使用,也可在自己的脚本中使用。
在这里插入图片描述
http://learning.gem5.org/book/part1/example_configs.html
这个博客详细介绍了默认的configs
内部文件结构如下

/boot

configs/boot:
ammp.rcS            halt.sh                micro_tlblat2.rcS              netperf-stream-udp-local.rcS
...

全系统仿真时使用的rcS文件

/common

configs/common:
Benchmarks.py     cpu2000.py     Options.py
Caches.py         FSConfig.py    O3_ARM_v7a.py     SysPaths.py
CacheConfig.py    CpuConfig.py   MemConfig.py      Simulation.py

包含许多helper scripts & functions来创建模拟系统,比如caches.py就和之前我们自己设置的那个很像,这个文件夹应该算用的比较频繁的

Options.py
包含可在命令行上设置的各种选项。像CPU的数量,系统时钟等等。
可以在这个文件夹查看自己想改的东西是否已经可以在命令行定义
比如说我们刚才改的那个内存就一堆可选项
image
CacheConfig.py
设置classic cache缓存参数的选项和功能

MemConfig.py
设置内存系统的辅助功能

FSConfig.py
不同系统设置全系统仿真所必需的功能。

Simulation.py
设置和运行gem5的辅助函数
文件包含的许多代码都用于管理保存和还原checkpoints。文件非常复杂,但是它在模拟的运行方式上也提供了很大的灵活性

/dram

configs/dram:
sweep.py

测试dram的脚本

/example

configs/example:
fs.py       read_config.py       ruby_mem_test.py      ruby_random_test.py
memtest.py  ruby_direct_test.py  ruby_network_test.py  se.py

一些示例gem5配置脚本,可以直接使用它们来运行gem5
se.py和fs.py很有用

/ruby

configs/ruby:
MESI_Three_Level.py  MI_example.py           MOESI_CMP_token.py  Network_test.py
MESI_Two_Level.py    MOESI_CMP_directory.py  MOESI_hammer.py     Ruby.py

还记得之前说的缓存一致性问题不,ruby模式的

/splash2

configs/splash2:
cluster.py  run.py

运行the splash2 benchmark的脚本

/topologies

configs/topologies:
BaseTopology.py  Cluster.py  Crossbar.py  MeshDirCorners.py  Mesh.py  Pt2Pt.py  Torus.py

基于ruby的一些拓扑结构

ext

gem5的依赖,构建gem5非自带的外部软件包,比如我就导入了dramsim系列的软件包,用来设置内存部分
gem5也会自带一些依赖,如pybind11 libelf等
在这里插入图片描述

src

src是gem5的重要目录,里面存放gem5的源代码
在这里插入图片描述

  • arch:ISA实现
    • generic:在其他ISA中使用的通用文件。
    • isa_parser.py:解析ISA描述的解析器.
    • ISA directories:与给定ISA关联的文件
      • OS directories:通常在SE模式下用于支持ISA/OS组合的代码。
      • isa:ISA描述文件。
  • base:可能对其他项目有用的常规数据结构。
    • loader:用于加载二进制文件和读取符号表的代码。
    • stats:用于保存统计信息并将数据写入文件或数据库的代码。
    • vnc:VNC支持
  • cpu:CPU模型
  • dev:设备模型
    • ISA directories:特定于给定ISA的设备模型
  • doxygen:Doxygen模板和输出
  • kern:特定于操作系统但与体系结构无关的代码(例如,数据结构的类型)。
    • OS directories:特定于给定模拟操作系统的代码。
      mem:内存系统模型和基础架构
    • cache:在经典内存系统中实现缓存模型的代码。
    • ruby:实现ruby内存模型的代码。
    • protocol:Ruby协议定义。
    • slicc:slicc编译器。
  • python:用于配置和更高级别功能的Python代码。
  • sim:实现基本的基本模拟器功能的代码。

system

  • alpha ALPHA控制台和palcode
  • arm 一个简单的ARM引导程序

tests

与gem5的回归测试有关的文件

  • configs 用于测试的常规配置
  • test-progs 每个ISA的hello world二进制文件,其他二进制文件则分别下载
  • quick long 快速和长期回归输入 参考输出和测试特定的配置文件

util

实用程序脚本
程序和有用的文件不是gem5二进制文件的一部分,但在使用gem5时通常很有用

m5out

在这里插入图片描述
当我们成功使用生成的gem5文件系统,运行某一段程序后,会出现m5out文件夹,其中主要包含结构图、config.ini、stats.txt等,其中config.ini是被模拟的设置,stats.txt是本次运行的统计数据,具体的内容见其他博客。

其他

没有被手册说明的文件夹
site_scons 应该是存放scons的相关文件
include gem5相关的include文件

主目录文件

LICENSE 许可
CONTRIBUTING 上传教程(如果你对代码做了有效的改动)
COPYING 关于copyright的文件
MAINTAINERS 里面有一些关键字,每个关键字对应一个或者多个维护者
README 新手引导,包含官网链接、依赖环境、编译命令等等对gem5基本的解说

SConstruct

SConstruct是构建系统的一部分,作为build-opts目录
C/C++文档可以通过安装make,使用makefile的方式编译
同理,python文档可以通过安装scons,使用sconstruct的方式编译
主目录的SCons文件是SConstruct,其余的SCons文件命名为SConscript,放在其它位置,一般与相关文件同目录
这个后续会再进一步学习

猜你喜欢

转载自blog.csdn.net/Drinks_/article/details/117065147