새 채팅
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

1개월 전
  • 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 提供中文实践指南