相关文章
GEM5 Garnet Standalone packet injection pattern garnet包的生成路径:packet message flit
2025-01-01 04:37

/ 在不同的消息类别上对不同的一致性消息类型进行建模。
//
// GarnetSyntheticTraffic 采用 Garnet_standalone 一致性协议
// 它对三个消息类/虚拟网络进行建模。
// 它们是:请求、转发、响应。
// 请求和转发是“控制”数据包(通常为 8 字节
// 而响应是“数据”包(通常为 72 字节)。
//
// 数据包从测试仪进入网络的生命周期
// (1) 该函数generatePkt()生成其中之一的数据包
// 以下 3 种类型(随机:ReadReq、INST_FETCH、WriteReq
// (2) mem/ruby/system/RubyPort.cc 将它们转换为 RubyRequestType_LD,
// 分别为 RubyRequestType_IFETCH、RubyRequestType_ST
// (3) mem/ruby/system/Sequencer.cc 将这些发送到缓存控制器
// 在一致性协议中。
// (4) Network_test-cache.sm 标签 RubyRequestType:LD,
// RubyRequestType: IFETCH 和 RubyRequestType: ST as
// 分别为请求、转发和响应事件
// 并将它们分别注入到虚拟网络0、1和2中。
// 它立即回调定序器。
// (5) 数据包遍历网络(simple/garnet)并到达其
// 目的地(目录)和网络统计信息已更新。
// (6) Network_test-dir.sm 只是丢弃数据包。

先启动docker,然后cd 进gem5文件夹

 

按照官网,编译 garnet standaalone.

 

使用的命令行实例

 
 

这个config python文件,cpu类型是 GarnetSyntheticTraffic:

 

src/cpu/testers/garnet_synthetic_traffic/GarnetSyntheticTraffic.py 下,pybind了cpp的代码

 

garnet_synth_traffic.py中的 一大串例如 num_packets_max=args.num_packets_max, 会作为 const Params &p传递给cpp,而src/cpu/testers/garnet_synthetic_traffic/GarnetSyntheticTraffic.cc中,创建时就对成员变量初始化:

 

在 C++ 中,冒号 ( : )在构造函数中用于初始化成员变量和基类。这种语法称为初始化列表。初始化列表紧跟在构造函数声明的后面,并在函数体执行之前初始化类的成员。提供的代码中,GarnetSyntheticTraffic 类的构造函数使用初始化列表来初始化其成员变量和基类。

代码示例解释

ClockedObject§:这是对基类 ClockedObject 的构造函数的调用。它使用参数 p(一个 Params 结构体)来初始化基类部分的 GarnetSyntheticTraffic 对象。

后续的每一行(例如,tickEvent([this]{ tick(); }, “GarnetSyntheticTraffic tick”, false, Event::CPU_Tick_Pri))都是成员变量的初始化。每个成员变量都使用特定的值或表达式进行初始化。例如

tickEvent 成员使用一个 lambda 函数、一个字符串和两个布尔值进行初始化。
cachePort 使用字符串和 this 指针(指向当前对象)进行初始化。
numPacketsMax是一个int值,具体的数字初始化为p.num_packets_max.
最后一个成员变量 requestorId 是使用 p.system->getRequestorId(this) 的返回值进行初始化。

命令行有一些args 例如–injectionrate=0.01,还有 --synthetic=uniform_random ,传递给ruby createsystem.
Ruby.create_system(args, False, system)

