相关文章
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/ , 查看更多   
最新文章
发力“春日经济”!首届青岛市赏花节启幕,100余项特色活动邀您参与
东风传花信,山海迎客临。3月28日上午,由山东省文化和旅游厅、青岛市人民政府指导,青岛市文化和旅游局、各区(市)政府主办的
CBA常规赛:北京北汽队负于浙江稠州金租队
3月27日,在北京首都体育馆举行的2024-2025中国男子篮球职业联赛(CBA)常规赛中,北京北汽队主场99比106负于浙江稠州金租队。图
观点|以负面清单规范健康科普
张玉胜日前,上海推出了全国首个“互联网健康科普负面行为清单”,同时在各级医疗卫生机构建立健全互联网健康科普规范管理制度,
三星折叠屏手机新突破:360度折叠设计引发热议
【环球网科技综合报道】3月30日,据外媒报道,三星的一项新专利揭示了其正在研发的360度折叠屏手机设计,这一创新概念有望彻底改
AI时代,科技期刊如何继续保持“可信”|中关村论坛观察
每经记者:杨煜    每经编辑:张海妮科技期刊在科学研究与科学传播中的重要性不言而喻。3月28日,在“2025中关村论坛年会”
李睿赴湄潭县宣讲习近平总书记在贵州考察时的重要讲话精神
3月25日,省委常委、市委书记李睿赴湄潭县,向基层干部群众宣讲习近平总书记在贵州考察时的重要讲话精神。他强调,要牢记习近平
苹果不会再推出小屏手机,只能寄希望于苹果小折叠
2025年3月,彭博社记者马克·古尔曼透露,苹果正式终结小屏iPhone产品线,未来两年内不会推出屏幕小于6英寸的机型。这一决策源于
东莞莞城城管践行雷锋精神,为垃圾分类“添翼”
为弘扬和践行雷锋精神,倡导绿色文明新风尚,3月5日,东莞莞城城管分局以“学雷锋纪念日”为契机,联合罗沙社区、东莞玉兰女子城
提额延期齐上阵!银行发力消费贷 需增强消费信贷可持续性
近期,多家银行密集跟进政策举措,推出相应消费贷产品。不少银行消费贷额度有所提高、期限有所延长,同时利率持续降低。有权威专
聚焦“百千万工程”丨“乡村艺先生”将走进全市973个村(社区)
近日,根据市委宣传部关于在全市开展“艺起乡见‘百千万’”系列活动的工作安排,云浮市、云安区两级文联率先行动,在云安区高村