gem5 文档
开发
构建
使用 KVM
Sphinx 文档
Doxygen 文档
gem5 API
全系统模拟 (Full System)
内存系统
Ruby 内存系统
检查点 (Checkpoints)
定向测试器 (Directed Testers)
调试 (Debugging)
架构支持
功耗与热模型
编译工作负载
统计包 (Stats)
统计 API
Develop 分支
v19.0.0.0
v20.0.0.0
v20.0.0.2
v20.0.0.3
v20.1.0.0
v20.1.0.1
v20.1.0.5
v21.0.0.0
v21.0.1.0
v21.1.0.0
v21.1.0.1
v21.1.0.2
v21.2.0.0
v21.2.1.0
v21.2.1.1
v22.0.0.0
v22.0.0.1
v22.1.0.0
v23.0.0.0
v23.0.0.1
v24.1.0.1
gem5 标准库 (Stdlib)
gem5 资源 (Resources)
Ruby 概述
缓存一致性协议
Garnet 2.0
HeteroGarnet
MOESI CMP 目录
Garnet 合成流量
SLICC 语言
MI 示例
Garnet 独立运行
互连网络
MOESI Hammer
MOESI CMP Token
MESI 两级缓存
CHI 协议
替换策略
CPU 模型
GPU 模型
M5ops 指令
authors: Jason Lowe-Power
last edited: 2026-01-30 06:21:33 +0000
last edited: 2026-01-30 06:21:33 +0000
Garnet 合成流量
Garnet 合成流量提供了一个框架,用于模拟带有受控输入的 Garnet 网络。这对网络测试/调试,或带有合成流量的仅网络模拟非常有用。
注意:garnet 合成流量注入器仅适用于 Garnet_standalone 一致性协议。
相关文件
- configs/example/garnet_synth_traffic.py: 调用网络测试器的文件
- src/cpu/testers/garnet_synthetic_traffic: 实现测试器的文件。
- GarnetSyntheticTraffic.py
- GarnetSyntheticTraffic.hh
- GarnetSyntheticTraffic.cc
如何运行
首先使用 Garnet_standalone 一致性协议构建 gem5。Garnet_standalone 协议与 ISA 无关,因此我们使用 NULL ISA 构建它。
对于 gem5 <= 23.0:
scons build/NULL/gem5.debug PROTOCOL=Garnet_standalone
对于 gem5 >= 23.1
scons defconfig build/NULL build_opts/NULL
scons setconfig build/NULL RUBY_PROTOCOL_GARNET_STANDALONE=y
scons build/NULL/gem5.debug
示例命令:
./build/NULL/gem5.debug configs/example/garnet_synth_traffic.py \
--num-cpus=16 \
--num-dirs=16 \
--network=garnet \
--topology=Mesh_XY \
--mesh-rows=4 \
--sim-cycles=1000 \
--synthetic=uniform_random \
--injectionrate=0.01
参数化选项
| 系统配置 | 描述 |
|---|---|
| –num-cpus | cpu 数量。这是网络中源(注入)节点的数量。 |
| –num-dirs | 目录数量。这是网络中目的地(弹出)节点的数量。 |
| –network | 网络模型:simple 或 garnet。使用 garnet 运行合成流量。 |
| –topology | 用于将 cpu 和 dirs 连接到网络路由器/交换机的拓扑。有关不同拓扑的更多详细信息可以在 (这里)[Interconnection_Network#Topology] 找到。 |
| –mesh-rows | 网格中的行数。仅当 ‘’–topology’’ 为 ‘‘Mesh_’’ 或 ‘‘MeshDirCorners_’’ 时有效。 |
| 网络配置 | 描述 |
|---|---|
| –router-latency | garnet 路由器中流水线级的默认数量。必须 >= 1。可以在拓扑文件中逐个路由器覆盖。 |
| –link-latency | 网络中每个链接的默认延迟。必须 >= 1。可以在拓扑文件中逐个链接覆盖。 |
| –vcs-per-vnet | 每个虚拟网络的 VC 数量。 |
| –link-width-bits | garnet 网络内所有链接的位宽。默认 = 128。 |
| 流量注入 | 描述 |
|---|---|
| –sim-cycles | 模拟应运行的总周期数。 |
| –synthetic | 要注入的合成流量类型。目前支持以下合成流量模式:’uniform_random’, ‘tornado’, ‘bit_complement’, ‘bit_reverse’, ‘bit_rotation’, ‘neighbor’, ‘shuffle’, 和 ‘transpose’。 |
| –injectionrate | 流量注入率,以 包/节点/周期 为单位。它可以取 0 到 1 之间的任何十进制值。小数点后的精度位数可以通过 ‘’–precision’’ 控制,该参数在 ‘‘garnet_synth_traffic.py’’ 中默认为 3。 |
| –single-sender-id | 仅从此发送者注入。要从所有节点发送,请设置为 -1。 |
| –single-dest-id | 仅发送到此目的地。要发送到合成流量模式指定的所有目的地,请设置为 -1。 |
| –num-packets-max | 每个 cpu 节点要注入的最大数据包数。默认值为 -1(保持注入直到 sim-cycles)。 |
| –inj-vnet | 仅在此 vnet(0, 1 或 2)中注入。0 和 1 是 1-flit,2 是 5-flit。设置为 -1 以在所有 vnet 中随机注入。 |
Garnet 合成流量的实现
合成流量注入器在 GarnetSyntheticTraffic.cc 中实现。生成和发送数据包所涉及的步骤序列如下。
- 每个周期,每个 cpu 执行一个概率等于 –injectionrate 的伯努利试验,以确定是否生成数据包。
- 如果 –num-packets-max 为非负数,每个 cpu 在生成 –num-packets-max 个数据包后停止生成新数据包。注入器在 –sim-cycles 后终止。
- 如果 cpu 必须生成新数据包,它会根据合成流量类型 (–synthetic) 计算新数据包的目的地。
- 此目的地嵌入到数据包地址中块偏移量之后的位中。
- 生成的数据包随机标记为 ReadReq、INST_FETCH 或 WriteReq,并发送到 Ruby 端口 (src/mem/ruby/system/RubyPort.hh/cc)。
- Ruby 端口将数据包分别转换为 RubyRequestType:LD、RubyRequestType:IFETCH 和 RubyRequestType:ST,并将其发送到 Sequencer,Sequencer 依次将其发送到 Garnet_standalone 缓存控制器。
- 缓存控制器从数据包地址中提取目的地目录。
- 缓存控制器分别将 LD、IFETCH 和 ST 注入虚拟网络 0、1 和 2。
- LD 和 IFETCH 作为控制数据包(8 字节)注入,而 ST 作为数据数据包(72 字节)注入。
- 数据包遍历网络并到达目录。
- 目录控制器只是将其丢弃。
