网站大量收购闲置独家精品文档,联系QQ:2885784924

Gem模拟器代码阅读要点总结.docxVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Gem模拟器代码阅读要点总结

一些编程要点:重要!!要添加一个新的网络,找到$GEM5/configs/ruby/Ruby.py的第84行,添加一种新的网络名称,并把几个py模块给pass了。Mapping或线程迁移的实现,把原网卡类作为虚拟网卡类,要和协议收发message时,使用虚拟网卡,而在进行网络的动作时使用实际网卡,两者之间建立一张mapping表。具体实现:在GarnetNetwork_d类中,建立外部网卡和内部网卡,将networkInterface_d类拆分成两部分,一部分用于和协议通信的外部网卡,另一部分用于和网络通信的内部网卡,两者同时传入网络指针作为参数,即可相互调用。当有message要发送时,即被inNode_ptr唤醒外部网卡后,根据map找到自己对应的内部网卡src_internal_NI_id,以及消息目的地对应的内部网卡dest_internal_NI_id,将消息中增添一个属性。并调用自己的内部网卡来发送消息给目的地对应的内部网卡节点,所有路由器内部的组件,都只传入路由器指针自身,而需要调用路由器其他组件完成的事情(即流水级要前进),则函数都在路由器中实现,目的是让本组件方便调用,接着让路由器调度它的另一组件去行动。所有具有wakeup方法的类,都是consumer的子类,见各个.hh文件。因为wakeup是在consumer父类里作为虚函数出现的。当scheduleevent之后就会在规定时间调用wakeup绑定consumer、sourcequeue的目的是某些对象的consumer并不事先知道,如各种link的consumer和source queue需要在构建网络时才知道,所以在那时需要设置consumer和source queue。当然有些对象的consumer是固定的,比如VA器的consumer一定是SA器,所以在schedule event函数里的第一个参数直接就写SA器了。各种东西的表示方法:Flit转换为message指针: MsgPtr msg_ptr = t_flit-get_msg_ptr(); NetworkMessage* net_msg_ptr = safe_castNetworkMessage *(msg_ptr.get());各种拓扑.py:位于ruby/network/topologies中,以Mesh.py为例每个都继承于Topology类,都定义了MakeTopology方法,传入的参数为:nodes:所有控制器的指针数组,模拟器先构建各种controller,然后将各个controller作为参数传进来构建拓扑options:配置,基本就是命令行敲入的num_cpus、mesh_rows等等IntLink, ExtLink, Router:输入、输出link以及路由器的构造函数指针函数返回一个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对象应用,前者是在mesh.py中的nodes参数传进去的(之前将所有controller都构建好了,作为nodes参数传进去的),后者是用Router的构造函数构造的。接着遍历每个在Python中生成的外部、内部连线,得到两端点的指针(路由器或是controller),把外部节点即controller的src,编号为0 ~ 外部节点数-1,而其dest编号为外部节点数 ~ 2倍外部节点数 - 1 ,而内部节点编号为 2倍的外部节点数 ~ 2倍的外部节点数 + 内部节点(即路由器)数 - 1。则在c++中建立具体的连线,需要建立两个方向的连线。起始就是在m_link_map字典中添加source,dest的pair到link_entry(link指针和方向)的map映射。这里的source和dest就用刚才的方法编号了。其create_link方法:首先找到最大的switch_id,注意这里的switch不仅是路由器,还包括controller,所以最大的switch_id + 1 就是所有的节点加路由器。比如network_test,如果是4*4的Mesh,每个节点有一个L1和direcotr

文档评论(0)

317960162 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档