【Booksim】Booksim2.0模拟器集成新拓扑

BookSim2.0 教程 本文是yz关于BookSim2.0的个人学习经验与教程。 1.介绍 什么是BookSim2.0 BookSim2.0 是周期正确的互联网络模拟器(A Cycle-Accurate Interconnection Network Simulator),被设计用来伴随William James Dally 等人出版的的书籍 Principles and Practices of INterconnection on Networks使用。 此后其功能不断得到扩展。当前的主要版本 BookSim 2.0 支持广泛 阅读详情
AI摘要

本文详细描述了如何在Booksim模拟器中添加新拓扑结构,包括添加必要的头文件、编写构造函数和路由函数,以及配置文件的调整。文章还展示了不同参数下拓扑集成后的仿真模拟结果。

Incorporating a new topology in Booksim

1. 新拓扑结构

在这里插入图片描述

如图1所示,拟集成一种上述的拓扑。

2. 需要添加的文件

在Booksim中集成新的拓扑,我们需要添加如下文件:

  • 拓扑文件
    • testnet.cpp
    • testnet.cpp
  • 配置文件
    • Testnetconfig
  • 修改文件
    • network.cpp

3. 修改步骤

3.1 添加testnet.hpp

 #ifndef _TestNet_HPP_
 #define _TestNet_HPP_

 #include "network.hpp"
 #include "routefunc.hpp"

 class TestNet : public Network {
 public:
 TestNet( const Configuration &config, const string & name );
 static void RegisterRoutingFunctions() ;

 private:

 int _a;// 路由器总数
 int _p;// 每个路由器管理的处理节点
 int _k;// 每个路由器的端口数

 void _ComputeSize( const Configuration &config );// 计算拓扑大小
 void _BuildNet( const Configuration& config );// 构建网络
 };

 int testnet_port(int rID, int src, int dest);

 //
 // Routing Functions
 //
 void min_testnet( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) ;

 #endif

3.2 添加testnet.cpp

  1. 构造函数
TestNet::TestNet( const Configuration& config, const string & name ) 
: Network(config, name) 
{
cout<< "testnet constructor starts..."<<endl;
_ComputeSize(config);
_Alloc();
_BuildNet(config);
cout<< "testnet constructor ends..."<<endl;

}
  1. _ComputeSize()
void TestNet::_ComputeSize( const Configuration &config ) {

cout<< "_ComputeSize starts..."<<endl;

// _a _p _k 均为硬编码,但可以使用GetInt()从配置文件中获取
_a = 4;// 路由器总数
_p = 3;// 每个路由器管理的处理节点

_k = (_a-1) + _p;// 每个路由器的端口数

// 以下三个参数为network中需要使用的
_nodes    = _a * _p; // Number of nodes in network 总节点数(除却路由器)
_size     = _a + _a * _p;      // Number of routers in network 包括路由器和处理节点
_channels = _a * (_a-1);     // 路由器之间的uni-directional link,不包括处理节点

// 全局变量,路由函数需要
gP_testnet = _p;
gA_testnet = _a;

cout<< "_ComputeSize ends..."<<endl;
}
  1. _Alloc()
    _Alloc()定义在network.cpp,用于分配注入弹出通道和路由器link。

  2. _BuildNet()
    _BuildNet()初始化路由器,添加所有的通道。如下图所示:
    在这里插入图片描述

