Gem5模拟器代码阅读要点总结

上传人:人*** 文档编号:564466721 上传时间:2023-02-23 格式:DOCX 页数:9 大小:34.75KB
返回 下载 相关 举报
Gem5模拟器代码阅读要点总结_第1页
第1页 / 共9页
Gem5模拟器代码阅读要点总结_第2页
第2页 / 共9页
Gem5模拟器代码阅读要点总结_第3页
第3页 / 共9页
Gem5模拟器代码阅读要点总结_第4页
第4页 / 共9页
Gem5模拟器代码阅读要点总结_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Gem5模拟器代码阅读要点总结》由会员分享,可在线阅读,更多相关《Gem5模拟器代码阅读要点总结(9页珍藏版)》请在金锄头文库上搜索。

1、一些编程要点:重要!要添加一个新的网络,找到$GEM5/configs/ruby/Ruby.py的第84行,添加一种新的 网络名称,并把几个py模块给pass 了。Mapping或线程迁移的实现,把原网卡类作为虚拟网卡类,要和协议收发message时,使用 虚拟网卡,而在进行网络的动作时使用实际网卡,两者之间建立一张mapping表。具体实现:在 GarnetNetwork_d 类中,建立外部网卡和内部网卡,将 networkInterface_d 类拆分成两部分,一部分用于和协议通信的外部网卡,另一部分用于和网络通信的内部网卡, 两者同时传入网络指针作为参数,即可相互调用。当有message

2、要发送时,即被inNode_ptr唤醒外部网卡后,根据map找到自己对应的内部 网卡src_internal_NI_id,以及消息目的地对应的内部网卡dest_internal_NI_id,将消息中增添 一个属性。并调用自己的内部网卡来发送消息给目的地对应的内部网卡节点,所有路由器内部的组件,都只传入路由器指针自身,而需要调用路由器其他组件完成的事情 (即流水级要前进),则函数都在路由器中实现,目的是让本组件方便调用,接着让路由器调 度它的另一组件去行动。所有具有wakeup方法的类,都是consumer的子类,见各个.hh文件。因为wakeup是在 consumer父类里作为虚函数出现的。当

3、scheduleevent之后就会在规定时间调用wakeup 绑定 consumer、sourcequeue 的目的是某些对象的 consumer 并不事先知道,如各种 link 的 consumer和source queue需要在构建网络时才知道,所以在那时需要设置consumer和source queue。当然有些对象的consumer是固定的,比如VA器的consumer 一定是SA器,所以在 schedule event函数里的第一个参数直接就写SA器了。各种东西的表示方法:1. Flit 转换为 message 指针:MsgPtr msg_ptr = t_flit-get_msg_p

