محادثة جديدة
Ctrl
K
المكونات الإضافية المهام المجدولة
Kimi Work Kimi Code
  • الحصول على التطبيق
  • نبذة عنا
  • اللغة
  • الحصول على مساعدة

gem5 Garnet 进化实验

gem5 garnet 的演进,原理,实验的详细教程
gem5Garnet网络互连教程
用户要求关于 gem5 garnet 的演进、原理、实验的详细教程。这是一个关于计算机体系结构模拟器 gem5 中 Garnet 网络互连(Network-on-Chip, NoC)模型的详细教程请求。
我需要:
  1. 先搜索相关信息,了解 gem5 Garnet 的最新资料
  2. 提供详细的教程,包括演进、原理和实验部分
让我先搜索相关资料。
بحث
gem5 garnet network on chip tutorial 2025 2026 gem5 garnet NoC evolution principles gem5 garnet routing topology detailed guide
38 نتيجة
Garnet 进化与实验指南
用户要求关于 gem5 Garnet 的演进、原理、实验的详细教程。我已经获得了大量搜索资料,包括官方文档、教程幻灯片、GitHub 仓库等。让我整理这些信息,提供一个全面的中文教程。
关键信息来源:
  1. gem5 官方文档 (Garnet 2.0) - web_search:1#0, web_search:1#1
  2. Georgia Tech 的 Garnet2.0 教程幻灯片 - web_search:1#8
  3. gem5 bootcamp 幻灯片 - web_search:1#2
  4. GitHub 上的 NoC simulation tutorial - web_search:1#17
  5. 中文翻译版本 - web_search:1#7, web_search:1#16
  6. Georgia Tech 的课程页面 - web_search:1#15
  7. 讨论区关于 synthetic traffic 的实验 - web_search:1#4, web_search:1#9
我需要组织一个结构清晰的教程,涵盖:
  1. 演进历史(Garnet -> Garnet2.0 -> HeteroGarnet 等)
  2. 核心原理(拓扑、路由、流控、路由器微架构)
  3. 实验指南(编译、运行 standalone、配置参数、分析结果)
让我详细构建这个教程。

gem5 Garnet 片上网络(NoC)详细教程

一、演进历史

1.1 Garnet 的起源与发展

جدول
نسخ
版本年份核心特性
Garnet (原始版)20095级流水线虚拟通道路由器,由 Niket Agarwal 和 Tushar Krishna 开发
Garnet2.020161级流水线,更高可配置性,支持异构 SoC 建模
Garnet3.0 / HeteroGarnet2020+支持非对称拓扑、更丰富的路由算法、功耗统计
Garnet 是 gem5 Ruby 内存系统内部的周期精确片上网络(NoC)模型。与 Simple Network 相比,Garnet 能精确建模竞争、路由器资源利用率和功耗统计
。

二、核心原理

2.1 系统架构与组件

