




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
一些編程要點:重要??!要添加一個新的網(wǎng)絡(luò),找到$GEM5/configs/ruby/Ruby.py的第84行,添加一種新的網(wǎng)絡(luò)名稱,并把幾個py模塊給pass了。Mapping或線程遷移的實現(xiàn),把原網(wǎng)卡類作為虛擬網(wǎng)卡類,要和協(xié)議收發(fā)message時,使用虛擬網(wǎng)卡,而在進行網(wǎng)絡(luò)的動作時使用實際網(wǎng)卡,兩者之間建立一張mapping表。具體實現(xiàn):在GarnetNetwork_d類中,建立外部網(wǎng)卡和內(nèi)部網(wǎng)卡,將networkInterface_d類拆分成兩部分,一部分用于和協(xié)議通信的外部網(wǎng)卡,另一部分用于和網(wǎng)絡(luò)通信的內(nèi)部網(wǎng)卡,兩者同時傳入網(wǎng)絡(luò)指針作為參數(shù),即可相互調(diào)用。當(dāng)有message要發(fā)送時,即被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,將消息中增添一個屬性。并調(diào)用自己的內(nèi)部網(wǎng)卡來發(fā)送消息給目的地對應(yīng)的內(nèi)部網(wǎng)卡節(jié)點,所有路由器內(nèi)部的組件,都只傳入路由器指針自身,而需要調(diào)用路由器其他組件完成的事情(即流水級要前進),則函數(shù)都在路由器中實現(xiàn),目的是讓本組件方便調(diào)用,接著讓路由器調(diào)度它的另一組件去行動。所有具有wakeup方法的類,都是consumer的子類,見各個.hh文件。因為wakeup是在consumer父類里作為虛函數(shù)出現(xiàn)的。當(dāng)scheduleevent之后就會在規(guī)定時間調(diào)用wakeup綁定consumer、sourcequeue的目的是某些對象的consumer并不事先知道,如各種link的consumer和sourcequeue需要在構(gòu)建網(wǎng)絡(luò)時才知道,所以在那時需要設(shè)置consumer和sourcequeue。當(dāng)然有些對象的consumer是固定的,比如VA器的consumer一定是SA器,所以在scheduleevent函數(shù)里的第一個參數(shù)直接就寫SA器了。各種東西的表示方法:1.Flit轉(zhuǎn)換為message指針:MsgPtrmsg_ptr=t_flit->get_msg_ptr();NetworkMessage*net_msg_ptr=safe_cast<NetworkMessage*>(msg_ptr.get());各種拓撲?py:位于ruby/network/topologies中,以Mesh.py為例每個都繼承于Topology類,都定義了MakeTopology方法,傳入的參數(shù)為:nodes:所有控制器的指針數(shù)組,模擬器先構(gòu)建各種controller,然后將各個controller作為參數(shù)傳進來構(gòu)建拓撲options:配置,基本就是命令行敲入的num_cpus、mesh_rows等等IntLink,ExtLink,Router:輸入、輸出link以及路由器的構(gòu)造函數(shù)指針函數(shù)返回一個mesh對象,其屬性包括routers以及extlink和inlink,都是對象數(shù)組此MakeTopology函數(shù)的主要任務(wù)是構(gòu)建路由器以及各種節(jié)點與路由器之間、路由器與路由器之間的連線Topology.cc/hh:傳入的參數(shù)為paramp,用到mesh.py生成的拓撲結(jié)構(gòu)。其param()就是mesh對象,里面含exlink/inlink等對象。從param()中ext_link對象數(shù)組,將每個都轉(zhuǎn)換成ext_link(由于之前在mesh.py中就用Extlink構(gòu)造函數(shù)調(diào)用的,所以構(gòu)造出來的肯定是exlink類型的)。同時得到controller和router對象應(yīng)用,前者是在mesh.py中的nodes參數(shù)傳進去的(之前將所有controller都構(gòu)建好了,作為nodes參數(shù)傳進去的),后者是用Router的構(gòu)造函數(shù)構(gòu)造的。接著遍歷每個在Python中生成的外部、內(nèi)部連線,得到兩端點的指針(路由器或是controller),把外部節(jié)點即controller的src,編號為0~外部節(jié)點數(shù)-1,而其dest編號為外部節(jié)點數(shù)~2倍外部節(jié)點數(shù)-1,而內(nèi)部節(jié)點編號為2倍的外部節(jié)點數(shù)~2倍的外部節(jié)點數(shù)+內(nèi)部節(jié)點(即路由器)數(shù)-1。則在C++中建立具體的連線,需要建立兩個方向的連線。起始就是在m_link_map字典中添加<source,dest>的pair到link_entry(link指針和方向)的map映射。這里的source和dest就用剛才的方法編號了。其create_link方法:首先找到最大的switch_id,注意這里的switch不僅是路由器,還包括controller,所以最大的switch」d+1就是所有的節(jié)點加路由器。比如network_test,如果是4*4的Mesh,每個節(jié)點有一個L1和direcotry,則0-31是controller的src,32-63是controller的dest,64-79為路由器,所以總共是80個switch0權(quán)重矩陣、latency矩陣、interswitch矩陣的大小都設(shè)為switch數(shù)目*switch數(shù)目。初始化時,遍歷每個m_link_map(注意是雙向的),把其中的源和目的的權(quán)重找到,賦給相應(yīng)的weight[src][dest]。權(quán)重矩陣的對角線設(shè)為0(自己到自己的花銷是0),其余暫時設(shè)為無限。接下來調(diào)用shortest_path函數(shù),尋找任意兩個節(jié)點(包括路由和controller)之間的最短路徑。即根據(jù)權(quán)重矩陣,更新延時矩陣和中間路由矩陣,返回最短距離矩陣。權(quán)重矩陣不變接著遍歷權(quán)重矩陣,找到所有權(quán)重矩陣中非無限的元素,即有鏈路,則得到以鏈路起點為起點,終點為下一跳的初始一Hop,所能達到的目的地的集合。形成了一種類似反向的路由表。最后正式建立起鏈路,Makelink方法,把路由表的入口(即這個鏈路能夠到達的目的地的集合)也傳進鏈路的屬性中。這里Makelink中調(diào)用的MakeExLink、MakeInLink和MakeInternalLink三個函數(shù),由具體網(wǎng)絡(luò)實現(xiàn),Garnet中由GarnetNetwork_d實現(xiàn),因為不同的網(wǎng)絡(luò)有不同的Link的樣子,如Garnet需要數(shù)據(jù)link和creditlink兩條。BasicLink.cc/hh/py里面構(gòu)建了3個類,分別是BasicLink、BasicIntLink和BasicExLink。后兩個繼承第一個。Cc/hh從py文件中獲取參數(shù),BasicLink中的參數(shù)為latency、bandwidthfactor和權(quán)重;BasicIntLink為內(nèi)部節(jié)點和外部節(jié)點的指針,而BasicExLink為節(jié)點a和b的指針latency和權(quán)重為默認值1,在構(gòu)建拓撲時調(diào)用構(gòu)造會改掉的。而帶寬系數(shù)為16。外部節(jié)點為Param.RubyController,內(nèi)部節(jié)點、節(jié)點a和b均為Param.BasicRouter。這些均為屬性。BasicRouter.cc/hh/py什么也沒有,只有paramp傳入的id,而在py中,該id也沒有默認值,需要在構(gòu)建拓撲時調(diào)用構(gòu)造函數(shù)時指定。Network.cc/hh/py構(gòu)造中,從Python中傳入的參數(shù)有虛網(wǎng)數(shù)、拓撲類型的指針、控制消息的大小,并獲得總共的controller個數(shù)。最后使得每個終端節(jié)點(controller的網(wǎng)絡(luò)指針屬性指向自身)。此外提供一個將MessageSizeType轉(zhuǎn)換為控制消息type和數(shù)據(jù)消息type的方法。其中控制消息大小是由python指定的,通常是8個字節(jié),而數(shù)據(jù)一般是一個cacheline,為64字節(jié)再加上控制的8字節(jié),為72字節(jié)。接下來看Garnet文件夾內(nèi)的文件NetworkHeader.hh規(guī)定了在Garnet中才使用的一些宏和枚舉,包括虛網(wǎng)類型枚舉(控制虛網(wǎng)、數(shù)據(jù)虛網(wǎng)默認虛網(wǎng))、flit類型(頭、身子、尾、又是頭又是尾)、VC狀態(tài)(空閑、正在VA、占用)、以及flitstage(剛生成、VA、SA、ST、LT)。BaseGarnetNetwork.cc/hh/py構(gòu)造中從python中傳入網(wǎng)卡使用的flit大小,python中默認為16字節(jié),以及每個虛網(wǎng)的VC數(shù)目為4。要求每條鏈路的帶寬因數(shù)bandwidthfactor要和ni的flit大小相同,都為16字節(jié)。生成m_toNetQueues以及m_fromNetQueues兩個屬性,均為長度為controller個數(shù)的messagebuffer的二維向量,第二維是它的虛網(wǎng)數(shù)。即對于每個controller的每個虛網(wǎng),都建立一個進一個出的messagebuffer,并且實例化了。以上為Garnet(即較為精確的片上網(wǎng))通用的文件*********************接下來看Garnet-fixed-pipeline文件夾內(nèi)的文件,也是最內(nèi)層的文件GarnetNetwork_d.cc/hh/pyPython中傳入?yún)?shù)為每個數(shù)據(jù)、控制的VC的buffer,含多少個flit,數(shù)據(jù)默認為4。用爺爺類Network類中得到的拓撲指針,訪問路由器,加入到本類的路由器向量屬性中,方便調(diào)用。初始化時,使每個路由器的網(wǎng)絡(luò)指針指向自身,接下來建立網(wǎng)卡,每個終端節(jié)點(controller)都建立一個,接下來根據(jù)拓撲,調(diào)用拓撲的create_link方法建立矩陣,以及每條路徑的反向路由表。并根據(jù)Garnet的特征,建立的鏈路有credit和數(shù)據(jù)link兩種。建立的所有l(wèi)ink都加入到m_link_ptr_vector中,最后遍歷之,將其網(wǎng)絡(luò)指針指向自身。至此,終端節(jié)點、路由器以及所有Link的網(wǎng)絡(luò)指針,全指向了自己,即GarnetNetwork。而在MakeInLink健立網(wǎng)卡到網(wǎng)絡(luò),即路由器的連線)中,BasicLink的指針作為參數(shù)傳遞進去的,將其強制轉(zhuǎn)換為GarnetLink后,就有了netlink和creditlink兩條,分別加入m_link_ptr_vector和m_creditlink_ptr_vector后,讓路由器建立輸入端口,網(wǎng)卡建立輸出端口,都將數(shù)據(jù)Link和creditlink傳入。MakeOutLink和MakeInternalLink也類似。注意,路由器在建立輸出端口的時候,需要傳遞進路由表路由以及鏈路的權(quán)重。此外提供了父類屬性m_toNetQueues以及m_fromNetQueues的getter方法,以及getRubyStartTime方法GarnetLink_d.cc/hh/py有python傳入的參數(shù)有l(wèi)ink_id、link_latency、每個虛網(wǎng)的vc數(shù),虛網(wǎng)數(shù)以及通道寬度(必須等于bandwidthfactor)0注意這些的類為NetworkLink_d,下面的文件用到的。此外在GarnetlntLink_d以及GarnetExtLink_d類中,還要調(diào)用NetworkLink_d和CreditLink_d兩個構(gòu)造函數(shù)各兩次,因為是雙向的,構(gòu)建兩條鏈路,并append到一個向量中,作為向量的參數(shù)傳給cc文件。分別為credit_links和network_links。.cc中直接取network_links[0]為入,network_links[1]為出,creditlink也一樣。NetworkLink_d.cc/hhCreditLink_d.hh從python中傳入?yún)?shù)為延時和帶寬以及線路id,并創(chuàng)建linkbuffer,以及一些統(tǒng)計,如每個VC的負載,以及l(fā)ink的使用次數(shù)提供的函數(shù)包括設(shè)置link的consumer以及sourceQueue。NetworkLink可被其sourceQueue喚醒,喚醒后從sourceQueue中取到topFlit,將其pop出sourceQueue后放到自己的linkbuffer中,然后在link_lalency周期后調(diào)度其consumer。最后更新該Link的兩個統(tǒng)計信息。而creditLink完全繼承于NetworkLink,基本沒什么區(qū)另U。因為兩者運行原理一樣,傳的credit也是作為flit的一種,也有consumer和sourceQueue,所以基本一樣。Router_d.cc/hhGarnetRouter_d.py繼承于父類BasicRouter。從python中傳入的參數(shù)有虛網(wǎng)數(shù)目、每個虛網(wǎng)的VC數(shù),兩者相乘得到總VC數(shù)。構(gòu)造函數(shù)中新建了路由計算RC單元、VA單元、SA單元和switch單元,并都傳遞自己的指針this作為它們的路由器指針,并將其初始化。注意,輸入單元和輸出單元并不在路由器的構(gòu)造函數(shù)中實例化,而在網(wǎng)絡(luò)Makelink的時候,調(diào)用路由器的添加端口函數(shù),同時添加了輸入和輸出單元。路由器的每一個端口都有一個輸入和一個輸出單元。為什么要這樣?是因為路由器的端口數(shù)目并不固定,而是完全由路由器周圍的連線所決定的,如mesh的頂點和中間顯然端口不同,所以無法用統(tǒng)一的實例化函數(shù)來構(gòu)造這些數(shù)目不同的輸入、輸出單元。增加輸入、輸出端口函數(shù),也需要指定其creditlink和netlink的consumer、sourcequeue等。將這些鏈路與輸入輸出單元綁定。之前已述,輸出單元的構(gòu)造中需要傳入路由表入口和權(quán)重。此外,還有路由請求、VA請求、SA請求、switch請求等函數(shù),基本都是調(diào)用相應(yīng)的模塊。其中路由請求是這個周期就進行路由計算,并觸發(fā)VA請求,而后兩個都需要1周期后調(diào)度。最后還有更新統(tǒng)計的函數(shù)。RoutingUnit_d.cc/hh傳入?yún)?shù)為路由器指針。兩個關(guān)鍵的屬性為m_routing_table以及m_weight_table。前者是路由表入口(Netdest)類型的向量,每個元素代表一個Link,后者是對應(yīng)link的權(quán)重即代價,如果代價太大,即使能夠在路由表中找到dest,也未必會選擇這條路,因為總是找代價最小的路。類中提供往這兩個向量中pushback元素的函數(shù),在外部被調(diào)用的,即是在GarnetNetwork類中遍歷每個路由器,讓路由器調(diào)用addOutLink函數(shù)時,會再讓路由單元將路由表和權(quán)重添加進來。RC_stage函數(shù),進行RC過程,傳入flit,inputunit對象和VC號,主要是進行RC計算,計算完后更新該VC的輸出端,VC的狀態(tài)由IDLE前進到VC_AB,flit流水級前進到VA。最后調(diào)度路由器進行VA過程。而RC計算函數(shù)是重點:首先根據(jù)頭flit得到message指針,并轉(zhuǎn)換為networkmessage,并得到該message的NetDest屬性,接下來遍歷該路由器的所有輸出link,也就是其整張路由表的每一項,看看其netDest是否與該message的NetDest有交集,如果有的話要求權(quán)重是最小的,找到最小的權(quán)重的link作為路由計算的結(jié)果,返回該output_link。InputUnit_d.cc/hh輸入單元類,構(gòu)造中傳入?yún)?shù)為路由器指針及id。得到VC數(shù)和每個虛網(wǎng)的VC數(shù)。建立creditqueue,用于向與之相連的creditlink發(fā)creditflit。此時建立每個VC對象實例。放進m_vcs屬性中。其繼承了consumer,所以又wakeup函數(shù),wakeup函數(shù)中,觀察與之相連的輸入link是否有數(shù)據(jù)且數(shù)據(jù)已經(jīng)到了(isReady),有的話consumer一個flit,得到該flit的VC(上一跳VA階段分配的),如果是頭flit,則顯然assert該VC狀態(tài)是idle的,則發(fā)出route_req,調(diào)用路由器的相應(yīng)函數(shù),再由路由器通知路由單元立刻開始路由計算。之后設(shè)置該VC的入隊時間。否則如果不是頭flit,則直接讓flit進入SA階段,并發(fā)出SA請求(需等一周期才調(diào)度SA單元)。此時往buffer中(也即m_vc[flit的vc])寫入該flit。這就實現(xiàn)了BW和RC的同時進行。PS.從這里可以看出,路由器的buffer是隱含在輸入單元的m_vc屬性中的。最后統(tǒng)計該虛網(wǎng)的buffer讀寫次數(shù)等信息。OutputUnit_d.cc/hhOutVcState.cc/hh同輸入單元一樣,輸出單元的構(gòu)造中傳入id和路由器指針,得到總VC數(shù)量。接著建立輸出的flitBuffer,并將每一個輸出VC(與之相連的路由器的輸入VC的情況)建立outVcState,放入m_outvcstate屬性中。提供了decrement_credit方法。當(dāng)該路由器每發(fā)送一個flit時就需要調(diào)用之,使該outputUnit的outputstate[分配的VC]自減。路由器更新credit狀態(tài),這個意思是,路由器的輸入單元里的VC即buffer,也必須能夠看到outVcState中credit的變化,為了能夠進行VA和SA。所以每個輸入單元的VC的credit指的也是下一跳,每個VC都有一個creditcount,這個creditcount指的是該輸入VC已經(jīng)經(jīng)過了VA階段,和某一個輸出VC綁定,creditcount指的是該輸出VC,也就是下一跳的輸入VC的credit數(shù)目。Wakeup函數(shù)里(一定是由creditlink所喚醒),檢查creditlink,如果有credit,就得到其outvc,increment相應(yīng)outvc的credit,并更新相應(yīng)的輸入VC的credit數(shù)。另外如果該credit附帶了釋放VC(因為下一個路由器有尾flit走了),則將該outvc狀態(tài)釋放為idle。而OutVcState里維護了inport、invc屬性(經(jīng)過VA后,與該outVC對應(yīng)的輸入端口和VC)以及creditcount,后者也會在調(diào)用路由器的updateCredit函數(shù)更新到輸入VC中。其構(gòu)造函數(shù)即初始化時,根據(jù)虛網(wǎng)類型,是數(shù)據(jù)還是控制,得到buffer大小所具有的初始flit的個數(shù),作為其初始的credit數(shù)目。默認數(shù)據(jù)是4,控制是1。Flit_d.cc/hhFlitBuffer_d.cc/hhflitBuffer類中最主要的屬性也就是m_buffer,即一個flit指針數(shù)組。里面提供插入flit方法、得到時間最早的flit方法,彈出隊首flit方法等。用于判斷狀態(tài)的方法有isReady:先找到時間最早的隊首flit,看看其時間是否小于等于當(dāng)前模擬時間,如果是說明該flit已經(jīng)可用。isReadyForNext,和isReady類似,不同的是判斷flit時間是否小于等于當(dāng)前時間加1,即下一周期該flit是否可用。另外還有isEmpty,即m_buffer是否為空。isFull,即m_buffer是否等于max_size。Flit類提供兩個構(gòu)造,一種構(gòu)造為數(shù)據(jù)flit,主要提供屬性為id、size(注意這里的size指的是message包含的flit個數(shù))、vc號、虛網(wǎng)號以及對應(yīng)消息的指針、stage。構(gòu)造函數(shù)即初始化中,flit的時間定為構(gòu)造時,即剛生成flit的時間。Stage屬性為<狀態(tài)stage、時間>的pair,前者初始化為I,后者初始化為flit時間。接著根據(jù)size和id決定其種類是頭flit、尾flit、身子flit還是又是頭又是尾(size==1)另一種構(gòu)造為creditflit,其屬性僅有vc,id—定為0,另外有個isfreesignal,即該creditflit是否附帶釋放VC的功能(由尾數(shù)據(jù)flit離開而產(chǎn)生)。NetworkInterface_d.cc/hh很重要的網(wǎng)卡類,將messagebuffer和整個網(wǎng)絡(luò)聯(lián)系在一起。構(gòu)造函數(shù)中傳入節(jié)點id,虛網(wǎng)總數(shù)以及網(wǎng)絡(luò)指針。并由網(wǎng)絡(luò)指針中獲得每個虛網(wǎng)的VC數(shù)目,乘一下就是總VC數(shù)。另外一些屬性:m_ni_buffer屬性,即網(wǎng)卡的flit_buffer向量,每個VC對應(yīng)一個。之后實例化每個flit_bufferm_ni_queue_time屬性,和上面的buffer對應(yīng),即每個VC的入隊到ni的時間。之后初始化均為無效值inNode_ptr和outNode_ptr:每個虛網(wǎng)對應(yīng)一個輸入messagebuffer和一個輸出messagebuffercreditQueue:用來在eject掉flit后生成credit,往路由器發(fā)每個虛網(wǎng)必須要進行VA過程,功能和路由器的VA器類似,但只需維護一個RR的數(shù)組,表示每個虛網(wǎng)RR到哪里。用來獲取與該NI相連的路由器內(nèi)的VC。同時也需要OutVcState對象,因為要和路由器的輸出單元結(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é)點函數(shù):其實就是在構(gòu)造網(wǎng)絡(luò)時,將controller的messageBuffer傳給網(wǎng)卡的inNode_ptr以及outNode_ptr。并且設(shè)置inNode的consumer就是網(wǎng)卡自身,因為inNode這個Messagebuffer需要喚醒其consumer(NI)進行發(fā)送事件。所以要將兩者綁定。將message轉(zhuǎn)換為一個一個flit的函數(shù):通過參數(shù)傳遞要發(fā)送的message,獲取message的目標netDest,轉(zhuǎn)換為dest各節(jié)點的數(shù)組。根據(jù)天花板除得到總共的flit個數(shù):是由MessageSizeType_to_int得到被除數(shù)(默認為72或8字節(jié)),由m_net_ptr->getNiFlitSize(在BaseGarnetNetwork.py參數(shù)里定義,默認為16)得到除數(shù),相除結(jié)果默認為5或1。接下來循環(huán)每個dest節(jié)點,調(diào)用VA器分配VC,如果沒分配成功,則直接返回了。分配成功了,需要將消息克隆一份,因為消息是組播的,單獨的一份發(fā)了就沒了。如果是組播的話,需要從dest數(shù)組分離出單獨的dest,再重新構(gòu)造回NetDest結(jié)構(gòu),作為該克隆后的message的internalDest,并將克隆前的原始組播message的internaldest以及dest數(shù)組兩個結(jié)構(gòu)中都消除該dest。在得到分離出來的單播message后,需要開始發(fā)送,遍歷剛計算出來的flit數(shù),網(wǎng)絡(luò)統(tǒng)計注入數(shù)目自增。接著創(chuàng)建flit對象,將剛才VA過程得到的vc傳給它,設(shè)置其src_delay為產(chǎn)生到發(fā)出經(jīng)過的時間差,最后將flit移入m_ni_buffer[vc]中,更新入隊時間m_ni_queue_time,以及outVcState為active。計算VC的函數(shù):并不需要真正的VA器對象,只需一個int數(shù)組即可,用于RR。根據(jù)虛網(wǎng)號,遍歷該虛網(wǎng)對應(yīng)的所有VC,得到RR數(shù)組的當(dāng)前虛網(wǎng)的元素并前進一個,從該VC開始察看outVcState如果是idle,則直接返回VC號Wakeup()函數(shù):首先,NI作為三個對象的consumer,可能被這三個對象喚醒,分別是inNode_ptr(告知NI有消息要發(fā)送)、creditLink(由路由器injectcredit)和輸入的數(shù)據(jù)link(告知NI有數(shù)據(jù)進來)每周期,每個虛網(wǎng)都可以找一個消息發(fā)送。第一步:如果有準備好發(fā)送的消息,則將其分成flit后給outputlink傳送,但必須VA成功才行,最后inNode_ptr中pop出,message的一組flit都被放進m_ni_buffer中,接著調(diào)用scheduleOutputLink通知outputLink以RR方式進行傳送,并檢查是否還有flit,來判斷下周期是否還需要schedule自身。第二步:如果被輸入數(shù)據(jù)link所喚醒,則檢查輸入數(shù)據(jù)Link,consumer出flit,如果是尾flit,說明已經(jīng)接收到了一個完整的message,則將outNode_ptr[vnet]中enqueue進該尾flit的msg_ptr消息指針。這里由于假設(shè)NIbuffer無限,所以ejectcredit一直在發(fā)送。所以直接發(fā)送credit,如果是尾flit則可以釋放VC(freesignal=true)。這個過程是在creditQueue中插入新生成的creditflit,并在一周期后schedulecreditlink。之后更新flit的統(tǒng)計信息,因為flit已經(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進行發(fā)送。維護一個m_RR_vc指向所有VC,m_RR先自增,到頭了歸零。從RR開始遍歷所有VC,首先該VC有數(shù)據(jù)要發(fā)送,其次其outVcState要有credit,滿足這兩個條件后,看如果要求網(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時間為當(dāng)前時間加1將flit加入到outSrcQueue,一周期后調(diào)度outnetLink。如果是尾flit,則說明該message已經(jīng)完全注入,將該VC的入隊時間恢復(fù)到無效值。VirturalChannel_d.cc/hhVC類:構(gòu)造中傳入id,每個VC其實就是一組buffer,所以需要創(chuàng)建flitbuffer的實例input_buffer,初始化狀態(tài)first置為IDLE,second為當(dāng)前時間,入隊時間為無效值。route屬性:儲存路由計算RC的結(jié)果,一個端口號的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中獲得隊首flit,將其stage前進到SA。need_stage(VC_state_typestate,flit_stagestage):判斷某個VC本周期是否需要進行某一stage,傳入stage和期望的flitstage。即要求滿足以下條件:VC狀態(tài)和state參數(shù)相同,當(dāng)前時間已經(jīng)到了或超過了VC的時間,VC隊首flit的stage和stage參數(shù)相同。need_stage_nextcycle:和上面一樣,只不過時間的條件改為當(dāng)前時間加1是否大于等于VC時間。VCallocator_d.cc/hhVA器類:作為路由器的組件,構(gòu)造傳入?yún)?shù)僅為路由器指針。得到虛網(wǎng)數(shù)、每個虛網(wǎng)的VC數(shù),并建立兩步VA過程的activity統(tǒng)計信息。初始化函數(shù)中,根據(jù)路由器指針得到輸入、輸出單元引用,得到輸入輸出端口數(shù)目(不同位置路由器的端口數(shù)目不同)。新建m_round_robin_invc和m_round_robin_outvc。用于RR的優(yōu)先級指針。兩者都為矩陣,長度為端口號,寬度為VC號。m_outvc_req是四維布爾向量,四個維度分別是[outport][outvc][inport][invc],為true表示第一個VA階段中有相應(yīng)的請求。m_outvc_is_req為二維布爾向量,兩個維度為[outport][outvc],為true表示在第一個VA階段,該輸出VC曾被請求過。Round-robin的優(yōu)先指針全初始化為0,而布爾向量全初始化為false。其喚醒函數(shù)Wakeup主要完成四步:第一步:VA第一階段,根據(jù)RR優(yōu)先級,遍歷所有的輸入端口及輸入VC,如果是候選VC,則根據(jù)其輸出端口中,RR尋找一個空閑的輸出VC。將對應(yīng)的m_outvc_req[outport][outvc][inport][invc]置為true,m_outvc_is_req[outport][outvc]也為true,表示該端口該VC曾被至少一次請求過。第二步:VA第二階段,RR遍歷每個輸出VC,如果其m_outvc_is_req[outport][outvc]是true,貝I」RR遍歷所有輸入VC,第一個找到的輸入VC如果正好是請求者,即m_outvc_req[outport][outvc][inport][invc]是true,則就將該VC分配給它。VA成功者,輸入VC需要grantVC(見上),輸出單元更新結(jié)果(狀態(tài)為ACTIVE,并被分配該輸出VC的輸入端口和VC號),最后使路由器調(diào)度1周期后進入SA階段。第三步:清除VA的痕跡,布爾矩陣歸false,但RR結(jié)果不變,結(jié)果下次會用到,這樣才算是round-robin。第四步:看看下一周期該VA器是不是需要再次VA,即遍歷每個輸入VC,如果下周期仍然需要VA(用VC類中的need_stage_nextcycle來判斷,詳見上條),則1周期后調(diào)度this。SWallocator_d.cc/hhSA器類:作為路由器的組件,構(gòu)造傳入?yún)?shù)僅為路由器指針,得到虛網(wǎng)數(shù)、每個虛網(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 展覽場地租賃合同
- 租賃小區(qū)場地合同
- 停薪留職合同協(xié)議
- 美術(shù)作品展覽權(quán)責(zé)免除合同
- 股份制企業(yè)合同簽署流程規(guī)范
- 環(huán)境咨詢服務(wù)合同
- 淘寶店裝修服務(wù)合同
- 養(yǎng)老服務(wù)合同發(fā)布
- 建筑工程質(zhì)量保證和監(jiān)理服務(wù)合同
- 南京師范大學(xué)中北學(xué)院《現(xiàn)代電力生產(chǎn)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中華人民共和國文物保護單位登記表
- 不符合項和糾正措施記錄表
- DBJ∕T13-354-2021 既有房屋結(jié)構(gòu)安全隱患排查技術(shù)標準
- 溫室大棚、花卉苗圃采暖方案(空氣源熱泵)
- 道路、橋梁、隧道、地鐵施工標準化手冊(專業(yè)篇)
- 部編人教版五年級下冊道德與法治全冊知識點整理歸納
- 初中人音版音樂七年級下冊.第二單元長江之歌.(14張)ppt課件
- 繪本閱讀《鐵絲網(wǎng)上的小花》
- 離心式排風(fēng)機安裝施工方案及技術(shù)措施
- 字號大小樣式設(shè)計參照表
- 理想信念主題班會ppt課件
評論
0/150
提交評論