4、tr();NetworkMessage* net_msg_ptr = safe_cast(msg_ptr.get();各种拓扑py:位于 ruby/network/topologies 中,以 Mesh.py 为例每个都继承于Topology类,都定义了 MakeTopology方法,传入的参数为:nodes:所有控制器的指针数组,模拟器先构建各种controller,然后将各个controller 作为参数传进来构建拓扑options:配置,基本就是命令行敲入的num_cpus、mesh_rows等等IntLink, ExtLink, Router:输入、输出link以及路由器的构造函数指针

5、函数返回一个mesh对象,其属性包括routers以及extlink和inlink,都是对象数组 此MakeTopology函数的主要任务是构建路由器以及各种节点与路由器之间、路由器与路由 器之间的连线Topology.cc/hh:传入的参数为param p,用到mesh.py生成的拓扑结构。其param()就是mesh对象,里面 含 exlink/inlink等对象。从param()中 ext_link对象数组,将每个都转换成ext_link(由于之前在mesh.py中就用 Extlink构造函数调用的,所以构造出来的肯定是exlink类型的)。同时得到controller和router对象

6、应用,前者是在mesh.py中的nodes参数传进去的(之 前将所有controller都构建好了,作为nodes参数传进去的),后者是用Router的构造函数构 造的。接着遍历每个在 Python 中生成的外部、内部连线,得到两端点的指针 (路由器或是 controller),把外部节点即controller的src,编号为0外部节点数-1,而其dest编号为外 部节点数 2 倍外部节点数 - 1 ,而内部节点编号为 2倍的外部节点数 2 倍的外部节点 数 + 内部节点(即路由器)数 - 1。则在C+中建立具体的连线,需要建立两个方向的连线。起始就是在m_link_map字典中添 加sour

7、ce,dest的pair到link_entry(link指针和方向)的map映射。这里的source和dest就 用刚才的方法编号了。其 create_link 方法:1. 首先找到最大的switch_id,注意这里的switch不仅是路由器,还包括controller, 所以最大的switchd + 1就是所有的节点加路由器。比如network_test,如果 是 4*4 的 Mesh,每个节点有一个 L1 和 direcotry,则 0-31 是 controller 的 src, 32-63是controller的dest, 64-79为路由器,所以总共是80个switch02. 权重矩

8、阵、latency矩阵、interswitch矩阵的大小都设为switch数目*switch数 目。初始化时,遍历每个m_link_map(注意是双向的),把其中的源和目的的权 重找到,赋给相应的weightsrcdest。权重矩阵的对角线设为0(自己到自己的 花销是 0),其余暂时设为无限。3. 接下来调用shortest_path函数,寻找任意两个节点(包括路由和controller)之间 的最短路径。即根据权重矩阵,更新延时矩阵和中间路由矩阵,返回最短距离 矩阵。权重矩阵不变4. 接着遍历权重矩阵,找到所有权重矩阵中非无限的元素,即有链路,则得到以 链路起点为起点,终点为下一跳的初始一

9、Hop,所能达到的目的地的集合。形成 了一种类似反向的路由表。5. 最后正式建立起链路,Makelink方法,把路由表的入口(即这个链路能够到达的 目的地的集合)也传进链路的属性中。这里 Makelink 中调用的 MakeExLink、 MakeInLink 和 MakeInternalLink 三个函数,由具体网络实现, Garnet 中由 GarnetNetwork_d实现,因为不同的网络有不同的Link的样子,如Garnet需要 数据 link 和 creditlink 两条。BasicLink.cc/hh/py里面构建了 3个类,分别是BasicLink、BasicIntLink和B

10、asicExLink。后两个继承第一个。 Cc/hh 从 py 文件中获取参数, BasicLink 中的参数为 latency、 bandwidth factor 和权重; BasicIntLink为内部节点和外部节点的指针,而BasicExLink为节点a和b的指针latency和权 重为默认值 1,在构建拓扑时调用构造会改掉的。而带宽系数为 16。 外部节点为 Param.RubyController,内部节点、节点a和b均为Param.BasicRouter。这些均为属性。BasicRouter.cc/hh/py什么也没有,只有param p传入的id,而在py中,该id也没有默认值,

11、需要在构建拓 扑时调用构造函数时指定。Network.cc/hh/py构造中,从Python中传入的参数有虚网数、拓扑类型的指针、控制消息的大小,并获 得总共的controller个数。最后使得每个终端节点(controller的网络指针属性指向自身)。此 外提供一个将 MessageSizeType 转换为控制消息 type 和数据消息 type 的方法。其中控制消 息大小是由python指定的,通常是8个字节,而数据一般是一个cache line,为64字节再 加上控制的 8 字节,为 72 字节。接 下 来 看 Garnet 文 件 夹 内 的 文 件NetworkHeader.hh规定

12、了在 Garnet 中才使用的一些宏和枚举,包括虚网类型枚举(控制虚网、数据虚网 默认虚网)、flit类型(头、身子、尾、又是头又是尾)、VC状态(空闲、正在VA、占用)、以及 flit stage(刚生成、VA、SA、ST、LT)。BaseGarnetNetwork.cc/hh/py构造中从python中传入网卡使用的flit大小,python中默认为16字节,以及每个虚网 的VC数目为4。要求每条链路的带宽因数bandwidth factor要和ni的flit大小相同,都为16 字节。生成 m_toNetQueues 以及 m_fromNetQueues 两个属性,均为长度为 contro

13、ller 个数的 message buffer的二维向量,第二维是它的虚网数。即对于每个controller的每个虚网,都建 立一个进一个出的message buffer,并且实例化了。以上为 Garnet( 即较为精确的片上网 )通用的文件 * 接下来看 Garnet-fixed-pipeline 文件夹内的文件,也是最内层的文件GarnetNetwork_d.cc/hh/pyPython中传入参数为每个数据、控制的VC的buffer,含多少个flit,数据默认为4。 用爷爷类 Network 类中得到的拓扑指针,访问路由器,加入到本类的路由器向量属性中, 方便调用。初始化时,使每个路由器的

14、网络指针指向自身,接下来建 立网卡,每个终端节点 (controller)都建立一个,接下来根据拓扑,调用拓扑的create_link方法建立矩阵,以及每条 路径的反向路由表。并根据Garnet的特征,建立的链路有credit和数据link两种。建立的 所有link都加入到m_link_ptr_vector中,最后遍历之,将其网络指针指向自身。至此,终端 节点、路由器以及所有Link的网络指针,全指向了自己,即GarnetNetwork。而在MakeInLink健立网卡到网络,即路由器的连线)中,BasicLink的指针作为参数传递 进去的,将其强制转换为 GarnetLink 后,就有了 n

15、etlink 和 creditlink 两条,分别加入 m_link_ptr_vector 和 m_creditlink_ptr_vector 后,让路由器建立输入端口,网卡建立输出端 口,都将数据 Link 和 credit link 传入。MakeOutLink 和 MakeInternalLink 也类似。注意,路由器在建立输出端口的时候,需要 传递进路由表路由以及链路的权重。此外提供了父类属性 m_toNetQueues 以及 m_fromNetQueues 的 getter 方法,以及 getRubyStartTime 方法GarnetLink_d.cc/hh/py有python传入

16、的参数有link_id、link_latency、每个虚网的vc数,虚网数以及通道宽度 (必须等于bandwidth factor)0注意这些的类为NetworkLink_d,下面的文件用到的。此外在 GarnetlntLink_d 以及 GarnetExtLink_d 类中,还要调用 NetworkLink_d 和 CreditLink_d 两个构 造函数各两次,因为是双向的,构建两条链路,并append到一个向量中,作为向量的参数 传给 cc 文件。分别为 credit_links 和 network_links。.cc 中直接取 network_links0为入, network_links1 为出,credit link也一样。NetworkLink

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号