Garnet 网络由以下核心组件构成
:
plain
نسخ
┌─────────────────────────────────────────────────────────┐
│                    GarnetNetwork                         │
│  ┌─────────┐    ┌─────────┐    ┌─────────┐            │
│  │   NI    │◄──►│ Router  │◄──►│  Link   │            │
│  │(Network │    │ (5-stage│    │(Network/ │            │
│  │Interface)│    │ pipeline│   │ Credit) │            │
│  └────┬────┘    └─────────┘    └─────────┘            │
│       │                                                │
│  Cache/Directory Controller                            │
└─────────────────────────────────────────────────────────┘
关键组件说明:
جدول
نسخ
组件功能对应文件
GarnetNetwork顶层对象,实例化所有 NI、路由器和链路GarnetNetwork.py / .cc
NetworkInterface连接一致性控制器与路由器,将消息拆分为 flitsNetworkInterface.cc
Router5级流水线虚拟通道路由器,管理仲裁和流控Router.cc
NetworkLink传输 flits(数据链路),支持跨时钟域NetworkLink.cc
CreditLink传输 VC/缓冲区 credits(流控链路)CreditLink.cc

2.2 路由器微架构(5级流水线)

Garnet 路由器采用经典的 5级流水线虚拟通道路由器
:
plain
نسخ
┌────────────────────────────────────────────────────────────┐
│  BW  │  RC  │  VA  │  SA  │  ST  │  LT                      │
│ 写缓冲│路由计算│VC分配│开关分配│开关遍历│链路遍历               │
└────────────────────────────────────────────────────────────┘
各阶段详细说明:
جدول
نسخ
阶段全称功能
BWBuffer Write输入 flit 被写入对应虚拟通道的缓冲区
RCRoute Compute根据路由表计算输出端口(由 RoutingUnit 完成)
VAVC Allocation为 HEAD/HEAD_TAIL flit 分配下游 VC
SASwitch Allocation输入 VC 竞争交叉开关(先输入仲裁,后输出仲裁)
STSwitch Traversal获胜 flit 通过交叉开关
LTLink Traversalflit 通过链路到达下一跳路由器
默认配置下,BW、RC、VA、SA、ST 均在1个周期内完成,LT 在下一个周期完成。 多周期路由器可通过 router_latency 参数配置
。

2.3 流控机制:虚拟通道(Virtual Channel)

Garnet 采用 Virtual Channel Flow Control
:
  • 每个虚拟网络(Vnet)包含多个虚拟通道(VC)
  • 控制包:默认 1-flit,缓冲区深度 1
  • 数据包:默认 5-flit,缓冲区深度 4
  • 通过 Credit-based 流控传递缓冲区状态信息
关键参数(在 GarnetNetwork.py 中定义):
Python
نسخ
class GarnetNetwork(RubyNetwork):
    ni_flit_size = Param.UInt32(16, "network interface flit size in bytes")
    vcs_per_vnet = Param.UInt32(4, "virtual channels per virtual network")
    buffers_per_data_vc = Param.UInt32(4, "buffers per data virtual channel")
    buffers_per_ctrl_vc = Param.UInt32(1, "buffers per ctrl virtual channel")
    routing_algorithm = Param.Int(0, "0: Weight-based Table, 1: XY, 2: Custom")

2.4 拓扑结构

Garnet 利用 Ruby 内存系统的拓扑基础设施,支持任意异构拓扑
。
内置拓扑类型:
جدول
نسخ
拓扑描述命令行调用
Crossbar所有控制器通过简单开关连接到中央交叉开关--topology=Crossbar
CrossbarGarnet每个控制器通过 Garnet 路由器连接--topology=CrossbarGarnet
Pt2Pt每对控制器之间直接链路--topology=Pt2Pt
Mesh_XY2D Mesh,XY 路由(先X后Y)--topology=Mesh_XY --mesh-rows=N
Mesh_westfirst2D Mesh,West-first 路由--topology=Mesh_westfirst
MeshDirCorners_XY2D Mesh,目录放在四角--topology=MeshDirCorners_XY
拓扑文件位置:src/mem/ruby/network/topologies/

2.5 路由算法

Garnet 支持三种路由模式
:
  1. 基于权重的表路由(默认):--routing-algorithm=0
    • 自动填充最短路径路由表
    • 多路径时选择权重最小的链路
  2. XY 路由:--routing-algorithm=1
    • 2D Mesh 中先沿 X 方向,再沿 Y 方向
    • 实现于 RoutingUnit.cc::outportComputeXY()
  3. 自定义路由:--routing-algorithm=2
    • 通过 src_outport 和 dst_inport 命名链路方向
    • 实现 outportComputeCustom() 函数

三、实验指南

3.1 环境编译

方式 A:Standalone 模式(纯网络模拟,无 CPU)

Standalone 模式用于研究 NoC 本身,不涉及缓存一致性协议
:
bash
نسخ
# 1. 配置编译选项
scons defconfig build/NULL build_opts/NULL
scons setconfig build/NULL RUBY_PROTOCOL_GARNET_STANDALONE=y

# 2. 编译
scons build/NULL/gem5.debug -j$(nproc)

# 或使用旧版命令
scons build/Garnet_standalone/gem5.debug PROTOCOL=Garnet_standalone -j$(nproc)

方式 B:集成模式(带 Ruby 一致性协议)

bash
نسخ
# 例如使用 MESI Two Level 协议
scons build/X86/gem5.opt PROTOCOL=MESI_Two_Level -j$(nproc)

3.2 运行 Synthetic Traffic 实验

Standalone 模式使用合成流量生成器测试网络性能
:
bash
نسخ
./build/NULL/gem5.debug configs/example/garnet_synth_traffic.py \
    --num-cpus=64 \
    --num-dirs=64 \
    --network=garnet \
    --topology=Mesh_XY \
    --mesh-rows=8 \
    --sim-cycles=100000000 \
    --synthetic=uniform_random \
    --inj-vnet=2 \
    --injectionrate=0.15 \
    --router-latency=1 \
    --link-latency=1 \
    --vcs-per-vnet=4 \
    --routing-algorithm=1 \
    --sys-clock=1GHz \
    --ruby-clock=1GHz \
    --link-width-bits=128
合成流量模式(--synthetic):
جدول
نسخ
模式描述
uniform_random每个节点随机选择目标节点
transpose节点 (i,j) 发送到 (j,i)
bit_complement按位取反确定目标
shuffle循环移位
neighbor发送到相邻节点
tornado发送到 (i+N/2)%N

3.3 集成 Ruby 协议的完整系统模拟

bash
نسخ
./build/X86/gem5.opt configs/example/ruby_random_test.py \
    --num-cpus=16 \
    --num-dirs=16 \
    --network=garnet2.0 \
    --topology=Mesh_XY \
    --mesh-rows=4 \
    --vcs-per-vnet=4 \
    --router-latency=2 \
    --link-latency=1

3.4 关键参数配置表

جدول
نسخ
参数说明默认值
--num-cpus源节点(注入节点)数量-
--num-dirs目的节点(弹出节点)数量-
--network网络模型:simple 或 garnet2.0simple
--topology拓扑结构Crossbar
--mesh-rowsMesh 行数(仅 Mesh 拓扑)0
--router-latency路由器流水线级数(≥1)1
--link-latency链路延迟(周期)1
--vcs-per-vnet每个虚拟网络的 VC 数4
--link-width-bits链路位宽128
--routing-algorithm0=表路由, 1=XY, 2=自定义0
--garnet-deadlock-threshold死锁检测阈值(周期)50000

3.5 结果分析

模拟结束后,在 m5out/ 目录查看 stats.txt,关键指标:
bash
نسخ
# 网络级统计
grep "packets_injected" m5out/stats.txt
grep "packets_received" m5out/stats.txt
grep "average_packet_latency" m5out/stats.txt
grep "average_packet_queueing_latency" m5out/stats.txt
grep "average_packet_network_latency" m5out/stats.txt

# 路由器级统计(每个路由器)
grep "router.*flits_in" m5out/stats.txt
grep "router.*flits_out" m5out/stats.txt
核心性能指标:
جدول
نسخ
指标含义理想值
average_packet_latency平均包延迟(周期)越低越好
packets_injected总注入包数反映负载
packets_received总接收包数应与注入匹配
average_hops平均跳数与拓扑相关
max_packet_latency最大包延迟检测热点/死锁

3.6 批量实验脚本示例

以下脚本用于扫描不同注入率下的网络饱和度
:
bash
نسخ
#!/bin/bash
# run_sweep.sh - 注入率扫描实验

TRAFFICS=("uniform_random" "transpose" "bit_complement")
INJ_RATES=(0.01 0.05 0.10 0.15 0.20 0.25 0.30)
TOPOLOGY="Mesh_XY"
ROWS=8
CPUS=64
DIRS=64

for traffic in "${TRAFFICS[@]}"; do
    for inj in "${INJ_RATES[@]}"; do
        outdir="results/${traffic}_${inj}"
        mkdir -p $outdir
        
        ./build/NULL/gem5.debug -re $outdir \
            configs/example/garnet_synth_traffic.py \
            --num-cpus=$CPUS \
            --num-dirs=$DIRS \
            --network=garnet \
            --topology=$TOPOLOGY \
            --mesh-rows=$ROWS \
            --sim-cycles=1000000 \
            --synthetic=$traffic \
            --injectionrate=$inj \
            --vcs-per-vnet=4 \
            --routing-algorithm=1 \
            --link-width-bits=128
        
        # 提取关键结果
        latency=$(grep "average_packet_latency" $outdir/stats.txt | awk '{print $2}')
        echo "$traffic,$inj,$latency" >> sweep_results.csv
    done
done

四、进阶主题

4.1 自定义拓扑

在 src/mem/ruby/network/topologies/ 下创建新的拓扑文件,继承 Topology 类,定义 init() 方法连接 routers、NI 和 links。

4.2 自定义路由

修改 src/mem/ruby/network/garnet/RoutingUnit.cc:
cpp
نسخ
// 在 outportComputeCustom() 中实现自定义逻辑
int outportComputeCustom(RouteInfo route, int inport, PortDirection direction) {
    // 例如:基于下游 VC 空闲状态的自适应路由
    int outport = -1;
    // ... 自定义算法 ...
    return outport;
}
然后使用 --routing-algorithm=2 调用。

4.3 功耗建模

Garnet 可生成路由器功耗统计,需配合 Orion 或 DSENT 等功耗模型库。通过 --enable-power 相关参数启用。

五、常见问题排查

جدول
نسخ
问题可能原因解决方案
早期拥塞(Early Congestion)VC 数不足、缓冲区太小增加 --vcs-per-vnet 或 buffers_per_data_vc
死锁(Deadlock)路由算法无死锁自由保证使用 XY 路由或增加 VC
饱和吞吐量低于理论值链路宽度、路由器延迟配置检查 --link-width-bits 和 --router-latency
编译错误协议选择错误确认 RUBY_PROTOCOL_GARNET_STANDALONE=y

参考资源

Github

NoC simulation using gem5 (a simple tul)

Synergy Lab

Garnet2.0: A Detailed On-Chip Network Model Inside a Full-System Simulator

gem5

gem5: Garnet 2.0

قبل شهر واحد
  • Georgia Tech Garnet 页面:http://synergy.ece.gatech.edu/garnet
  • gem5 官方文档:https://www.gem5.org/documentation/general_docs/ruby/garnet-2/
  • Garnet2.0 教程幻灯片(ARM Research Summit 2017):详细讲解微架构和配置
  • GitHub NoC Tutorial:https://github.com/xinchen13/gem5-noc 提供中文实践指南