void TestNet::_BuildNet( const Configuration& config ) {
// for every router 
    // build the router object
    // add the links to the processing nodes
    // add the links to the other routers

ostringstream router_name;
int node;
int c, cnt;
int port_to_routers = _a - 1;

for (node = 0; node < _a; ++node) {
    // create router
    router_name<< "router";
    router_name<< "_"<< node;
    // k是输入输出端口数
    _routers[node] = Router::NewRouter(config, this, router_name.str(), node, _k, _k);
    _timed_modules.push_back(_routers[node]);
    router_name.str("");
    
    // add input and output channels to processing nodes
    for(cnt = 0; cnt < _p; cnt++){
    c = _p * node + cnt; // for router 0, c is 0,1,2; router 1, c is 3,4,5 and so on.
    _routers[node]->AddInputChannel(_inject[c], _inject_cred[c]);
    }

    for(cnt = 0; cnt < _p; cnt++){
    c = _p * node + cnt; // for router 0, c is 0,1,2; router 1, c is 3,4,5 and so on.
    _routers[node]->AddOutputChannel(_eject[c], _eject_cred[c]);
    }

    // add output and input channels to other routers
    // add output channels
    for(cnt = 0; cnt < _a - 1; cnt++){
    c = port_to_routers * node + cnt; // for router 0, c is 0,1,2; router 1, c is 3,4,5 and so on.
    _routers[node]->AddOutputChannel(_chan[c], _chan_cred[c]);
    }

    // add input channels
    for(cnt = 0; cnt < _a; cnt++)
    {
    if(cnt == node)
    {
        continue;// do nothing
    }
    else if(cnt < node)
    {
        c = cnt * port_to_routers - 1 + node;
    }
    else if(cnt > node)
    {
        c = cnt * port_to_routers + node;
    }
    _routers[node]->AddInputChannel(_chan[c], _chan_cred[c]);
    }
}
}
  1. RegisterRoutingFunctions()
    该函数注册拓扑的路由算法,而gRoutingFunctionMap定义在routefunc.cpp
void TestNet::RegisterRoutingFunctions() {
    gRoutingFunctionMap["min_testnet"] = &min_testnet;
}

对于一组特定的router, flit和input channel, 需要提供一个output port和output VC用于路由。
6. testnet_port(int rID, int src, int dest)选择正确的输出端口

int testnet_port(int rID, int src, int dest)// find the right port
{
    int dst_router;
    int out_port;

    dst_router = dest / gP_testnet;

    if(rID == dst_router)// 目标node是在当前路由器管理之下
    {
        out_port = dest % gP_testnet;
    }
    else// 如果是在其他router下管理
    {
        if(dst_router < rID)
        {
        out_port = gP_testnet + dst_router;
        }
        else{
        out_port = gP_testnet + dst_router - 1;
        }
    }

    return out_port;
}

  1. min_testnet()进行路由
void min_testnet( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
{
  int debug = f->watch;
  outputs->Clear();

  if(inject)
  {
      int inject_vc = RandomInt(gNumVCs-1);
      outputs->AddRange(-1, inject_vc, inject_vc);
      return;
  }

  int rID = r->GetID();

  int out_port = -1;
  int out_vc = 0;

  if(in_channel < gP_testnet)// source node assign to vc0
  {
      out_vc = 0;
  }
  else// dest node assign it to vc1
  {
      out_vc = 1;
  }

  out_port = testnet_port(rID, f->src, f->dest);

  outputs->AddRange(out_port, out_vc, out_vc);

  if(debug)
  {
      *gWatchOut << GetSimTime()<<" | "<<r->FullName()<<" | "
          <<" through output port : "<< out_port
          <<" out vc: "<< out_vc << endl;
  }
}

3.3 将testnet集成到network.cpp中

- 添加testnet.hpp

在这里插入图片描述

- 加入testnet拓扑

在这里插入图片描述

3.4 创建配置文件testnetconfig

```
// Topology
topology = testnet;

//a = 4;
//p = 3;

//Routing
routing_function = min;

// Flow control
num_vcs = 2;

// Traffic
traffic = uniform;
injection_rate = 0.25;
```

3.5 在main.cpp和global.hpp中加入gP_testnet和gA_testnet变量

3.6 make进行编译

4. 仿真模拟结果

  • a = 4, p = 3时运行booksim得到如下结果:
====== Overall Traffic Statistics ======
====== Traffic class 0 ======
Packet latency average = 14.392 (1 samples)
        minimum = 7 (1 samples)
        maximum = 78 (1 samples)
Network latency average = 14.3911 (1 samples)
        minimum = 7 (1 samples)
        maximum = 78 (1 samples)
Flit latency average = 14.4049 (1 samples)
        minimum = 7 (1 samples)
        maximum = 78 (1 samples)
Fragmentation average = 0 (1 samples)
        minimum = 0 (1 samples)
        maximum = 0 (1 samples)
Injected packet rate average = 0.250979 (1 samples)
        minimum = 0.24025 (1 samples)
        maximum = 0.26 (1 samples)
Accepted packet rate average = 0.251208 (1 samples)
        minimum = 0.23125 (1 samples)
        maximum = 0.27025 (1 samples)
Injected flit rate average = 0.250979 (1 samples)
        minimum = 0.24025 (1 samples)
        maximum = 0.26 (1 samples)
Accepted flit rate average = 0.251208 (1 samples)
        minimum = 0.23125 (1 samples)
        maximum = 0.27025 (1 samples)
Injected packet size average = 1 (1 samples)
Accepted packet size average = 1 (1 samples)
Hops average = 1.74948 (1 samples)
Total run time 0.0592558
  • a = 8, p = 4时运行booksim得到如下结果:
====== Overall Traffic Statistics ======
====== Traffic class 0 ======
Packet latency average = 14.1645 (1 samples)
        minimum = 7 (1 samples)
        maximum = 40 (1 samples)
Network latency average = 14.1645 (1 samples)
        minimum = 7 (1 samples)
        maximum = 40 (1 samples)
Flit latency average = 14.1681 (1 samples)
        minimum = 7 (1 samples)
        maximum = 40 (1 samples)
Fragmentation average = 0 (1 samples)
        minimum = 0 (1 samples)
        maximum = 0 (1 samples)
Injected packet rate average = 0.248344 (1 samples)
        minimum = 0.236 (1 samples)
        maximum = 0.261667 (1 samples)
Accepted packet rate average = 0.248417 (1 samples)
        minimum = 0.223667 (1 samples)
        maximum = 0.273667 (1 samples)
Injected flit rate average = 0.248344 (1 samples)
        minimum = 0.236 (1 samples)
        maximum = 0.261667 (1 samples)
Accepted flit rate average = 0.248417 (1 samples)
        minimum = 0.223667 (1 samples)
        maximum = 0.273667 (1 samples)
Injected packet size average = 1 (1 samples)
Accepted packet size average = 1 (1 samples)
Hops average = 1.87333 (1 samples)
Total run time 0.14817
BookSim2.0 从入门到实践:安装、配置与基础仿真指南 本文提供了BookSim2.0片上网络模拟器的完整入门教程,涵盖从环境搭建、编译安装到配置文件解析与基础仿真的全流程。通过手把手指导,帮助读者快速掌握这一芯片内部互联网络性能评估的黄金标准工具,并学会运行自定义仿真与结果分析。 阅读详情

相关推荐

BookSim2.0路由算法实战:用Mesh/Torus拓扑复现PPIN经典结果

本文详细介绍了如何使用BookSim2.0工具在Mesh/Torus拓扑中复现PPIN经典路由算法结果。通过DOM/ROMM/VAL/MAD四种算法的对比实验,验证了不同路由策略在8-ary 2-mesh环境下的性能表现,并提供了配置调优和异常处理的实用技巧,帮助读者掌握芯片网络仿真的关键技术。

weixin_30776273的博客 408

multi2sim,booksim简介

booksim是周期精确互连网络仿真器,设计用来配合"Principles and Practices of Interconnection Networks"课程教学,仿真器采用C++语言编写,目前项目源码寄托在Github上,https://github.com/booksim/booksim2。 BookSim is a cycle-accurate interconnection net...

weixin_30802171的博客 1250

BookSim2.0入门指南:从安装到运行第一个HelloWorld(Ubuntu20.04实测)

本文提供BookSim2.0在Ubuntu20.04LTS环境下的完整安装与运行教程,涵盖从依赖安装、源码编译到第一个HelloWorld示例的详细步骤。作为业界领先的周期精确网络模拟器,BookSim2.0能有效验证多核处理器通信性能,适合芯片设计研究者快速上手。教程包含常见问题解决方案和进阶配置技巧,帮助用户高效开展NoC研究。

weixin_28309571的博客 262

noc多核芯片设计:booksim仿真从入门到精通2拓扑与信道定制修改(含Segmentation fault (core dumped)/Program received signal等问题解决)

本文概述了KNCube网络拓扑构建函数_BuildNet的核心功能,重点分析了节点编号、通道适配和网络构建逻辑。主要内容包括: 函数功能:根据配置初始化多维网状网络,连接节点通道,设置延迟参数,并决定是否启用NoC延迟模型。 节点编号系统: 总节点数_size = _k^_n(_k为每维节点数,_n为维度数) 节点采用行主序编号,通过mod和除法运算可转换为多维坐标 以4×4二维网格为例详细说明了编号与坐标的对应关系 关键函数模块: 路由器的创建与命名(如router_0_1_2) 邻接节点计算(_Left

soulermax的博客 1329

rtl2booksim:带有钩子的片上网络模拟器(Booksim),用于在Verilog中共同仿真RTL设计

RTL2Booksim “将RTL设计连接到灵活的NoC仿真器” 该工具允许将C / C ++模拟器或RTL(Verilog)设计连接到Booksim(Booksim是斯坦福大学开发的一种广泛使用的具有周期精度的NoC模拟器,也可以在GitHub上找到)。 简而言之,RTL2Booksim允许您在Verilog设计中使用NoC,而无需实际为其编写Verilog,相反,我们使用Booksim尝试了许多不同的NoC变体,而无需额外的设计工作。 首先,请看示例。 cpp_example:调用“ send_flit”和“ send_credit”之类的函数来演示如何编写与Bookim通信的简单cpp模拟器。 verilog_example:实例化“ rtl_interface.sv”,它基本上是Booksim NoC的verilog包装器。 然后,您可以通过rtl_interface将设

Booksim NOC评估代码

适合Booksim NOC评估

BookSim 2.0 开源项目教程

BookSim 2.0 开源项目教程 1. 项目介绍 BookSim 2.0 是一个周期精确的互连网络模拟器,最初是为《互连网络的原理与实践》一书开发的。随着时间的推移,其功能不断扩展,当前的主要版本 BookSim 2.0 支持多种拓扑结构,如网格、环形和扁平蝴蝶网络,并提供了多种路由算法,以及丰富的选项来自定义网络的路由器微架构。 BookSim 2.0 的主要特点包括: 支持多种网络拓扑结...

gitblog_00320的博客 1274

BookSim 2.0 User's Guide

BookSim 2.0用户指南。A cycle-accurate interconnection network simulator.

【亲测免费】 BookSim 2.0 开源项目使用教程

BookSim 2.0 开源项目使用教程 1. 项目的目录结构及介绍 BookSim 2.0 是一个用于模拟互连网络的周期精确模拟器。项目的目录结构如下: booksim2/ ├── doc/ │ └── ... # 文档文件 ├── runfiles/ │ └── ... # 运行文件 ├── src/ │ └── ... # 源代码文件 ├── utils/ │ └── ...

gitblog_00114的博客 1270

book sim1.0

一款用C++编写的用于片上网络架构和仿真的模拟器,对NOC的研究人员有很大帮助,

达梦DM8整合Seata AT模式实战:手把手教你搞定分布式事务(含源码修改避坑)

本文详细介绍了达梦DM8数据库与Seata AT模式的深度整合实战,包括环境准备、架构设计、源码适配及分布式事务落地。通过独创性源码改造,解决了Seata官方对达梦数据库AT模式支持的限制,为国产数据库在微服务架构中的应用提供了可靠的事务保障。

weixin_30764771的博客 333

【亲测免费】 BookSim 2.0 开源项目常见问题解决方案

BookSim 2.0 开源项目常见问题解决方案 BookSim 2.0 是一个周期精确的互联网络模拟器,主要用于模拟和分析各种互联网络拓扑结构,如网格、环面和扁平蝴蝶网络等。该项目的主要编程语言是 C++,同时也包含一些 C 语言和其他语言的代码。 1. 项目基础介绍和主要编程语言 BookSim 2.0 最初是为了配合《互联网络原理与实践》一书而开发的,其功能已经不断扩展和增强。它支持多种路由...

gitblog_00665的博客 935

【QGIS】利用“创建网格”功能实现区域等距分割与坐标转换实战

本文详细介绍了如何在QGIS中使用“创建网格”工具实现区域等距分割。通过实战演示,将北京市行政区划切割为150米正方形网格,并重点讲解了关键步骤:选择投影坐标系EPSG:3857以确保网格尺寸精确,以及将结果转换为常用的WGS84经纬度坐标。文章还涵盖了进阶技巧与常见问题解决方案,帮助用户高效完成空间网格化分析任务。

weixin_29232507的博客 95

BookSim2 安装步骤教程 Network-on-Chips (NoCs) 片上网络模拟器 含视频

BookSim2 一个用于Network-on-Chips (NoCs) 芯片上网络的周期精确模拟器。该模拟器的设计是为了实现网络组件的模拟灵活性和精确建模。BookSim1 是一个通用的网络模拟器,并不专门针对片上环境。不支持在片上网络环境中提出的一些更先进的功能和拓扑结构。

爱串门的小马驹博客 1718

量化交易中的烂板策略:短线高频交易实战解析

量化交易通过算法模型实现自动化投资决策,其中短线高频交易是典型应用场景。从市场微观结构看,涨停板现象反映了资金博弈的动态平衡,而烂板策略正是捕捉涨停板短暂打开时的交易机会。该策略结合L2行情数据和Python量化框架,通过参数化规则识别特定形态的烂板股票,在风险可控前提下追求超额收益。实战中需严格遵循动态仓位管理和止损纪律,适用于A股市场短线交易。高频交易与量化分析技术的结合,为投资者提供了新的alpha挖掘工具。

weixin_30432579的博客 365

Pythia: A Customizable Hardware Prefetching Framework Using Online Reinforcement Learning——“预取”论文解读

参考传送门: 1. Hardware Prefetching笔记 2. 全球百科——缓存预取 3. 百度百科——缓存数据预期技术 目录0. 什么是Hardware Prefetching(本节内容不包括在论文中)1. 简介1.1 关于Hardware Prefetching的一些关键信息1.2 现阶段方法的缺陷1.3 论文团队的目标1.4 核心思想2. 必要的背景知识介绍2.1 强化学习(Reinforcement learning)2.2 为什么说强化学习是一个好的解决思路3. 解决方法与思路3.1 Py

Pinkgranite86的博客 2167

Booksim2源码分析1:核心函数调用逻辑 NoC片上网络模拟 含视频教程

BookSim2源码解读,详解。哈哈哈,我们就从main函数开始,看看BookSim2都调用了哪些核心函数。

爱串门的小马驹博客 933

Discrete Optimization (Coursera) 学习笔记 Week 1 introduction (开个帖子)

Week 1 Introduction 这位教授Pascal Van Hentenryck 真的算是优化领域神级别的人物了吧?截一张Google scholar的图大家感受一下… 居然在Coursera上看到了他开的课:Discrete Optimization。试听了几节后,发现讲得很有激情,而且深入浅出。遂决定花暑假跟完这一门课。 这门课每周花两三个小时介绍基础概念,然后得花十几个小时写作业(coding)… 一开始以为Coursera上的课的作业应该不会太难,然后第一次作业(knapsack)我就被

ZJ_11701的博客 656

BookSim (1.0) 用户手册

Brian Towles 和 William J. Dally2004 年 9 月 10 日。

eloudy的专栏 116

淘特App x-sign参数逆向实战:从抓包到算法定位

本文详细解析了淘特App的x-sign参数逆向过程,从抓包分析到算法定位,涵盖了使用jadx-gui进行静态分析、Frida动态Hook验证以及Native层算法还原等关键技术。文章重点介绍了x-sign参数的生成机制及其在阿里系应用中的安全防护策略,为逆向工程师提供了实用的调试技巧和对抗策略。

5b6n7m8的博客 228

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

王老师青少年编程 1718

booksim中的内置参数

所有子网接收相同的配置参数,因此是相同的。此外,通过为fail_seed参数选择整数值来控制失败通道的随机化-固定种子给出失败通道的固定集合,与模拟中的其他随机化无关。此外,模拟器代码的结构使得可以在对整个模拟器进行最小更改的情况下添加额外的路由算法(参见模拟器源代码中的routefunc.cpp文件)。效率则来自于每个周期的状态变化的数量是恒定的并且与VC的数量无关的事实。模拟器的周期时间是flit周期,即在源处注入单个flit所花费的时间,并且注入速率以每个flit周期的分组来指定。

wsxdsf的博客 1862

PDAF相位对焦原理

pdaf光路图

camerall 1万+
上一篇: 【Booksim】Booksim2.0安装编译
下一篇: 【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑
正在輸入......
博客等级 码龄7年 637粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在輸入......

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值