111666Stushar@ece.gatech.edu/* 211666Stushar@ece.gatech.edu * Copyright (c) 2008 Princeton University 311666Stushar@ece.gatech.edu * Copyright (c) 2016 Georgia Institute of Technology 411666Stushar@ece.gatech.edu * All rights reserved. 511666Stushar@ece.gatech.edu * 611666Stushar@ece.gatech.edu * Redistribution and use in source and binary forms, with or without 711666Stushar@ece.gatech.edu * modification, are permitted provided that the following conditions are 811666Stushar@ece.gatech.edu * met: redistributions of source code must retain the above copyright 911666Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer; 1011666Stushar@ece.gatech.edu * redistributions in binary form must reproduce the above copyright 1111666Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer in the 1211666Stushar@ece.gatech.edu * documentation and/or other materials provided with the distribution; 1311666Stushar@ece.gatech.edu * neither the name of the copyright holders nor the names of its 1411666Stushar@ece.gatech.edu * contributors may be used to endorse or promote products derived from 1511666Stushar@ece.gatech.edu * this software without specific prior written permission. 1611666Stushar@ece.gatech.edu * 1711666Stushar@ece.gatech.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1811666Stushar@ece.gatech.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1911666Stushar@ece.gatech.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2011666Stushar@ece.gatech.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2111666Stushar@ece.gatech.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2211666Stushar@ece.gatech.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2311666Stushar@ece.gatech.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2411666Stushar@ece.gatech.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2511666Stushar@ece.gatech.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2611666Stushar@ece.gatech.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2711666Stushar@ece.gatech.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2811666Stushar@ece.gatech.edu * 2911666Stushar@ece.gatech.edu * Authors: Niket Agarwal 3011666Stushar@ece.gatech.edu * Tushar Krishna 3111666Stushar@ece.gatech.edu */ 3211666Stushar@ece.gatech.edu 3311666Stushar@ece.gatech.edu 3411666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/GarnetNetwork.hh" 3511666Stushar@ece.gatech.edu 3611666Stushar@ece.gatech.edu#include <cassert> 3711666Stushar@ece.gatech.edu 3811666Stushar@ece.gatech.edu#include "base/cast.hh" 3911666Stushar@ece.gatech.edu#include "base/stl_helpers.hh" 4011666Stushar@ece.gatech.edu#include "mem/ruby/common/NetDest.hh" 4111666Stushar@ece.gatech.edu#include "mem/ruby/network/MessageBuffer.hh" 4211666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/CommonTypes.hh" 4311666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/CreditLink.hh" 4411666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/GarnetLink.hh" 4511666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/NetworkInterface.hh" 4611666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/NetworkLink.hh" 4711666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/Router.hh" 4811666Stushar@ece.gatech.edu#include "mem/ruby/system/RubySystem.hh" 4911666Stushar@ece.gatech.edu 5011666Stushar@ece.gatech.eduusing namespace std; 5111666Stushar@ece.gatech.eduusing m5::stl_helpers::deletePointers; 5211666Stushar@ece.gatech.edu 5311666Stushar@ece.gatech.edu/* 5411666Stushar@ece.gatech.edu * GarnetNetwork sets up the routers and links and collects stats. 5511666Stushar@ece.gatech.edu * Default parameters (GarnetNetwork.py) can be overwritten from command line 5611666Stushar@ece.gatech.edu * (see configs/network/Network.py) 5711666Stushar@ece.gatech.edu */ 5811666Stushar@ece.gatech.edu 5911666Stushar@ece.gatech.eduGarnetNetwork::GarnetNetwork(const Params *p) 6011666Stushar@ece.gatech.edu : Network(p) 6111666Stushar@ece.gatech.edu{ 6211666Stushar@ece.gatech.edu m_num_rows = p->num_rows; 6311666Stushar@ece.gatech.edu m_ni_flit_size = p->ni_flit_size; 6411666Stushar@ece.gatech.edu m_vcs_per_vnet = p->vcs_per_vnet; 6511666Stushar@ece.gatech.edu m_buffers_per_data_vc = p->buffers_per_data_vc; 6611666Stushar@ece.gatech.edu m_buffers_per_ctrl_vc = p->buffers_per_ctrl_vc; 6711666Stushar@ece.gatech.edu m_routing_algorithm = p->routing_algorithm; 6811666Stushar@ece.gatech.edu 6911666Stushar@ece.gatech.edu m_enable_fault_model = p->enable_fault_model; 7011666Stushar@ece.gatech.edu if (m_enable_fault_model) 7111666Stushar@ece.gatech.edu fault_model = p->fault_model; 7211666Stushar@ece.gatech.edu 7311666Stushar@ece.gatech.edu m_vnet_type.resize(m_virtual_networks); 7411666Stushar@ece.gatech.edu 7511666Stushar@ece.gatech.edu for (int i = 0 ; i < m_virtual_networks ; i++) { 7611666Stushar@ece.gatech.edu if (m_vnet_type_names[i] == "response") 7711666Stushar@ece.gatech.edu m_vnet_type[i] = DATA_VNET_; // carries data (and ctrl) packets 7811666Stushar@ece.gatech.edu else 7911666Stushar@ece.gatech.edu m_vnet_type[i] = CTRL_VNET_; // carries only ctrl packets 8011666Stushar@ece.gatech.edu } 8111666Stushar@ece.gatech.edu 8211666Stushar@ece.gatech.edu // record the routers 8311666Stushar@ece.gatech.edu for (vector<BasicRouter*>::const_iterator i = p->routers.begin(); 8411666Stushar@ece.gatech.edu i != p->routers.end(); ++i) { 8511666Stushar@ece.gatech.edu Router* router = safe_cast<Router*>(*i); 8611666Stushar@ece.gatech.edu m_routers.push_back(router); 8711666Stushar@ece.gatech.edu 8811666Stushar@ece.gatech.edu // initialize the router's network pointers 8911666Stushar@ece.gatech.edu router->init_net_ptr(this); 9011666Stushar@ece.gatech.edu } 9111666Stushar@ece.gatech.edu 9211666Stushar@ece.gatech.edu // record the network interfaces 9311666Stushar@ece.gatech.edu for (vector<ClockedObject*>::const_iterator i = p->netifs.begin(); 9411666Stushar@ece.gatech.edu i != p->netifs.end(); ++i) { 9511666Stushar@ece.gatech.edu NetworkInterface *ni = safe_cast<NetworkInterface *>(*i); 9611666Stushar@ece.gatech.edu m_nis.push_back(ni); 9711666Stushar@ece.gatech.edu ni->init_net_ptr(this); 9811666Stushar@ece.gatech.edu } 9911666Stushar@ece.gatech.edu} 10011666Stushar@ece.gatech.edu 10111666Stushar@ece.gatech.eduvoid 10211666Stushar@ece.gatech.eduGarnetNetwork::init() 10311666Stushar@ece.gatech.edu{ 10411666Stushar@ece.gatech.edu Network::init(); 10511666Stushar@ece.gatech.edu 10611666Stushar@ece.gatech.edu for (int i=0; i < m_nodes; i++) { 10711666Stushar@ece.gatech.edu m_nis[i]->addNode(m_toNetQueues[i], m_fromNetQueues[i]); 10811666Stushar@ece.gatech.edu } 10911666Stushar@ece.gatech.edu 11011666Stushar@ece.gatech.edu // The topology pointer should have already been initialized in the 11111666Stushar@ece.gatech.edu // parent network constructor 11211666Stushar@ece.gatech.edu assert(m_topology_ptr != NULL); 11311666Stushar@ece.gatech.edu m_topology_ptr->createLinks(this); 11411666Stushar@ece.gatech.edu 11511666Stushar@ece.gatech.edu // Initialize topology specific parameters 11611666Stushar@ece.gatech.edu if (getNumRows() > 0) { 11711666Stushar@ece.gatech.edu // Only for Mesh topology 11811666Stushar@ece.gatech.edu // m_num_rows and m_num_cols are only used for 11911666Stushar@ece.gatech.edu // implementing XY or custom routing in RoutingUnit.cc 12011666Stushar@ece.gatech.edu m_num_rows = getNumRows(); 12111666Stushar@ece.gatech.edu m_num_cols = m_routers.size() / m_num_rows; 12211666Stushar@ece.gatech.edu assert(m_num_rows * m_num_cols == m_routers.size()); 12311666Stushar@ece.gatech.edu } else { 12411666Stushar@ece.gatech.edu m_num_rows = -1; 12511666Stushar@ece.gatech.edu m_num_cols = -1; 12611666Stushar@ece.gatech.edu } 12711666Stushar@ece.gatech.edu 12811666Stushar@ece.gatech.edu // FaultModel: declare each router to the fault model 12911666Stushar@ece.gatech.edu if (isFaultModelEnabled()) { 13011666Stushar@ece.gatech.edu for (vector<Router*>::const_iterator i= m_routers.begin(); 13111666Stushar@ece.gatech.edu i != m_routers.end(); ++i) { 13211666Stushar@ece.gatech.edu Router* router = safe_cast<Router*>(*i); 13311666Stushar@ece.gatech.edu int router_id M5_VAR_USED = 13411666Stushar@ece.gatech.edu fault_model->declare_router(router->get_num_inports(), 13511666Stushar@ece.gatech.edu router->get_num_outports(), 13611666Stushar@ece.gatech.edu router->get_vc_per_vnet(), 13711666Stushar@ece.gatech.edu getBuffersPerDataVC(), 13811666Stushar@ece.gatech.edu getBuffersPerCtrlVC()); 13911666Stushar@ece.gatech.edu assert(router_id == router->get_id()); 14011666Stushar@ece.gatech.edu router->printAggregateFaultProbability(cout); 14111666Stushar@ece.gatech.edu router->printFaultVector(cout); 14211666Stushar@ece.gatech.edu } 14311666Stushar@ece.gatech.edu } 14411666Stushar@ece.gatech.edu} 14511666Stushar@ece.gatech.edu 14611666Stushar@ece.gatech.eduGarnetNetwork::~GarnetNetwork() 14711666Stushar@ece.gatech.edu{ 14811666Stushar@ece.gatech.edu deletePointers(m_routers); 14911666Stushar@ece.gatech.edu deletePointers(m_nis); 15011666Stushar@ece.gatech.edu deletePointers(m_networklinks); 15111666Stushar@ece.gatech.edu deletePointers(m_creditlinks); 15211666Stushar@ece.gatech.edu} 15311666Stushar@ece.gatech.edu 15411666Stushar@ece.gatech.edu/* 15511666Stushar@ece.gatech.edu * This function creates a link from the Network Interface (NI) 15611666Stushar@ece.gatech.edu * into the Network. 15711666Stushar@ece.gatech.edu * It creates a Network Link from the NI to a Router and a Credit Link from 15811666Stushar@ece.gatech.edu * the Router to the NI 15911666Stushar@ece.gatech.edu*/ 16011666Stushar@ece.gatech.edu 16111666Stushar@ece.gatech.eduvoid 16211666Stushar@ece.gatech.eduGarnetNetwork::makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, 16311666Stushar@ece.gatech.edu const NetDest& routing_table_entry) 16411666Stushar@ece.gatech.edu{ 16511666Stushar@ece.gatech.edu assert(src < m_nodes); 16611666Stushar@ece.gatech.edu 16711666Stushar@ece.gatech.edu GarnetExtLink* garnet_link = safe_cast<GarnetExtLink*>(link); 16811666Stushar@ece.gatech.edu 16911666Stushar@ece.gatech.edu // GarnetExtLink is bi-directional 17011666Stushar@ece.gatech.edu NetworkLink* net_link = garnet_link->m_network_links[LinkDirection_In]; 17111666Stushar@ece.gatech.edu net_link->setType(EXT_IN_); 17211666Stushar@ece.gatech.edu CreditLink* credit_link = garnet_link->m_credit_links[LinkDirection_In]; 17311666Stushar@ece.gatech.edu 17411666Stushar@ece.gatech.edu m_networklinks.push_back(net_link); 17511666Stushar@ece.gatech.edu m_creditlinks.push_back(credit_link); 17611666Stushar@ece.gatech.edu 17711666Stushar@ece.gatech.edu PortDirection dst_inport_dirn = "Local"; 17811666Stushar@ece.gatech.edu m_routers[dest]->addInPort(dst_inport_dirn, net_link, credit_link); 17911666Stushar@ece.gatech.edu m_nis[src]->addOutPort(net_link, credit_link, dest); 18011666Stushar@ece.gatech.edu} 18111666Stushar@ece.gatech.edu 18211666Stushar@ece.gatech.edu/* 18311666Stushar@ece.gatech.edu * This function creates a link from the Network to a NI. 18411666Stushar@ece.gatech.edu * It creates a Network Link from a Router to the NI and 18511666Stushar@ece.gatech.edu * a Credit Link from NI to the Router 18611666Stushar@ece.gatech.edu*/ 18711666Stushar@ece.gatech.edu 18811666Stushar@ece.gatech.eduvoid 18911666Stushar@ece.gatech.eduGarnetNetwork::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link, 19011666Stushar@ece.gatech.edu const NetDest& routing_table_entry) 19111666Stushar@ece.gatech.edu{ 19211666Stushar@ece.gatech.edu assert(dest < m_nodes); 19311666Stushar@ece.gatech.edu assert(src < m_routers.size()); 19411666Stushar@ece.gatech.edu assert(m_routers[src] != NULL); 19511666Stushar@ece.gatech.edu 19611666Stushar@ece.gatech.edu GarnetExtLink* garnet_link = safe_cast<GarnetExtLink*>(link); 19711666Stushar@ece.gatech.edu 19811666Stushar@ece.gatech.edu // GarnetExtLink is bi-directional 19911666Stushar@ece.gatech.edu NetworkLink* net_link = garnet_link->m_network_links[LinkDirection_Out]; 20011666Stushar@ece.gatech.edu net_link->setType(EXT_OUT_); 20111666Stushar@ece.gatech.edu CreditLink* credit_link = garnet_link->m_credit_links[LinkDirection_Out]; 20211666Stushar@ece.gatech.edu 20311666Stushar@ece.gatech.edu m_networklinks.push_back(net_link); 20411666Stushar@ece.gatech.edu m_creditlinks.push_back(credit_link); 20511666Stushar@ece.gatech.edu 20611666Stushar@ece.gatech.edu PortDirection src_outport_dirn = "Local"; 20711666Stushar@ece.gatech.edu m_routers[src]->addOutPort(src_outport_dirn, net_link, 20811666Stushar@ece.gatech.edu routing_table_entry, 20911666Stushar@ece.gatech.edu link->m_weight, credit_link); 21011666Stushar@ece.gatech.edu m_nis[dest]->addInPort(net_link, credit_link); 21111666Stushar@ece.gatech.edu} 21211666Stushar@ece.gatech.edu 21311666Stushar@ece.gatech.edu/* 21411666Stushar@ece.gatech.edu * This function creates an internal network link between two routers. 21511666Stushar@ece.gatech.edu * It adds both the network link and an opposite credit link. 21611666Stushar@ece.gatech.edu*/ 21711666Stushar@ece.gatech.edu 21811666Stushar@ece.gatech.eduvoid 21911666Stushar@ece.gatech.eduGarnetNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 22011666Stushar@ece.gatech.edu const NetDest& routing_table_entry, 22111666Stushar@ece.gatech.edu PortDirection src_outport_dirn, 22211666Stushar@ece.gatech.edu PortDirection dst_inport_dirn) 22311666Stushar@ece.gatech.edu{ 22411666Stushar@ece.gatech.edu GarnetIntLink* garnet_link = safe_cast<GarnetIntLink*>(link); 22511666Stushar@ece.gatech.edu 22611666Stushar@ece.gatech.edu // GarnetIntLink is unidirectional 22711666Stushar@ece.gatech.edu NetworkLink* net_link = garnet_link->m_network_link; 22811666Stushar@ece.gatech.edu net_link->setType(INT_); 22911666Stushar@ece.gatech.edu CreditLink* credit_link = garnet_link->m_credit_link; 23011666Stushar@ece.gatech.edu 23111666Stushar@ece.gatech.edu m_networklinks.push_back(net_link); 23211666Stushar@ece.gatech.edu m_creditlinks.push_back(credit_link); 23311666Stushar@ece.gatech.edu 23411666Stushar@ece.gatech.edu m_routers[dest]->addInPort(dst_inport_dirn, net_link, credit_link); 23511666Stushar@ece.gatech.edu m_routers[src]->addOutPort(src_outport_dirn, net_link, 23611666Stushar@ece.gatech.edu routing_table_entry, 23711666Stushar@ece.gatech.edu link->m_weight, credit_link); 23811666Stushar@ece.gatech.edu} 23911666Stushar@ece.gatech.edu 24011666Stushar@ece.gatech.edu// Total routers in the network 24111666Stushar@ece.gatech.eduint 24211666Stushar@ece.gatech.eduGarnetNetwork::getNumRouters() 24311666Stushar@ece.gatech.edu{ 24411666Stushar@ece.gatech.edu return m_routers.size(); 24511666Stushar@ece.gatech.edu} 24611666Stushar@ece.gatech.edu 24711666Stushar@ece.gatech.edu// Get ID of router connected to a NI. 24811666Stushar@ece.gatech.eduint 24911666Stushar@ece.gatech.eduGarnetNetwork::get_router_id(int ni) 25011666Stushar@ece.gatech.edu{ 25111666Stushar@ece.gatech.edu return m_nis[ni]->get_router_id(); 25211666Stushar@ece.gatech.edu} 25311666Stushar@ece.gatech.edu 25411666Stushar@ece.gatech.eduvoid 25511666Stushar@ece.gatech.eduGarnetNetwork::regStats() 25611666Stushar@ece.gatech.edu{ 25711666Stushar@ece.gatech.edu Network::regStats(); 25811666Stushar@ece.gatech.edu 25911666Stushar@ece.gatech.edu // Packets 26011666Stushar@ece.gatech.edu m_packets_received 26111666Stushar@ece.gatech.edu .init(m_virtual_networks) 26211666Stushar@ece.gatech.edu .name(name() + ".packets_received") 26311666Stushar@ece.gatech.edu .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) 26411666Stushar@ece.gatech.edu ; 26511666Stushar@ece.gatech.edu 26611666Stushar@ece.gatech.edu m_packets_injected 26711666Stushar@ece.gatech.edu .init(m_virtual_networks) 26811666Stushar@ece.gatech.edu .name(name() + ".packets_injected") 26911666Stushar@ece.gatech.edu .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) 27011666Stushar@ece.gatech.edu ; 27111666Stushar@ece.gatech.edu 27211666Stushar@ece.gatech.edu m_packet_network_latency 27311666Stushar@ece.gatech.edu .init(m_virtual_networks) 27411666Stushar@ece.gatech.edu .name(name() + ".packet_network_latency") 27511666Stushar@ece.gatech.edu .flags(Stats::oneline) 27611666Stushar@ece.gatech.edu ; 27711666Stushar@ece.gatech.edu 27811666Stushar@ece.gatech.edu m_packet_queueing_latency 27911666Stushar@ece.gatech.edu .init(m_virtual_networks) 28011666Stushar@ece.gatech.edu .name(name() + ".packet_queueing_latency") 28111666Stushar@ece.gatech.edu .flags(Stats::oneline) 28211666Stushar@ece.gatech.edu ; 28311666Stushar@ece.gatech.edu 28411666Stushar@ece.gatech.edu for (int i = 0; i < m_virtual_networks; i++) { 28511666Stushar@ece.gatech.edu m_packets_received.subname(i, csprintf("vnet-%i", i)); 28611666Stushar@ece.gatech.edu m_packets_injected.subname(i, csprintf("vnet-%i", i)); 28711666Stushar@ece.gatech.edu m_packet_network_latency.subname(i, csprintf("vnet-%i", i)); 28811666Stushar@ece.gatech.edu m_packet_queueing_latency.subname(i, csprintf("vnet-%i", i)); 28911666Stushar@ece.gatech.edu } 29011666Stushar@ece.gatech.edu 29111666Stushar@ece.gatech.edu m_avg_packet_vnet_latency 29211666Stushar@ece.gatech.edu .name(name() + ".average_packet_vnet_latency") 29311666Stushar@ece.gatech.edu .flags(Stats::oneline); 29411666Stushar@ece.gatech.edu m_avg_packet_vnet_latency = 29511666Stushar@ece.gatech.edu m_packet_network_latency / m_packets_received; 29611666Stushar@ece.gatech.edu 29711666Stushar@ece.gatech.edu m_avg_packet_vqueue_latency 29811666Stushar@ece.gatech.edu .name(name() + ".average_packet_vqueue_latency") 29911666Stushar@ece.gatech.edu .flags(Stats::oneline); 30011666Stushar@ece.gatech.edu m_avg_packet_vqueue_latency = 30111666Stushar@ece.gatech.edu m_packet_queueing_latency / m_packets_received; 30211666Stushar@ece.gatech.edu 30311666Stushar@ece.gatech.edu m_avg_packet_network_latency 30411666Stushar@ece.gatech.edu .name(name() + ".average_packet_network_latency"); 30511666Stushar@ece.gatech.edu m_avg_packet_network_latency = 30611666Stushar@ece.gatech.edu sum(m_packet_network_latency) / sum(m_packets_received); 30711666Stushar@ece.gatech.edu 30811666Stushar@ece.gatech.edu m_avg_packet_queueing_latency 30911666Stushar@ece.gatech.edu .name(name() + ".average_packet_queueing_latency"); 31011666Stushar@ece.gatech.edu m_avg_packet_queueing_latency 31111666Stushar@ece.gatech.edu = sum(m_packet_queueing_latency) / sum(m_packets_received); 31211666Stushar@ece.gatech.edu 31311666Stushar@ece.gatech.edu m_avg_packet_latency 31411666Stushar@ece.gatech.edu .name(name() + ".average_packet_latency"); 31511666Stushar@ece.gatech.edu m_avg_packet_latency 31611666Stushar@ece.gatech.edu = m_avg_packet_network_latency + m_avg_packet_queueing_latency; 31711666Stushar@ece.gatech.edu 31811666Stushar@ece.gatech.edu // Flits 31911666Stushar@ece.gatech.edu m_flits_received 32011666Stushar@ece.gatech.edu .init(m_virtual_networks) 32111666Stushar@ece.gatech.edu .name(name() + ".flits_received") 32211666Stushar@ece.gatech.edu .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) 32311666Stushar@ece.gatech.edu ; 32411666Stushar@ece.gatech.edu 32511666Stushar@ece.gatech.edu m_flits_injected 32611666Stushar@ece.gatech.edu .init(m_virtual_networks) 32711666Stushar@ece.gatech.edu .name(name() + ".flits_injected") 32811666Stushar@ece.gatech.edu .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) 32911666Stushar@ece.gatech.edu ; 33011666Stushar@ece.gatech.edu 33111666Stushar@ece.gatech.edu m_flit_network_latency 33211666Stushar@ece.gatech.edu .init(m_virtual_networks) 33311666Stushar@ece.gatech.edu .name(name() + ".flit_network_latency") 33411666Stushar@ece.gatech.edu .flags(Stats::oneline) 33511666Stushar@ece.gatech.edu ; 33611666Stushar@ece.gatech.edu 33711666Stushar@ece.gatech.edu m_flit_queueing_latency 33811666Stushar@ece.gatech.edu .init(m_virtual_networks) 33911666Stushar@ece.gatech.edu .name(name() + ".flit_queueing_latency") 34011666Stushar@ece.gatech.edu .flags(Stats::oneline) 34111666Stushar@ece.gatech.edu ; 34211666Stushar@ece.gatech.edu 34311666Stushar@ece.gatech.edu for (int i = 0; i < m_virtual_networks; i++) { 34411666Stushar@ece.gatech.edu m_flits_received.subname(i, csprintf("vnet-%i", i)); 34511666Stushar@ece.gatech.edu m_flits_injected.subname(i, csprintf("vnet-%i", i)); 34611666Stushar@ece.gatech.edu m_flit_network_latency.subname(i, csprintf("vnet-%i", i)); 34711666Stushar@ece.gatech.edu m_flit_queueing_latency.subname(i, csprintf("vnet-%i", i)); 34811666Stushar@ece.gatech.edu } 34911666Stushar@ece.gatech.edu 35011666Stushar@ece.gatech.edu m_avg_flit_vnet_latency 35111666Stushar@ece.gatech.edu .name(name() + ".average_flit_vnet_latency") 35211666Stushar@ece.gatech.edu .flags(Stats::oneline); 35311666Stushar@ece.gatech.edu m_avg_flit_vnet_latency = m_flit_network_latency / m_flits_received; 35411666Stushar@ece.gatech.edu 35511666Stushar@ece.gatech.edu m_avg_flit_vqueue_latency 35611666Stushar@ece.gatech.edu .name(name() + ".average_flit_vqueue_latency") 35711666Stushar@ece.gatech.edu .flags(Stats::oneline); 35811666Stushar@ece.gatech.edu m_avg_flit_vqueue_latency = 35911666Stushar@ece.gatech.edu m_flit_queueing_latency / m_flits_received; 36011666Stushar@ece.gatech.edu 36111666Stushar@ece.gatech.edu m_avg_flit_network_latency 36211666Stushar@ece.gatech.edu .name(name() + ".average_flit_network_latency"); 36311666Stushar@ece.gatech.edu m_avg_flit_network_latency = 36411666Stushar@ece.gatech.edu sum(m_flit_network_latency) / sum(m_flits_received); 36511666Stushar@ece.gatech.edu 36611666Stushar@ece.gatech.edu m_avg_flit_queueing_latency 36711666Stushar@ece.gatech.edu .name(name() + ".average_flit_queueing_latency"); 36811666Stushar@ece.gatech.edu m_avg_flit_queueing_latency = 36911666Stushar@ece.gatech.edu sum(m_flit_queueing_latency) / sum(m_flits_received); 37011666Stushar@ece.gatech.edu 37111666Stushar@ece.gatech.edu m_avg_flit_latency 37211666Stushar@ece.gatech.edu .name(name() + ".average_flit_latency"); 37311666Stushar@ece.gatech.edu m_avg_flit_latency = 37411666Stushar@ece.gatech.edu m_avg_flit_network_latency + m_avg_flit_queueing_latency; 37511666Stushar@ece.gatech.edu 37611666Stushar@ece.gatech.edu 37711666Stushar@ece.gatech.edu // Hops 37811666Stushar@ece.gatech.edu m_avg_hops.name(name() + ".average_hops"); 37911666Stushar@ece.gatech.edu m_avg_hops = m_total_hops / sum(m_flits_received); 38011666Stushar@ece.gatech.edu 38111666Stushar@ece.gatech.edu // Links 38211666Stushar@ece.gatech.edu m_total_ext_in_link_utilization 38311666Stushar@ece.gatech.edu .name(name() + ".ext_in_link_utilization"); 38411666Stushar@ece.gatech.edu m_total_ext_out_link_utilization 38511666Stushar@ece.gatech.edu .name(name() + ".ext_out_link_utilization"); 38611666Stushar@ece.gatech.edu m_total_int_link_utilization 38711666Stushar@ece.gatech.edu .name(name() + ".int_link_utilization"); 38811666Stushar@ece.gatech.edu m_average_link_utilization 38911666Stushar@ece.gatech.edu .name(name() + ".avg_link_utilization"); 39011666Stushar@ece.gatech.edu 39111666Stushar@ece.gatech.edu m_average_vc_load 39211666Stushar@ece.gatech.edu .init(m_virtual_networks * m_vcs_per_vnet) 39311666Stushar@ece.gatech.edu .name(name() + ".avg_vc_load") 39411666Stushar@ece.gatech.edu .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) 39511666Stushar@ece.gatech.edu ; 39611666Stushar@ece.gatech.edu} 39711666Stushar@ece.gatech.edu 39811666Stushar@ece.gatech.eduvoid 39911666Stushar@ece.gatech.eduGarnetNetwork::collateStats() 40011666Stushar@ece.gatech.edu{ 40111666Stushar@ece.gatech.edu RubySystem *rs = params()->ruby_system; 40211666Stushar@ece.gatech.edu double time_delta = double(curCycle() - rs->getStartCycle()); 40311666Stushar@ece.gatech.edu 40411666Stushar@ece.gatech.edu for (int i = 0; i < m_networklinks.size(); i++) { 40511666Stushar@ece.gatech.edu link_type type = m_networklinks[i]->getType(); 40611666Stushar@ece.gatech.edu int activity = m_networklinks[i]->getLinkUtilization(); 40711666Stushar@ece.gatech.edu 40811666Stushar@ece.gatech.edu if (type == EXT_IN_) 40911666Stushar@ece.gatech.edu m_total_ext_in_link_utilization += activity; 41011666Stushar@ece.gatech.edu else if (type == EXT_OUT_) 41111666Stushar@ece.gatech.edu m_total_ext_out_link_utilization += activity; 41211666Stushar@ece.gatech.edu else if (type == INT_) 41311666Stushar@ece.gatech.edu m_total_int_link_utilization += activity; 41411666Stushar@ece.gatech.edu 41511666Stushar@ece.gatech.edu m_average_link_utilization += 41611666Stushar@ece.gatech.edu (double(activity) / time_delta); 41711666Stushar@ece.gatech.edu 41811666Stushar@ece.gatech.edu vector<unsigned int> vc_load = m_networklinks[i]->getVcLoad(); 41911666Stushar@ece.gatech.edu for (int j = 0; j < vc_load.size(); j++) { 42011666Stushar@ece.gatech.edu m_average_vc_load[j] += ((double)vc_load[j] / time_delta); 42111666Stushar@ece.gatech.edu } 42211666Stushar@ece.gatech.edu } 42311666Stushar@ece.gatech.edu 42411666Stushar@ece.gatech.edu // Ask the routers to collate their statistics 42511666Stushar@ece.gatech.edu for (int i = 0; i < m_routers.size(); i++) { 42611666Stushar@ece.gatech.edu m_routers[i]->collateStats(); 42711666Stushar@ece.gatech.edu } 42811666Stushar@ece.gatech.edu} 42911666Stushar@ece.gatech.edu 43011666Stushar@ece.gatech.eduvoid 43111666Stushar@ece.gatech.eduGarnetNetwork::print(ostream& out) const 43211666Stushar@ece.gatech.edu{ 43311666Stushar@ece.gatech.edu out << "[GarnetNetwork]"; 43411666Stushar@ece.gatech.edu} 43511666Stushar@ece.gatech.edu 43611666Stushar@ece.gatech.eduGarnetNetwork * 43711666Stushar@ece.gatech.eduGarnetNetworkParams::create() 43811666Stushar@ece.gatech.edu{ 43911666Stushar@ece.gatech.edu return new GarnetNetwork(this); 44011666Stushar@ece.gatech.edu} 44111666Stushar@ece.gatech.edu 44211666Stushar@ece.gatech.eduuint32_t 44311666Stushar@ece.gatech.eduGarnetNetwork::functionalWrite(Packet *pkt) 44411666Stushar@ece.gatech.edu{ 44511666Stushar@ece.gatech.edu uint32_t num_functional_writes = 0; 44611666Stushar@ece.gatech.edu 44711666Stushar@ece.gatech.edu for (unsigned int i = 0; i < m_routers.size(); i++) { 44811666Stushar@ece.gatech.edu num_functional_writes += m_routers[i]->functionalWrite(pkt); 44911666Stushar@ece.gatech.edu } 45011666Stushar@ece.gatech.edu 45111666Stushar@ece.gatech.edu for (unsigned int i = 0; i < m_nis.size(); ++i) { 45211666Stushar@ece.gatech.edu num_functional_writes += m_nis[i]->functionalWrite(pkt); 45311666Stushar@ece.gatech.edu } 45411666Stushar@ece.gatech.edu 45511666Stushar@ece.gatech.edu for (unsigned int i = 0; i < m_networklinks.size(); ++i) { 45611666Stushar@ece.gatech.edu num_functional_writes += m_networklinks[i]->functionalWrite(pkt); 45711666Stushar@ece.gatech.edu } 45811666Stushar@ece.gatech.edu 45911666Stushar@ece.gatech.edu return num_functional_writes; 46011666Stushar@ece.gatech.edu} 461