Gem5模擬器代碼閱讀要點(diǎn)總結(jié)_第1頁
Gem5模擬器代碼閱讀要點(diǎn)總結(jié)_第2頁
Gem5模擬器代碼閱讀要點(diǎn)總結(jié)_第3頁
Gem5模擬器代碼閱讀要點(diǎn)總結(jié)_第4頁
Gem5模擬器代碼閱讀要點(diǎn)總結(jié)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

一些編程要點(diǎn):重要?。∫砑右粋€(gè)新的網(wǎng)絡(luò),找到$GEM5/configs/ruby/Ruby.py的第84行,添加一種新的網(wǎng)絡(luò)名稱,并把幾個(gè)py模塊給pass了。Mapping或線程遷移的實(shí)現(xiàn),把原網(wǎng)卡類作為虛擬網(wǎng)卡類,要和協(xié)議收發(fā)message時(shí),使用虛擬網(wǎng)卡,而在進(jìn)行網(wǎng)絡(luò)的動作時(shí)使用實(shí)際網(wǎng)卡,兩者之間建立一張mapping表。具體實(shí)現(xiàn):在GarnetNetwork_d類中,建立外部網(wǎng)卡和內(nèi)部網(wǎng)卡,將networkInterface_d類拆分成兩部分,一部分用于和協(xié)議通信的外部網(wǎng)卡,另一部分用于和網(wǎng)絡(luò)通信的內(nèi)部網(wǎng)卡,兩者同時(shí)傳入網(wǎng)絡(luò)指針作為參數(shù),即可相互調(diào)用。當(dāng)有message要發(fā)送時(shí),即被inNode_ptr喚醒外部網(wǎng)卡后,根據(jù)map找到自己對應(yīng)的內(nèi)部網(wǎng)卡src_internal_NI_id,以及消息目的地對應(yīng)的內(nèi)部網(wǎng)卡dest_internal_NI_id,將消息中增添一個(gè)屬性。并調(diào)用自己的內(nèi)部網(wǎng)卡來發(fā)送消息給目的地對應(yīng)的內(nèi)部網(wǎng)卡節(jié)點(diǎn),所有路由器內(nèi)部的組件,都只傳入路由器指針自身,而需要調(diào)用路由器其他組件完成的事情(即流水級要前進(jìn)),則函數(shù)都在路由器中實(shí)現(xiàn),目的是讓本組件方便調(diào)用,接著讓路由器調(diào)度它的另一組件去行動。所有具有wakeup方法的類,都是consumer的子類,見各個(gè).hh文件。因?yàn)閣akeup是在consumer父類里作為虛函數(shù)出現(xiàn)的。當(dāng)scheduleevent之后就會在規(guī)定時(shí)間調(diào)用wakeup綁定consumer、sourcequeue的目的是某些對象的consumer并不事先知道,如各種link的consumer和sourcequeue需要在構(gòu)建網(wǎng)絡(luò)時(shí)才知道,所以在那時(shí)需要設(shè)置consumer和sourcequeue。當(dāng)然有些對象的consumer是固定的,比如VA器的consumer一定是SA器,所以在scheduleevent函數(shù)里的第一個(gè)參數(shù)直接就寫SA器了。各種東西的表示方法:1.Flit轉(zhuǎn)換為message指針:MsgPtrmsg_ptr=t_flit->get_msg_ptr();NetworkMessage*net_msg_ptr=safe_cast<NetworkMessage*>(msg_ptr.get());各種拓?fù)?py:位于ruby/network/topologies中,以Mesh.py為例每個(gè)都繼承于Topology類,都定義了MakeTopology方法,傳入的參數(shù)為:nodes:所有控制器的指針數(shù)組,模擬器先構(gòu)建各種controller,然后將各個(gè)controller作為參數(shù)傳進(jìn)來構(gòu)建拓?fù)鋙ptions:配置,基本就是命令行敲入的num_cpus、mesh_rows等等IntLink,ExtLink,Router:輸入、輸出link以及路由器的構(gòu)造函數(shù)指針函數(shù)返回一個(gè)mesh對象,其屬性包括routers以及extlink和inlink,都是對象數(shù)組此MakeTopology函數(shù)的主要任務(wù)是構(gòu)建路由器以及各種節(jié)點(diǎn)與路由器之間、路由器與路由器之間的連線Topology.cc/hh:傳入的參數(shù)為paramp,用到mesh.py生成的拓?fù)浣Y(jié)構(gòu)。其param()就是mesh對象,里面含exlink/inlink等對象。從param()中ext_link對象數(shù)組,將每個(gè)都轉(zhuǎn)換成ext_link(由于之前在mesh.py中就用Extlink構(gòu)造函數(shù)調(diào)用的,所以構(gòu)造出來的肯定是exlink類型的)。同時(shí)得到controller和router對象應(yīng)用,前者是在mesh.py中的nodes參數(shù)傳進(jìn)去的(之前將所有controller都構(gòu)建好了,作為nodes參數(shù)傳進(jìn)去的),后者是用Router的構(gòu)造函數(shù)構(gòu)造的。接著遍歷每個(gè)在Python中生成的外部、內(nèi)部連線,得到兩端點(diǎn)的指針(路由器或是controller),把外部節(jié)點(diǎn)即controller的src,編號為0~外部節(jié)點(diǎn)數(shù)-1,而其dest編號為外部節(jié)點(diǎn)數(shù)~2倍外部節(jié)點(diǎn)數(shù)-1,而內(nèi)部節(jié)點(diǎn)編號為2倍的外部節(jié)點(diǎn)數(shù)~2倍的外部節(jié)點(diǎn)數(shù)+內(nèi)部節(jié)點(diǎn)(即路由器)數(shù)-1。則在C++中建立具體的連線,需要建立兩個(gè)方向的連線。起始就是在m_link_map字典中添加<source,dest>的pair到link_entry(link指針和方向)的map映射。這里的source和dest就用剛才的方法編號了。其create_link方法:首先找到最大的switch_id,注意這里的switch不僅是路由器,還包括controller,所以最大的switch」d+1就是所有的節(jié)點(diǎn)加路由器。比如network_test,如果是4*4的Mesh,每個(gè)節(jié)點(diǎn)有一個(gè)L1和direcotry,則0-31是controller的src,32-63是controller的dest,64-79為路由器,所以總共是80個(gè)switch0權(quán)重矩陣、latency矩陣、interswitch矩陣的大小都設(shè)為switch數(shù)目*switch數(shù)目。初始化時(shí),遍歷每個(gè)m_link_map(注意是雙向的),把其中的源和目的的權(quán)重找到,賦給相應(yīng)的weight[src][dest]。權(quán)重矩陣的對角線設(shè)為0(自己到自己的花銷是0),其余暫時(shí)設(shè)為無限。接下來調(diào)用shortest_path函數(shù),尋找任意兩個(gè)節(jié)點(diǎn)(包括路由和controller)之間的最短路徑。即根據(jù)權(quán)重矩陣,更新延時(shí)矩陣和中間路由矩陣,返回最短距離矩陣。權(quán)重矩陣不變接著遍歷權(quán)重矩陣,找到所有權(quán)重矩陣中非無限的元素,即有鏈路,則得到以鏈路起點(diǎn)為起點(diǎn),終點(diǎn)為下一跳的初始一Hop,所能達(dá)到的目的地的集合。形成了一種類似反向的路由表。最后正式建立起鏈路,Makelink方法,把路由表的入口(即這個(gè)鏈路能夠到達(dá)的目的地的集合)也傳進(jìn)鏈路的屬性中。這里Makelink中調(diào)用的MakeExLink、MakeInLink和MakeInternalLink三個(gè)函數(shù),由具體網(wǎng)絡(luò)實(shí)現(xiàn),Garnet中由GarnetNetwork_d實(shí)現(xiàn),因?yàn)椴煌木W(wǎng)絡(luò)有不同的Link的樣子,如Garnet需要數(shù)據(jù)link和creditlink兩條。BasicLink.cc/hh/py里面構(gòu)建了3個(gè)類,分別是BasicLink、BasicIntLink和BasicExLink。后兩個(gè)繼承第一個(gè)。Cc/hh從py文件中獲取參數(shù),BasicLink中的參數(shù)為latency、bandwidthfactor和權(quán)重;BasicIntLink為內(nèi)部節(jié)點(diǎn)和外部節(jié)點(diǎn)的指針,而BasicExLink為節(jié)點(diǎn)a和b的指針latency和權(quán)重為默認(rèn)值1,在構(gòu)建拓?fù)鋾r(shí)調(diào)用構(gòu)造會改掉的。而帶寬系數(shù)為16。外部節(jié)點(diǎn)為Param.RubyController,內(nèi)部節(jié)點(diǎn)、節(jié)點(diǎn)a和b均為Param.BasicRouter。這些均為屬性。BasicRouter.cc/hh/py什么也沒有,只有paramp傳入的id,而在py中,該id也沒有默認(rèn)值,需要在構(gòu)建拓?fù)鋾r(shí)調(diào)用構(gòu)造函數(shù)時(shí)指定。Network.cc/hh/py構(gòu)造中,從Python中傳入的參數(shù)有虛網(wǎng)數(shù)、拓?fù)漕愋偷闹羔?、控制消息的大小,并獲得總共的controller個(gè)數(shù)。最后使得每個(gè)終端節(jié)點(diǎn)(controller的網(wǎng)絡(luò)指針屬性指向自身)。此外提供一個(gè)將MessageSizeType轉(zhuǎn)換為控制消息type和數(shù)據(jù)消息type的方法。其中控制消息大小是由python指定的,通常是8個(gè)字節(jié),而數(shù)據(jù)一般是一個(gè)cacheline,為64字節(jié)再加上控制的8字節(jié),為72字節(jié)。接下來看Garnet文件夾內(nèi)的文件NetworkHeader.hh規(guī)定了在Garnet中才使用的一些宏和枚舉,包括虛網(wǎng)類型枚舉(控制虛網(wǎng)、數(shù)據(jù)虛網(wǎng)默認(rèn)虛網(wǎng))、flit類型(頭、身子、尾、又是頭又是尾)、VC狀態(tài)(空閑、正在VA、占用)、以及flitstage(剛生成、VA、SA、ST、LT)。BaseGarnetNetwork.cc/hh/py構(gòu)造中從python中傳入網(wǎng)卡使用的flit大小,python中默認(rèn)為16字節(jié),以及每個(gè)虛網(wǎng)的VC數(shù)目為4。要求每條鏈路的帶寬因數(shù)bandwidthfactor要和ni的flit大小相同,都為16字節(jié)。生成m_toNetQueues以及m_fromNetQueues兩個(gè)屬性,均為長度為controller個(gè)數(shù)的messagebuffer的二維向量,第二維是它的虛網(wǎng)數(shù)。即對于每個(gè)controller的每個(gè)虛網(wǎng),都建立一個(gè)進(jìn)一個(gè)出的messagebuffer,并且實(shí)例化了。以上為Garnet(即較為精確的片上網(wǎng))通用的文件*********************接下來看Garnet-fixed-pipeline文件夾內(nèi)的文件,也是最內(nèi)層的文件GarnetNetwork_d.cc/hh/pyPython中傳入?yún)?shù)為每個(gè)數(shù)據(jù)、控制的VC的buffer,含多少個(gè)flit,數(shù)據(jù)默認(rèn)為4。用爺爺類Network類中得到的拓?fù)渲羔槪L問路由器,加入到本類的路由器向量屬性中,方便調(diào)用。初始化時(shí),使每個(gè)路由器的網(wǎng)絡(luò)指針指向自身,接下來建立網(wǎng)卡,每個(gè)終端節(jié)點(diǎn)(controller)都建立一個(gè),接下來根據(jù)拓?fù)洌{(diào)用拓?fù)涞腸reate_link方法建立矩陣,以及每條路徑的反向路由表。并根據(jù)Garnet的特征,建立的鏈路有credit和數(shù)據(jù)link兩種。建立的所有l(wèi)ink都加入到m_link_ptr_vector中,最后遍歷之,將其網(wǎng)絡(luò)指針指向自身。至此,終端節(jié)點(diǎn)、路由器以及所有Link的網(wǎng)絡(luò)指針,全指向了自己,即GarnetNetwork。而在MakeInLink健立網(wǎng)卡到網(wǎng)絡(luò),即路由器的連線)中,BasicLink的指針作為參數(shù)傳遞進(jìn)去的,將其強(qiáng)制轉(zhuǎn)換為GarnetLink后,就有了netlink和creditlink兩條,分別加入m_link_ptr_vector和m_creditlink_ptr_vector后,讓路由器建立輸入端口,網(wǎng)卡建立輸出端口,都將數(shù)據(jù)Link和creditlink傳入。MakeOutLink和MakeInternalLink也類似。注意,路由器在建立輸出端口的時(shí)候,需要傳遞進(jìn)路由表路由以及鏈路的權(quán)重。此外提供了父類屬性m_toNetQueues以及m_fromNetQueues的getter方法,以及getRubyStartTime方法GarnetLink_d.cc/hh/py有python傳入的參數(shù)有l(wèi)ink_id、link_latency、每個(gè)虛網(wǎng)的vc數(shù),虛網(wǎng)數(shù)以及通道寬度(必須等于bandwidthfactor)0注意這些的類為NetworkLink_d,下面的文件用到的。此外在GarnetlntLink_d以及GarnetExtLink_d類中,還要調(diào)用NetworkLink_d和CreditLink_d兩個(gè)構(gòu)造函數(shù)各兩次,因?yàn)槭请p向的,構(gòu)建兩條鏈路,并append到一個(gè)向量中,作為向量的參數(shù)傳給cc文件。分別為credit_links和network_links。.cc中直接取network_links[0]為入,network_links[1]為出,creditlink也一樣。NetworkLink_d.cc/hhCreditLink_d.hh從python中傳入?yún)?shù)為延時(shí)和帶寬以及線路id,并創(chuàng)建linkbuffer,以及一些統(tǒng)計(jì),如每個(gè)VC的負(fù)載,以及l(fā)ink的使用次數(shù)提供的函數(shù)包括設(shè)置link的consumer以及sourceQueue。NetworkLink可被其sourceQueue喚醒,喚醒后從sourceQueue中取到topFlit,將其pop出sourceQueue后放到自己的linkbuffer中,然后在link_lalency周期后調(diào)度其consumer。最后更新該Link的兩個(gè)統(tǒng)計(jì)信息。而creditLink完全繼承于NetworkLink,基本沒什么區(qū)另U。因?yàn)閮烧哌\(yùn)行原理一樣,傳的credit也是作為flit的一種,也有consumer和sourceQueue,所以基本一樣。Router_d.cc/hhGarnetRouter_d.py繼承于父類BasicRouter。從python中傳入的參數(shù)有虛網(wǎng)數(shù)目、每個(gè)虛網(wǎng)的VC數(shù),兩者相乘得到總VC數(shù)。構(gòu)造函數(shù)中新建了路由計(jì)算RC單元、VA單元、SA單元和switch單元,并都傳遞自己的指針this作為它們的路由器指針,并將其初始化。注意,輸入單元和輸出單元并不在路由器的構(gòu)造函數(shù)中實(shí)例化,而在網(wǎng)絡(luò)Makelink的時(shí)候,調(diào)用路由器的添加端口函數(shù),同時(shí)添加了輸入和輸出單元。路由器的每一個(gè)端口都有一個(gè)輸入和一個(gè)輸出單元。為什么要這樣?是因?yàn)槁酚善鞯亩丝跀?shù)目并不固定,而是完全由路由器周圍的連線所決定的,如mesh的頂點(diǎn)和中間顯然端口不同,所以無法用統(tǒng)一的實(shí)例化函數(shù)來構(gòu)造這些數(shù)目不同的輸入、輸出單元。增加輸入、輸出端口函數(shù),也需要指定其creditlink和netlink的consumer、sourcequeue等。將這些鏈路與輸入輸出單元綁定。之前已述,輸出單元的構(gòu)造中需要傳入路由表入口和權(quán)重。此外,還有路由請求、VA請求、SA請求、switch請求等函數(shù),基本都是調(diào)用相應(yīng)的模塊。其中路由請求是這個(gè)周期就進(jìn)行路由計(jì)算,并觸發(fā)VA請求,而后兩個(gè)都需要1周期后調(diào)度。最后還有更新統(tǒng)計(jì)的函數(shù)。RoutingUnit_d.cc/hh傳入?yún)?shù)為路由器指針。兩個(gè)關(guān)鍵的屬性為m_routing_table以及m_weight_table。前者是路由表入口(Netdest)類型的向量,每個(gè)元素代表一個(gè)Link,后者是對應(yīng)link的權(quán)重即代價(jià),如果代價(jià)太大,即使能夠在路由表中找到dest,也未必會選擇這條路,因?yàn)榭偸钦掖鷥r(jià)最小的路。類中提供往這兩個(gè)向量中pushback元素的函數(shù),在外部被調(diào)用的,即是在GarnetNetwork類中遍歷每個(gè)路由器,讓路由器調(diào)用addOutLink函數(shù)時(shí),會再讓路由單元將路由表和權(quán)重添加進(jìn)來。RC_stage函數(shù),進(jìn)行RC過程,傳入flit,inputunit對象和VC號,主要是進(jìn)行RC計(jì)算,計(jì)算完后更新該VC的輸出端,VC的狀態(tài)由IDLE前進(jìn)到VC_AB,flit流水級前進(jìn)到VA。最后調(diào)度路由器進(jìn)行VA過程。而RC計(jì)算函數(shù)是重點(diǎn):首先根據(jù)頭flit得到message指針,并轉(zhuǎn)換為networkmessage,并得到該message的NetDest屬性,接下來遍歷該路由器的所有輸出link,也就是其整張路由表的每一項(xiàng),看看其netDest是否與該message的NetDest有交集,如果有的話要求權(quán)重是最小的,找到最小的權(quán)重的link作為路由計(jì)算的結(jié)果,返回該output_link。InputUnit_d.cc/hh輸入單元類,構(gòu)造中傳入?yún)?shù)為路由器指針及id。得到VC數(shù)和每個(gè)虛網(wǎng)的VC數(shù)。建立creditqueue,用于向與之相連的creditlink發(fā)creditflit。此時(shí)建立每個(gè)VC對象實(shí)例。放進(jìn)m_vcs屬性中。其繼承了consumer,所以又wakeup函數(shù),wakeup函數(shù)中,觀察與之相連的輸入link是否有數(shù)據(jù)且數(shù)據(jù)已經(jīng)到了(isReady),有的話consumer一個(gè)flit,得到該flit的VC(上一跳VA階段分配的),如果是頭flit,則顯然assert該VC狀態(tài)是idle的,則發(fā)出route_req,調(diào)用路由器的相應(yīng)函數(shù),再由路由器通知路由單元立刻開始路由計(jì)算。之后設(shè)置該VC的入隊(duì)時(shí)間。否則如果不是頭flit,則直接讓flit進(jìn)入SA階段,并發(fā)出SA請求(需等一周期才調(diào)度SA單元)。此時(shí)往buffer中(也即m_vc[flit的vc])寫入該flit。這就實(shí)現(xiàn)了BW和RC的同時(shí)進(jìn)行。PS.從這里可以看出,路由器的buffer是隱含在輸入單元的m_vc屬性中的。最后統(tǒng)計(jì)該虛網(wǎng)的buffer讀寫次數(shù)等信息。OutputUnit_d.cc/hhOutVcState.cc/hh同輸入單元一樣,輸出單元的構(gòu)造中傳入id和路由器指針,得到總VC數(shù)量。接著建立輸出的flitBuffer,并將每一個(gè)輸出VC(與之相連的路由器的輸入VC的情況)建立outVcState,放入m_outvcstate屬性中。提供了decrement_credit方法。當(dāng)該路由器每發(fā)送一個(gè)flit時(shí)就需要調(diào)用之,使該outputUnit的outputstate[分配的VC]自減。路由器更新credit狀態(tài),這個(gè)意思是,路由器的輸入單元里的VC即buffer,也必須能夠看到outVcState中credit的變化,為了能夠進(jìn)行VA和SA。所以每個(gè)輸入單元的VC的credit指的也是下一跳,每個(gè)VC都有一個(gè)creditcount,這個(gè)creditcount指的是該輸入VC已經(jīng)經(jīng)過了VA階段,和某一個(gè)輸出VC綁定,creditcount指的是該輸出VC,也就是下一跳的輸入VC的credit數(shù)目。Wakeup函數(shù)里(一定是由creditlink所喚醒),檢查creditlink,如果有credit,就得到其outvc,increment相應(yīng)outvc的credit,并更新相應(yīng)的輸入VC的credit數(shù)。另外如果該credit附帶了釋放VC(因?yàn)橄乱粋€(gè)路由器有尾flit走了),則將該outvc狀態(tài)釋放為idle。而OutVcState里維護(hù)了inport、invc屬性(經(jīng)過VA后,與該outVC對應(yīng)的輸入端口和VC)以及creditcount,后者也會在調(diào)用路由器的updateCredit函數(shù)更新到輸入VC中。其構(gòu)造函數(shù)即初始化時(shí),根據(jù)虛網(wǎng)類型,是數(shù)據(jù)還是控制,得到buffer大小所具有的初始flit的個(gè)數(shù),作為其初始的credit數(shù)目。默認(rèn)數(shù)據(jù)是4,控制是1。Flit_d.cc/hhFlitBuffer_d.cc/hhflitBuffer類中最主要的屬性也就是m_buffer,即一個(gè)flit指針數(shù)組。里面提供插入flit方法、得到時(shí)間最早的flit方法,彈出隊(duì)首flit方法等。用于判斷狀態(tài)的方法有isReady:先找到時(shí)間最早的隊(duì)首flit,看看其時(shí)間是否小于等于當(dāng)前模擬時(shí)間,如果是說明該flit已經(jīng)可用。isReadyForNext,和isReady類似,不同的是判斷flit時(shí)間是否小于等于當(dāng)前時(shí)間加1,即下一周期該flit是否可用。另外還有isEmpty,即m_buffer是否為空。isFull,即m_buffer是否等于max_size。Flit類提供兩個(gè)構(gòu)造,一種構(gòu)造為數(shù)據(jù)flit,主要提供屬性為id、size(注意這里的size指的是message包含的flit個(gè)數(shù))、vc號、虛網(wǎng)號以及對應(yīng)消息的指針、stage。構(gòu)造函數(shù)即初始化中,flit的時(shí)間定為構(gòu)造時(shí),即剛生成flit的時(shí)間。Stage屬性為<狀態(tài)stage、時(shí)間>的pair,前者初始化為I,后者初始化為flit時(shí)間。接著根據(jù)size和id決定其種類是頭flit、尾flit、身子flit還是又是頭又是尾(size==1)另一種構(gòu)造為creditflit,其屬性僅有vc,id—定為0,另外有個(gè)isfreesignal,即該creditflit是否附帶釋放VC的功能(由尾數(shù)據(jù)flit離開而產(chǎn)生)。NetworkInterface_d.cc/hh很重要的網(wǎng)卡類,將messagebuffer和整個(gè)網(wǎng)絡(luò)聯(lián)系在一起。構(gòu)造函數(shù)中傳入節(jié)點(diǎn)id,虛網(wǎng)總數(shù)以及網(wǎng)絡(luò)指針。并由網(wǎng)絡(luò)指針中獲得每個(gè)虛網(wǎng)的VC數(shù)目,乘一下就是總VC數(shù)。另外一些屬性:m_ni_buffer屬性,即網(wǎng)卡的flit_buffer向量,每個(gè)VC對應(yīng)一個(gè)。之后實(shí)例化每個(gè)flit_bufferm_ni_queue_time屬性,和上面的buffer對應(yīng),即每個(gè)VC的入隊(duì)到ni的時(shí)間。之后初始化均為無效值inNode_ptr和outNode_ptr:每個(gè)虛網(wǎng)對應(yīng)一個(gè)輸入messagebuffer和一個(gè)輸出messagebuffercreditQueue:用來在eject掉flit后生成credit,往路由器發(fā)每個(gè)虛網(wǎng)必須要進(jìn)行VA過程,功能和路由器的VA器類似,但只需維護(hù)一個(gè)RR的數(shù)組,表示每個(gè)虛網(wǎng)RR到哪里。用來獲取與該NI相連的路由器內(nèi)的VC。同時(shí)也需要OutVcState對象,因?yàn)橐吐酚善鞯妮敵鰡卧Y(jié)構(gòu)類似。后者初始化為idle添加輸入端口函數(shù):傳入?yún)?shù)有輸入數(shù)據(jù)link以及creditlink,后者是由NIeject掉flit后往路由器發(fā)的。設(shè)置inLink的consumer是網(wǎng)卡自身,設(shè)置creditLink的sourceQueue就是自己的creditQueue。添加輸出端口函數(shù):傳入?yún)?shù)有輸出數(shù)據(jù)link以及creditlink,后者是由路由器發(fā)給NI告知是否能夠繼續(xù)注入的。設(shè)置outLink的sourceQueue是outSrcQueue(由m_ni_buffer往里面填的),而creditLink的consumer即為NI自身。添加節(jié)點(diǎn)函數(shù):其實(shí)就是在構(gòu)造網(wǎng)絡(luò)時(shí),將controller的messageBuffer傳給網(wǎng)卡的inNode_ptr以及outNode_ptr。并且設(shè)置inNode的consumer就是網(wǎng)卡自身,因?yàn)閕nNode這個(gè)Messagebuffer需要喚醒其consumer(NI)進(jìn)行發(fā)送事件。所以要將兩者綁定。將message轉(zhuǎn)換為一個(gè)一個(gè)flit的函數(shù):通過參數(shù)傳遞要發(fā)送的message,獲取message的目標(biāo)netDest,轉(zhuǎn)換為dest各節(jié)點(diǎn)的數(shù)組。根據(jù)天花板除得到總共的flit個(gè)數(shù):是由MessageSizeType_to_int得到被除數(shù)(默認(rèn)為72或8字節(jié)),由m_net_ptr->getNiFlitSize(在BaseGarnetNetwork.py參數(shù)里定義,默認(rèn)為16)得到除數(shù),相除結(jié)果默認(rèn)為5或1。接下來循環(huán)每個(gè)dest節(jié)點(diǎn),調(diào)用VA器分配VC,如果沒分配成功,則直接返回了。分配成功了,需要將消息克隆一份,因?yàn)橄⑹墙M播的,單獨(dú)的一份發(fā)了就沒了。如果是組播的話,需要從dest數(shù)組分離出單獨(dú)的dest,再重新構(gòu)造回NetDest結(jié)構(gòu),作為該克隆后的message的internalDest,并將克隆前的原始組播message的internaldest以及dest數(shù)組兩個(gè)結(jié)構(gòu)中都消除該dest。在得到分離出來的單播message后,需要開始發(fā)送,遍歷剛計(jì)算出來的flit數(shù),網(wǎng)絡(luò)統(tǒng)計(jì)注入數(shù)目自增。接著創(chuàng)建flit對象,將剛才VA過程得到的vc傳給它,設(shè)置其src_delay為產(chǎn)生到發(fā)出經(jīng)過的時(shí)間差,最后將flit移入m_ni_buffer[vc]中,更新入隊(duì)時(shí)間m_ni_queue_time,以及outVcState為active。計(jì)算VC的函數(shù):并不需要真正的VA器對象,只需一個(gè)int數(shù)組即可,用于RR。根據(jù)虛網(wǎng)號,遍歷該虛網(wǎng)對應(yīng)的所有VC,得到RR數(shù)組的當(dāng)前虛網(wǎng)的元素并前進(jìn)一個(gè),從該VC開始察看outVcState如果是idle,則直接返回VC號Wakeup()函數(shù):首先,NI作為三個(gè)對象的consumer,可能被這三個(gè)對象喚醒,分別是inNode_ptr(告知NI有消息要發(fā)送)、creditLink(由路由器injectcredit)和輸入的數(shù)據(jù)link(告知NI有數(shù)據(jù)進(jìn)來)每周期,每個(gè)虛網(wǎng)都可以找一個(gè)消息發(fā)送。第一步:如果有準(zhǔn)備好發(fā)送的消息,則將其分成flit后給outputlink傳送,但必須VA成功才行,最后inNode_ptr中pop出,message的一組flit都被放進(jìn)m_ni_buffer中,接著調(diào)用scheduleOutputLink通知outputLink以RR方式進(jìn)行傳送,并檢查是否還有flit,來判斷下周期是否還需要schedule自身。第二步:如果被輸入數(shù)據(jù)link所喚醒,則檢查輸入數(shù)據(jù)Link,consumer出flit,如果是尾flit,說明已經(jīng)接收到了一個(gè)完整的message,則將outNode_ptr[vnet]中enqueue進(jìn)該尾flit的msg_ptr消息指針。這里由于假設(shè)NIbuffer無限,所以ejectcredit一直在發(fā)送。所以直接發(fā)送credit,如果是尾flit則可以釋放VC(freesignal=true)。這個(gè)過程是在creditQueue中插入新生成的creditflit,并在一周期后schedulecreditlink。之后更新flit的統(tǒng)計(jì)信息,因?yàn)閒lit已經(jīng)完成了其生命周期,最后刪除Flit。第三步:檢測NI的creditlink,如果有credit,貝I」consume,outVcState[vc]調(diào)用incrementCredit,如果是freesignali則將VC釋放(狀態(tài)置為IDLE)。scheduleOutputLink函數(shù):作用為當(dāng)m_ni_buffer中有數(shù)據(jù)要發(fā)送,則調(diào)度其輸出link進(jìn)行發(fā)送。維護(hù)一個(gè)m_RR_vc指向所有VC,m_RR先自增,到頭了歸零。從RR開始遍歷所有VC,首先該VC有數(shù)據(jù)要發(fā)送,其次其outVcState要有credit,滿足這兩個(gè)條件后,看如果要求網(wǎng)絡(luò)有序,則該虛網(wǎng)中如果有比當(dāng)前flit來的早的,則不設(shè)為候選,continue。得到候選VC后,將該VC的m_out_vc_state的credit自減。從m_ni_buffer[vc沖Pop出flit,設(shè)置flit時(shí)間為當(dāng)前時(shí)間加1將flit加入到outSrcQueue,一周期后調(diào)度outnetLink。如果是尾flit,則說明該message已經(jīng)完全注入,將該VC的入隊(duì)時(shí)間恢復(fù)到無效值。VirturalChannel_d.cc/hhVC類:構(gòu)造中傳入id,每個(gè)VC其實(shí)就是一組buffer,所以需要創(chuàng)建flitbuffer的實(shí)例input_buffer,初始化狀態(tài)first置為IDLE,second為當(dāng)前時(shí)間,入隊(duì)時(shí)間為無效值。route屬性:儲存路由計(jì)算RC的結(jié)果,一個(gè)端口號的int。output_vc屬性:表示在VA完成后,將下一跳VC號傳入。m_credit_count屬性:當(dāng)VA完成后,同步更新已分配的下一跳VC的credit數(shù)目。提供的方法有:Grant_vc:當(dāng)VA成功后更新output_vc,狀態(tài)置為active,從inputbuffer中獲得隊(duì)首flit,將其stage前進(jìn)到SA。need_stage(VC_state_typestate,flit_stagestage):判斷某個(gè)VC本周期是否需要進(jìn)行某一stage,傳入stage和期望的flitstage。即要求滿足以下條件:VC狀態(tài)和state參數(shù)相同,當(dāng)前時(shí)間已經(jīng)到了或超過了VC的時(shí)間,VC隊(duì)首flit的stage和stage參數(shù)相同。need_stage_nextcycle:和上面一樣,只不過時(shí)間的條件改為當(dāng)前時(shí)間加1是否大于等于VC時(shí)間。VCallocator_d.cc/hhVA器類:作為路由器的組件,構(gòu)造傳入?yún)?shù)僅為路由器指針。得到虛網(wǎng)數(shù)、每個(gè)虛網(wǎng)的VC數(shù),并建立兩步VA過程的activity統(tǒng)計(jì)信息。初始化函數(shù)中,根據(jù)路由器指針得到輸入、輸出單元引用,得到輸入輸出端口數(shù)目(不同位置路由器的端口數(shù)目不同)。新建m_round_robin_invc和m_round_robin_outvc。用于RR的優(yōu)先級指針。兩者都為矩陣,長度為端口號,寬度為VC號。m_outvc_req是四維布爾向量,四個(gè)維度分別是[outport][outvc][inport][invc],為true表示第一個(gè)VA階段中有相應(yīng)的請求。m_outvc_is_req為二維布爾向量,兩個(gè)維度為[outport][outvc],為true表示在第一個(gè)VA階段,該輸出VC曾被請求過。Round-robin的優(yōu)先指針全初始化為0,而布爾向量全初始化為false。其喚醒函數(shù)Wakeup主要完成四步:第一步:VA第一階段,根據(jù)RR優(yōu)先級,遍歷所有的輸入端口及輸入VC,如果是候選VC,則根據(jù)其輸出端口中,RR尋找一個(gè)空閑的輸出VC。將對應(yīng)的m_outvc_req[outport][outvc][inport][invc]置為true,m_outvc_is_req[outport][outvc]也為true,表示該端口該VC曾被至少一次請求過。第二步:VA第二階段,RR遍歷每個(gè)輸出VC,如果其m_outvc_is_req[outport][outvc]是true,貝I」RR遍歷所有輸入VC,第一個(gè)找到的輸入VC如果正好是請求者,即m_outvc_req[outport][outvc][inport][invc]是true,則就將該VC分配給它。VA成功者,輸入VC需要grantVC(見上),輸出單元更新結(jié)果(狀態(tài)為ACTIVE,并被分配該輸出VC的輸入端口和VC號),最后使路由器調(diào)度1周期后進(jìn)入SA階段。第三步:清除VA的痕跡,布爾矩陣歸false,但RR結(jié)果不變,結(jié)果下次會用到,這樣才算是round-robin。第四步:看看下一周期該VA器是不是需要再次VA,即遍歷每個(gè)輸入VC,如果下周期仍然需要VA(用VC類中的need_stage_nextcycle來判斷,詳見上條),則1周期后調(diào)度this。SWallocator_d.cc/hhSA器類:作為路由器的組件,構(gòu)造傳入?yún)?shù)僅為路由器指針,得到虛網(wǎng)數(shù)、每個(gè)虛網(wǎng)的VC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論