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

  • Incorporating a new topology in Booksim
    • 1. 新拓扑结构
    • 2. 需要添加的文件
    • 3. 修改步骤
      • 3.1 添加testnet.hpp
      • 3.2 添加testnet.cpp
      • 3.3 将testnet集成到network.cpp中
      • 3.4 创建配置文件testnetconfig
      • 3.5 在main.cpp和global.hpp中加入gP_testnet和gA_testnet变量
      • 3.6 make进行编译
    • 4. 仿真模拟结果

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 routersostringstream router_name;
int node;
int c, cnt;
int port_to_routers = _a - 1;for (node = 0; node < _a; ++node) {// create routerrouter_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 nodesfor(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 channelsfor(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 channelsfor(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚小标-智能AI商标注册交易平台【24小时您口袋里的商标管家】

随着全球经济一体化进程的推进和科技的飞速发展&#xff0c;知识产权已经成为企业高质量发展的重要竞争关键因素&#xff0c;众多企业发展的核心竞争力。通过加强知识产权保护&#xff0c;企业可以更好地保护自身品牌形象和市场份额&#xff0c;从而提高国内外市场竞争力&#…

C语言洛谷题目分享(9)奇怪的电梯

目录 1.前言 2.题目&#xff1a;奇怪的电梯 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.说明 6.题解 3.小结 1.前言 哈喽大家好啊&#xff0c;前一段时间小编去备战蓝桥杯所以博客的更新就暂停了几天&#xff0c;今天继续为大家带来题解分享&#xff0c;希望大…

通用设计的四大原则,大厂设计师带案例讲解!

作为数字产品设计师&#xff0c;在进行产品设计时要考虑产品的各种因素&#xff0c;例如功能、美观、安全等&#xff0c;要尽可能地满足所有用户的需求&#xff0c;做出对所有用户都尽可能公平的解决方案。但是&#xff0c;对于新手来说&#xff0c;在实际进行产品设计时&#…

HUD抬头显示器中如何设计LCD的阳光倒灌实验

关键词&#xff1a;阳光倒灌实验、HUD光照温升测试、LCD光照温升测试、太阳光模拟器 HUD&#xff08;Head-Up Display&#xff0c;即抬头显示器&#xff09;是一种将信息直接投影到驾驶员视线中的技术&#xff0c;通常用于飞机、汽车等驾驶舱内。HUD系统中的LCD&#xff08;Liq…

RabbbitMQ基本使用及其五种工作模型

初识MQ 同步通讯和异步通讯 什么是同步通讯呢&#xff1f;举个例子&#xff0c;你认识了一个小姐姐&#xff0c;聊的很火热&#xff0c;于是你们慢慢开始打电话&#xff0c;视频聊天&#xff0c;这种方式就成为同步通讯&#xff0c;那什么是一部通讯呢&#xff0c;同样的&…

Ant Design 表单基础用法综合示例

Ant Design 的表单组件设计得非常出色,极大地简化了表单开发的复杂度,让开发者能够快速构建出功能丰富、交互友好的表单界面。 接下来总结一下 Ant Design 中表单的基本用法。 Form 组件 用于定义整个表单,可以设置表单的布局方式、提交行为等。通常会将表单字段组件嵌套在 F…

利用栈删除数组中重复元素

先将数据排序&#xff08;降序或升序&#xff09; 建立一个“栈”&#xff0c;三种情况&#xff1a; 1.栈为空&#xff1a;压入一个元素 2.栈不为空 且 栈顶元素不等于将入栈元素&#xff1a;压入一个元素 3.栈不为空 且 栈顶元素等于将入栈元素&#xff1a;删除将压入元素…

面试经典150题——合并两个有序数组

面试经典150题 day1 题目来源我的题解方法一 先合并&#xff0c;再排序方法二 逆向双指针 题目来源 力扣每日一题&#xff1b;题序&#xff1a;88 我的题解 方法一 先合并&#xff0c;再排序 先将nums2全部放到nums1之后&#xff0c;然后进行排序。 时间复杂度&#xff1a;O…

【学习笔记十一】EWM上架目标仓位确定过程及配置

一、EWM确定目标区域概述 1.EWM从仓库处理类型获取源仓库类型&#xff08;Source storage type&#xff09;和源仓位&#xff08;Source Bin&#xff09;2.EWM根据仓库类型&#xff08;storage type&#xff09;、仓库分区&#xff08;storage section&#xff09;和上架策略&a…

Matlab|基于广义Benders分解法的综合能源系统优化规划

目录 1 主要内容 广义benders分解法流程图&#xff1a; 优化目标&#xff1a; 约束条件&#xff1a; 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《综合能源系统协同运行策略与规划研究》第四章内容基于广义Benders分解法的综合能源系统优化规划&…

Python开源工具库使用之词云Wordcloud

文章目录 前言一、基本使用1.1 文本生成词云1.2 配置项 二、进阶用法2.1 自定义形状2.2 自定义着色2.3 自定义词频2.4 中文 三、实际案例3.1 工作报告词云3.2 周杰伦歌词词云 四、总结4.1 优点和局限性4.2 展望未来发展 参考 前言 当我们需要将大量文本数据可视化展示时&#…

js数字、字母、符号等半角文本按0.5个字符计算长度

半角文本按0.5个字符计算 封装 getEffectiveLength 方法 function getEffectiveLength(text) {// 使用正则表达式替换掉所有全角字符&#xff0c;然后获取替换后的字符串长度var halfWidthLength text.replace(/[^\x00-\xff]/g, "").length;// 原始字符串长度减去…

LeetCode热题Hot100 - 两两交换链表中的节点

一刷~ 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 思路&#xff1a; 使用两个指针p1/p2&#xff0c;分别记录需要交换的两…

Codeforces Round 935 (Div. 3)------>C. Left and Right Houses

一&#xff0c;思路&#xff1a;直接从左到右枚举即可&#xff0c;用两个变量来维护左边的0的个数&#xff0c;右边1的个数。这题可能你会把四舍五入看成向上取整导致错误。 二&#xff0c;代码&#xff1a; #include <iostream> #include<algorithm> #include&l…

单链表和文件操作使用练习:通讯录

1. 项目文件组成&#xff08;vs2022&#xff09; 1. Contact.h和Contact.c分别为实现通讯录的头文件和源文件。 2. SList.h和SList.c分别为实现单链表的头文件和源文件。 3. test.c为测试用的源文件&#xff0c;用于调用通讯录提供的函数。 4. Contact.txt用于存储联系人信息。…

Java中二维数组的使用

在Java编程中&#xff0c;二维数组是一个非常重要的数据结构&#xff0c;它实质上是数组的数组&#xff0c;即每个元素又是一个数组。对于初学者来说&#xff0c;理解二维数组的概念、初始化、遍历、默认值以及内存分配和使用注意事项是提升编程技能的关键。 一、二维数组的概…

Bash运行环境详解与陷阱分析

摘要&#xff1a; 本文深入探讨了Bash运行环境的各个方面&#xff0c;包括Shell的概念、子Shell的行为、环境变量的管理以及Bash中的通配符和转义问题。同时&#xff0c;我们还将介绍一些常见的Bash陷阱&#xff0c;帮助读者避免在使用Bash时可能遇到的问题。 Shell 运行环境概…

【热门话题】PyTorch:深度学习领域的强大工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 PyTorch&#xff1a;深度学习领域的强大工具一、PyTorch概述二、PyTorch核心特性…

【华为OD机试】围棋的气【C卷|100分】

题目描述 围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19 x 19 = 361 个交点, 对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中, 有几个交叉点没有棋子,由此可…

c语言之结构体指针

一个结构体的初始位置就是结构体指针。 用一个指针变量存储结构体指针就是一个结构体指针变量 #include<stdio.h> #include<string.h> int main() {struct test{char name[30];int age;char sex;int student_number;} lisi{"lisi",32,m,20190305};stru…