使用 gem5

gem5 资源


什么是资源?(磁盘、内核、二进制文件等)


重要类别及其描述

内核 (Kernel):通过管理系统资源来充当操作系统核心的计算机程序。 磁盘镜像 (disk-image):包含存储在存储设备上的数据精确副本的文件。 二进制文件 (binary):用于测试计算机系统性能的程序。 引导加载程序 (bootloader):在计算机启动时负责将操作系统加载到内存中的小程序。 检查点 (checkpoint):模拟的快照。 simpoint:此资源存储创建和恢复 Simpoint 所需的所有信息。 文件 (file):由单个文件组成的资源。 工作负载 (workload):可以在 gem5 中直接运行的资源包和任何输入参数。 套件 (suite):工作负载的集合。


资源版本控制

resource version fit bg right


在 gem5 模拟中使用资源

要在 gem5 中使用资源,我们可以使用 obtain_resource 函数。

让我们做一个示例,在示例中使用 x86-hello64-static 二进制文件。

转到 materials/02-Using-gem5/02-gem5-resources/01-hello-example.py

此文件构建一个基本板子,我们将使用 x86-hello64-static 资源并运行模拟。


运行 hello 二进制文件

要获取二进制文件,我们编写以下行:

board.set_se_binary_workload(obtain_resource("x86-hello64-static"))

让我们分解这段代码

然后我们运行模拟

cd materials/02-Using-gem5/02-gem5-resources
gem5 01-hello-example.py

工作负载

工作负载是一个或多个资源的包,可以具有预定义的参数。

让我们看看 x86-npb-is-size-s-run 工作负载。

此工作负载在 SE 模式下运行 NPB IS 基准测试。

你可以在资源网站的 raw 选项卡中查看工作负载的 JSON。

workload se fit bg right


工作负载(续)

让我们看看 x86-ubuntu-24.04-boot-with-systemd 工作负载,你可以查看 raw 选项卡以了解资源的制作方式。


套件

套件是工作负载的集合,可以使用多处理并行运行(稍后将显示)。

套件中的所有工作负载都有一个名为 input_groups 的内容,可用于过滤套件。

让我们做一个示例,我们将:


打印套件中的所有工作负载

SuiteResource 类充当生成器,因此我们可以遍历工作负载。

让我们打印 x86-getting-started-benchmark-suite 套件中的一些工作负载信息。

让我们修改 02-suite-workload-example.py。下面,我们获取资源并遍历套件,打印每个工作负载的 idversion。将此添加到脚本的底部:

getting_started_suite = obtain_resource("x86-getting-started-benchmark-suite")
for workload in getting_started_suite:
    print(f"Workload ID: {workload.get_id()}")
    print(f"workload version: {workload.get_resource_version()}")
    print("=========================================")

现在运行:

gem5 02-suite-workload-example.py

input_groups 过滤套件

套件中的每个工作负载都有一个或多个 input_groups,我们可以按此过滤。

让我们打印套件中所有唯一的输入组。

我们可以使用 get_input_groups() 函数来做到这一点:

print("Input groups in the suite")
print(getting_started_suite.get_input_groups())

从套件运行工作负载(单个代码块)

让我们在此套件中运行 NPB IS 基准测试。

首先,我们需要过滤套件以获取此工作负载。我们可以通过过滤来获取所有具有输入标签 "is" 的工作负载。

我们将返回的对象转换为列表并获取其中的第一个工作负载。这有效是因为 "is" 是一个唯一标签,只有一个工作负载拥有它,即我们正在寻找的 NPB IS 工作负载。

让我们打印工作负载的 id,然后使用我们拥有的板子运行它:

npb_is_workload = list(getting_started_suite.with_input_group("is"))[0]
print(f"Workload ID: {npb_is_workload.get_id()}")
board.set_workload(npb_is_workload)

simulator = Simulator(board=board)
simulator.run()

本地资源

你也可以在 gem5 中使用本地创建的资源。

你可以创建一个本地 JSON 文件作为数据源,然后设置:

有关如何使用本地资源的更多详细信息,请阅读本地资源文档


为什么使用本地资源

gem5 有两种主要方式使用本地资源。

让我们做一个示例,创建一个本地二进制文件并在 gem5 中运行该二进制文件。


让我们创建一个二进制文件

让我们使用这个打印简单三角形图案的 C 程序

编译此程序。这将是我们在 gem5 中运行的二进制文件。

gcc -o pattern pattern.c

现在,让我们使用本地路径方法。

03-run-local-resource-local-path.py 中,按如下方式创建二进制资源对象:

binary = BinaryResource(local_path="./pattern")

让我们运行模拟并查看输出

gem5 03-run-local-resource-local-path.py

让我们为二进制资源创建一个 JSON 文件

二进制文件的 JSON 资源 如下所示:

{
  "category": "binary",
  "id": "x86-pattern-print",
  "description": "A simple X86 binary that prints a pattern",
  "architecture": "X86",
  "size": 1,
  "tags": [],
  "is_zipped": false,
  "md5sum": "2a0689d8a0168b3d5613b01dac22b9ec",
  "source": "",
  "url": "file://./pattern",
  "code_examples": [],
  "license": "",
  "author": [
      "Harshil Patel"
  ],
  "source_url": "",
  "resource_version": "1.0.0",
  "gem5_versions": [
      "23.0",
      "23.1",
      "24.0"
  ],
  "example_usage": "obtain_resource(resource_id=\"x86-pattern-print\")"
}

让我们获取资源并运行模拟

04-run-local-resource-json.py 中,我们可以通过使用 obtain_resource 来获取二进制文件:

board.set_se_binary_workload(obtain_resource("x86-pattern-print"))

让我们运行模拟。

我们通过在通常的 gem5 命令之前定义 GEM5_RESOURCE_JSON_APPEND 与我们的 JSON 资源来做到这一点:

GEM5_RESOURCE_JSON_APPEND=local_resources.json gem5 04-run-local-resource-json.py