比如 uniform_random,会(通过某种方式,目前还没解读到)传递到 src/cpu/testers/garnet_synthetic_traffic/GarnetSyntheticTraffic.cc中,
GarnetSyntheticTraffic.cc中的代码:
else if (traffic == UNIFORM_RANDOM_) {
destination = random_mt.random(0, num_destinations - 1);
.
void
GarnetSyntheticTraffic::generatePkt() 根据vnet不同,创建不同的 req .

req打包变成 PacketPtr pkt = new Packet(req, requestType);

sendPkt(pkt); 发送出去.

 
 

!cachePort.sendTimingReq(pkt) 用了 sendTimingReq.

这个函数细节在 src/mem/port.hh里:

 

s这里的 rc/mem/port.hh中的RequestPort::sendTimingReq 使用的 _responsePort传递进 TimingRequestProtocol::sendReq函数里,作为 *peer.
这里,从port.hh的 sendTimingReq,到下一步我们要看到 src/mem/protocol/timing.cc 中的 sendReq.

src/mem/protocol/timing.cc里, sendReq 被使用了,而 sendReq内部,则是使用了 peer->recvTimingReq(pkt).

 

这里TimingRequestProtocol的peer是 src/mem/protocol/timing.hh中 class TimingResponseProtocol类 , 这个类的官方注释里写了,

 
 

src/mem/ruby/system/RubyPort.cc 中会用一个 makeRequest

 
 

src/mem/ruby/system/Sequencer.cc 中 ,Sequencer 会有一个 issueRequest 的操作

 
 

``cpp
//创建一个ruby request
std::shared_ptr msg;
msg = pkt.各种操作//将pkt变成ruby request
m_mandatory_q_ptr->enqueue(msg, clockEdge(), latency);//插入 m_mandatory_q_ptr-

 

到这里,一个pkt 就变成msg,存进message buffer,然后变成了flits,进入了noc 网络.

其他的相近代码 没删,只是为了备用

我们点击vccode中的gotodefination
src/systemc/tlm_bridge/gem5_to_tlm.hh

 

或者
util/tlm/src/sc_slave_port.cc

 
 

src/mem/port.cc有bind的函数.

 
 

src/mem/tport.cc 有一串代码,本质是 schedTimingResp.

 
 

src/mem/bridge.hh

 
 

GarnetSyntheticTraffic 会打包好packet,一个requst packet准备好了后, GarnetSyntheticTraffic::sendPkt 会调用 cachePort.sendTimingReq(pkt). 这个port.sendTimingReq会调用port内部函数 TimingRequestProtocol::sendReq函数.
TimingRequestProtocol::sendReq 里会把传入的pkt 和_responsePort 一起读进来,调用 _responsePort的函数recvTimingReq,也就是这里执行的 peer->recvTimingReq(pkt),其实是 _responsePort->recvTimingReq(pkt).
这个 _responsePort每次都是会变的,取决于何时bind.

而这里,request发出的包是直接相连,或者说 "虚空连接"到response的,并没有经过network. 这里用的函数也都是port.hh或者tport.hh.

还是从 void
GarnetSyntheticTraffic::sendPkt(PacketPtr pkt) 中使用的 cachePort.sendTimingReq(pkt)开始.
只不过,这次的 cachePort 是 RubyPort了.

发req还是用protocol里的 TimingRequestProtocol::sendReq.

之前我们看的是 src/mem/tport.cc 里的
SimpleTimingPort::recvTimingReq(PacketPtr pkt)

rubyport里则有两种

 

    以上就是本篇文章【GEM5 Garnet Standalone packet injection pattern garnet包的生成路径:packet message flit】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/news/12765.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://sjzytwl.xhstdz.com/mobile/ , 查看更多   
最新文章
正在阅读:猎豹免费WiFi面世!猎豹免费WiFi使用教程猎豹免费WiFi面世!猎豹免费WiFi使用教程猎豹免费wifi手机版「正在阅读:猎豹免费WiFi面世!猎豹免费WiFi使用教程猎豹免费WiFi面
  近日,猎豹推出了一款全新的WiFi共享软件猎豹免费WiFi,不过猎豹免费WiFi目前还处于内测阶段,需要体验的用户要移步到猎豹官
电脑c盘满了怎么清理,快速清理,用这5招手机磁盘空间不足怎么清理「电脑c盘满了怎么清理,快速清理,用这5招」
​新买的电脑没用多久,突然发现系统提示磁盘空间不足。点击一看,电脑c盘空间已经爆满变红。当出现这种情况时ÿ
CDR,提取内容如何提取?手机如何打开exe文件「CDR,提取内容如何提取?」
1、首先在cdr软件中打开cdr图片;2、选中文字,依次点击“位图”-“轮廓描摹”-“线条图”;3、弹出弹窗,设置要删除的指定颜色
诺基亚光充电手机上市 可用屏幕吸收太阳能太阳能手机「诺基亚光充电手机上市 可用屏幕吸收太阳能」
继无线充电、PureView拍照技术之后,诺基亚的又一项智能手机领域的新发明即将问世,据外媒报道,这家芬兰手机制造商将在今年正式
麦芒手机怎么样华为麦芒手机「麦芒手机怎么样」
要了解华为麦芒系列的手机表现,麦芒8无疑是值得考虑的一个选项。这款手机在多个方面展现出卓越性能,以下是它的主要特点: 屏幕
90%的人有手机幻听综合症手机综合症「90%的人有手机幻听综合症」
Many of us have reached in our pockets, feeling a vibration, wrongly believing our mobile phones have just rung.许多人都
2021年一千元左右最好的手机有哪些?2021年千元以内性价比手机排行?一千元左右的华为手机「2021年一千元左右最好的手机有哪些?2021年千元以内性价比手机排行?」
2021年一千元左右最好的手机有哪些?~推荐华为畅享10 全网通 4GB+64GB,华为商城在售价格1099元,手机产品属于快消电子产品,华
上海专业 ***回收废纸废纸箱 服务一条龙带人带车上门回收上海手机回收「上海专业 ***回收废纸废纸箱 服务一条龙带人带车上门回收」
企业类型有限责任公司(自然人独资)统一社会信用代码91310112MA1GDTXT00成立日期2020-11-20法定代表人/负责人张前注册资本2,000万
传祺M8值得入手 起步加速很给力m8手机「传祺M8值得入手 起步加速很给力」
首先,外形方面这款传祺GM8采用了眼前一亮的设计语言。总体而言,新一代传祺GM8的盾形前脸变得更加稳重,并且在发动机盖增加一些
假面骑士零一模拟器(Zero-One Driver)假面骑士游戏手机版「假面骑士零一模拟器(Zero-One Driver)」
假面骑士零一模拟器,现在就成为超酷超炫的假面骑士01吧~!这是一款可以将你周遭的一切都切换成假面骑士世界要素的模拟器游戏!将0
相关文章