changeset c739a3a829f5 in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=c739a3a829f5 description: Garnet: Stats at vnet granularity + code cleanup
This patch (1) Moves redundant code from fixed and flexible networks to BaseGarnetNetwork. (2) Prints network stats at vnet granularity. diffstat: src/mem/ruby/network/garnet/BaseGarnetNetwork.cc | 96 +++++++++- src/mem/ruby/network/garnet/BaseGarnetNetwork.hh | 42 +++- src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc | 56 +---- src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh | 30 +-- src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc | 9 +- src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc | 72 ++----- src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh | 38 +--- src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc | 9 +- 8 files changed, 179 insertions(+), 173 deletions(-) diffs (truncated from 573 to 300 lines): diff -r 75b524b64c28 -r c739a3a829f5 src/mem/ruby/network/garnet/BaseGarnetNetwork.cc --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc Mon Mar 19 06:36:09 2012 -0400 +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc Mon Mar 19 17:34:17 2012 -0400 @@ -43,10 +43,6 @@ fault_model = p->fault_model; m_ruby_start = 0; - m_flits_received = 0; - m_flits_injected = 0; - m_network_latency = 0.0; - m_queueing_latency = 0.0; // Currently Garnet only supports uniform bandwidth for all // links and network interfaces. @@ -77,9 +73,17 @@ m_in_use.resize(m_virtual_networks); m_ordered.resize(m_virtual_networks); + m_flits_received.resize(m_virtual_networks); + m_flits_injected.resize(m_virtual_networks); + m_network_latency.resize(m_virtual_networks); + m_queueing_latency.resize(m_virtual_networks); for (int i = 0; i < m_virtual_networks; i++) { m_in_use[i] = false; m_ordered[i] = false; + m_flits_received[i] = 0; + m_flits_injected[i] = 0; + m_network_latency[i] = 0.0; + m_queueing_latency[i] = 0.0; } for (int node = 0; node < m_nodes; node++) { @@ -101,3 +105,87 @@ { Network::init(); } + +MessageBuffer* +BaseGarnetNetwork::getToNetQueue(NodeID id, bool ordered, int network_num, + string vnet_type) +{ + checkNetworkAllocation(id, ordered, network_num, vnet_type); + return m_toNetQueues[id][network_num]; +} + +MessageBuffer* +BaseGarnetNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num, + string vnet_type) +{ + checkNetworkAllocation(id, ordered, network_num, vnet_type); + return m_fromNetQueues[id][network_num]; +} + +void +BaseGarnetNetwork::clearStats() +{ + m_ruby_start = g_eventQueue_ptr->getTime(); +} + +Time +BaseGarnetNetwork::getRubyStartTime() +{ + return m_ruby_start; +} + +void +BaseGarnetNetwork::printStats(ostream& out) const +{ + out << endl; + out << "Network Stats" << endl; + out << "-------------" << endl; + out << endl; + printPerformanceStats(out); + printLinkStats(out); + printPowerStats(out); + m_topology_ptr->printStats(out); +} + +void +BaseGarnetNetwork::printPerformanceStats(ostream& out) const +{ + int total_flits_injected = 0; + int total_flits_received = 0; + int total_network_latency = 0.0; + int total_queueing_latency = 0.0; + + for (int i = 0; i < m_virtual_networks; i++) { + if (!m_in_use[i]) + continue; + + out << "[Vnet " << i << "]: flits injected = " + << m_flits_injected[i] << endl; + out << "[Vnet " << i << "]: flits received = " + << m_flits_received[i] << endl; + out << "[Vnet " << i << "]: average network latency = " + << ((double) m_network_latency[i] / (double) m_flits_received[i]) + << endl; + out << "[Vnet " << i << "]: average queueing (at source NI) latency = " + << ((double) m_queueing_latency[i] / (double) m_flits_received[i]) + << endl; + + out << endl; + total_flits_injected += m_flits_injected[i]; + total_flits_received += m_flits_received[i]; + total_network_latency += m_network_latency[i]; + total_queueing_latency += m_queueing_latency[i]; + } + out << "Total flits injected = " << total_flits_injected << endl; + out << "Total flits received = " << total_flits_received << endl; + out << "Average network latency = " + << ((double) total_network_latency/ (double) total_flits_received) << endl; + out << "Average queueing (at source NI) latency = " + << ((double) total_queueing_latency/ (double) total_flits_received) << endl; + out << "Average latency = " + << ((double) (total_queueing_latency + total_network_latency) / + (double) total_flits_received)<< endl; + out << "-------------" << endl; + out << endl; +} + diff -r 75b524b64c28 -r c739a3a829f5 src/mem/ruby/network/garnet/BaseGarnetNetwork.hh --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh Mon Mar 19 06:36:09 2012 -0400 +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh Mon Mar 19 17:34:17 2012 -0400 @@ -54,15 +54,49 @@ bool isFaultModelEnabled() {return m_enable_fault_model;} FaultModel* fault_model; + void increment_injected_flits(int vnet) { m_flits_injected[vnet]++; } + void increment_received_flits(int vnet) { m_flits_received[vnet]++; } + + void + increment_network_latency(Time latency, int vnet) + { + m_network_latency[vnet] += latency; + } + + void + increment_queueing_latency(Time latency, int vnet) + { + m_queueing_latency[vnet] += latency; + } + + // returns the queue requested for the given component + MessageBuffer* getToNetQueue(NodeID id, bool ordered, int network_num, + std::string vnet_type); + MessageBuffer* getFromNetQueue(NodeID id, bool ordered, int network_num, + std::string vnet_type); + + + bool isVNetOrdered(int vnet) { return m_ordered[vnet]; } + bool validVirtualNetwork(int vnet) { return m_in_use[vnet]; } + virtual void checkNetworkAllocation(NodeID id, bool ordered, + int network_num, std::string vnet_type) = 0; + + Time getRubyStartTime(); + void clearStats(); + void printStats(std::ostream& out) const; + void printPerformanceStats(std::ostream& out) const; + virtual void printLinkStats(std::ostream& out) const = 0; + virtual void printPowerStats(std::ostream& out) const = 0; + protected: int m_ni_flit_size; int m_vcs_per_vnet; bool m_enable_fault_model; - int m_flits_received; - int m_flits_injected; - double m_network_latency; - double m_queueing_latency; + std::vector<int> m_flits_received; + std::vector<int> m_flits_injected; + std::vector<double> m_network_latency; + std::vector<double> m_queueing_latency; std::vector<bool> m_in_use; std::vector<bool> m_ordered; diff -r 75b524b64c28 -r c739a3a829f5 src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Mon Mar 19 06:36:09 2012 -0400 +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Mon Mar 19 17:34:17 2012 -0400 @@ -257,50 +257,18 @@ m_vnet_type[network_num] = CTRL_VNET_; // carries only ctrl packets } -MessageBuffer* -GarnetNetwork_d::getToNetQueue(NodeID id, bool ordered, int network_num, - string vnet_type) -{ - checkNetworkAllocation(id, ordered, network_num, vnet_type); - return m_toNetQueues[id][network_num]; -} - -MessageBuffer* -GarnetNetwork_d::getFromNetQueue(NodeID id, bool ordered, int network_num, - string vnet_type) -{ - checkNetworkAllocation(id, ordered, network_num, vnet_type); - return m_fromNetQueues[id][network_num]; -} - void -GarnetNetwork_d::clearStats() -{ - m_ruby_start = g_eventQueue_ptr->getTime(); -} - -Time -GarnetNetwork_d::getRubyStartTime() -{ - return m_ruby_start; -} - -void -GarnetNetwork_d::printStats(ostream& out) const +GarnetNetwork_d::printLinkStats(ostream& out) const { double average_link_utilization = 0; vector<double> average_vc_load; average_vc_load.resize(m_virtual_networks*m_vcs_per_vnet); - for (int i = 0; i < m_virtual_networks*m_vcs_per_vnet; i++) - { + for (int i = 0; i < m_virtual_networks*m_vcs_per_vnet; i++) { average_vc_load[i] = 0; } out << endl; - out << "Network Stats" << endl; - out << "-------------" << endl; - out << endl; for (int i = 0; i < m_link_ptr_vector.size(); i++) { average_link_utilization += (double(m_link_ptr_vector[i]->getLinkUtilization())) / @@ -328,18 +296,14 @@ << " flits/cycle " << endl; } out << "-------------" << endl; + out << endl; +} - out << "Total flits injected = " << m_flits_injected << endl; - out << "Total flits received = " << m_flits_received << endl; - out << "Average network latency = " - << ((double) m_network_latency/ (double) m_flits_received)<< endl; - out << "Average queueing (at source NI) latency = " - << ((double) m_queueing_latency/ (double) m_flits_received)<< endl; - out << "Average latency = " - << ((double) (m_queueing_latency + m_network_latency) / - (double) m_flits_received)<< endl; +void +GarnetNetwork_d::printPowerStats(ostream& out) const +{ + out << "Network Power" << endl; out << "-------------" << endl; - double m_total_link_power = 0.0; double m_dynamic_link_power = 0.0; double m_static_link_power = 0.0; @@ -368,7 +332,7 @@ out << "Router Static Power = " << m_static_router_power << " W" << endl; out << "Total Router Power = " << m_total_router_power << " W " <<endl; out << "-------------" << endl; - m_topology_ptr->printStats(out); + out << endl; } void @@ -377,7 +341,7 @@ out << endl; out << "Network Configuration" << endl; out << "---------------------" << endl; - out << "network: GarnetNetwork_d" << endl; + out << "network: Garnet Fixed Pipeline" << endl; out << "topology: " << m_topology_ptr->getName() << endl; out << endl; diff -r 75b524b64c28 -r c739a3a829f5 src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh Mon Mar 19 06:36:09 2012 -0400 +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh Mon Mar 19 17:34:17 2012 -0400 @@ -63,14 +63,8 @@ int getBuffersPerDataVC() {return m_buffers_per_data_vc; } int getBuffersPerCtrlVC() {return m_buffers_per_ctrl_vc; } - // returns the queue requested for the given component - MessageBuffer* getToNetQueue(NodeID id, bool ordered, int network_num, - std::string vnet_type); - MessageBuffer* getFromNetQueue(NodeID id, bool ordered, int network_num, - std::string vnet_type); - - void clearStats(); - void printStats(std::ostream& out) const; + void printLinkStats(std::ostream& out) const; + void printPowerStats(std::ostream& out) const; void printConfig(std::ostream& out) const; void print(std::ostream& out) const; @@ -81,26 +75,6 @@ return m_vnet_type[vnet]; } _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev