From 90bfbd9793e64b29d09f4ca4ee610ee08f82ea75 Mon Sep 17 00:00:00 2001 From: Nilay Vaish Date: Fri, 6 Sep 2013 16:21:35 -0500 Subject: ruby: network: convert to gem5 style stats --- .../garnet/fixed-pipeline/GarnetNetwork_d.cc | 103 +++++++++++---------- .../garnet/fixed-pipeline/GarnetNetwork_d.hh | 23 ++++- .../network/garnet/fixed-pipeline/InputUnit_d.hh | 21 ++--- .../network/garnet/fixed-pipeline/NetworkLink_d.cc | 12 --- .../network/garnet/fixed-pipeline/NetworkLink_d.hh | 19 ++-- .../ruby/network/garnet/fixed-pipeline/Router_d.cc | 4 +- .../ruby/network/garnet/fixed-pipeline/Router_d.hh | 20 ++-- .../network/garnet/fixed-pipeline/VCallocator_d.hh | 23 ++--- 8 files changed, 114 insertions(+), 111 deletions(-) (limited to 'src/mem/ruby/network/garnet/fixed-pipeline') diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc index 238006881..8db57267e 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc @@ -221,81 +221,82 @@ GarnetNetwork_d::checkNetworkAllocation(NodeID id, bool ordered, } void -GarnetNetwork_d::printLinkStats(ostream& out) const +GarnetNetwork_d::regStats() { - double average_link_utilization = 0; - vector average_vc_load; - average_vc_load.resize(m_virtual_networks*m_vcs_per_vnet); + BaseGarnetNetwork::regStats(); + regLinkStats(); + regPowerStats(); +} - for (int i = 0; i < m_virtual_networks*m_vcs_per_vnet; i++) { - average_vc_load[i] = 0; - } +void +GarnetNetwork_d::regLinkStats() +{ + m_average_link_utilization.name(name() + ".avg_link_utilization"); + + m_average_vc_load + .init(m_virtual_networks * m_vcs_per_vnet) + .name(name() + ".avg_vc_load") + .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) + ; +} + +void +GarnetNetwork_d::regPowerStats() +{ + m_dynamic_link_power.name(name() + ".link_dynamic_power"); + m_static_link_power.name(name() + ".link_static_power"); + + m_total_link_power.name(name() + ".link_total_power"); + m_total_link_power = m_dynamic_link_power + m_static_link_power; + + m_dynamic_router_power.name(name() + ".router_dynamic_power"); + m_static_router_power.name(name() + ".router_static_power"); + m_clk_power.name(name() + ".clk_power"); + + m_total_router_power.name(name() + ".router_total_power"); + m_total_router_power = m_dynamic_router_power + + m_static_router_power + + m_clk_power; +} + +void +GarnetNetwork_d::collateStats() +{ + collateLinkStats(); + collatePowerStats(); +} - out << endl; +void +GarnetNetwork_d::collateLinkStats() +{ for (int i = 0; i < m_links.size(); i++) { - average_link_utilization += + m_average_link_utilization += (double(m_links[i]->getLinkUtilization())) / (double(curCycle() - g_ruby_start)); - vector vc_load = m_links[i]->getVcLoad(); + vector vc_load = m_links[i]->getVcLoad(); for (int j = 0; j < vc_load.size(); j++) { - assert(vc_load.size() == m_vcs_per_vnet*m_virtual_networks); - average_vc_load[j] += vc_load[j]; + m_average_vc_load[j] += + ((double)vc_load[j] / (double)(curCycle() - g_ruby_start)); } } - average_link_utilization = - average_link_utilization/m_links.size(); - out << "Average Link Utilization :: " << average_link_utilization - << " flits/cycle" << endl; - out << "-------------" << endl; - - for (int i = 0; i < m_vcs_per_vnet*m_virtual_networks; i++) { - if (!m_in_use[i/m_vcs_per_vnet]) - continue; - - average_vc_load[i] = (double(average_vc_load[i])) / - (double(curCycle() - g_ruby_start)); - out << "Average VC Load [" << i << "] = " << average_vc_load[i] - << " flits/cycle " << endl; - } - out << "-------------" << endl; - out << endl; } void -GarnetNetwork_d::printPowerStats(ostream& out) const +GarnetNetwork_d::collatePowerStats() { - 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; - double m_total_router_power = 0.0; - double m_dynamic_router_power = 0.0; - double m_static_router_power = 0.0; - double m_clk_power = 0.0; - for (int i = 0; i < m_links.size(); i++) { - m_total_link_power += m_links[i]->calculate_power(); + m_links[i]->calculate_power(); m_dynamic_link_power += m_links[i]->get_dynamic_power(); m_static_link_power += m_links[i]->get_static_power(); } for (int i = 0; i < m_routers.size(); i++) { - m_total_router_power += m_routers[i]->calculate_power(); + m_routers[i]->calculate_power(); m_dynamic_router_power += m_routers[i]->get_dynamic_power(); m_static_router_power += m_routers[i]->get_static_power(); m_clk_power += m_routers[i]->get_clk_power(); } - out << "Link Dynamic Power = " << m_dynamic_link_power << " W" << endl; - out << "Link Static Power = " << m_static_link_power << " W" << endl; - out << "Total Link Power = " << m_total_link_power << " W " << endl; - out << "Router Dynamic Power = " << m_dynamic_router_power << " W" << endl; - out << "Router Clock Power = " << m_clk_power << " W" << endl; - out << "Router Static Power = " << m_static_router_power << " W" << endl; - out << "Total Router Power = " << m_total_router_power << " W " < m_vnet_type; std::vector m_routers; // All Routers in Network @@ -105,6 +110,20 @@ class GarnetNetwork_d : public BaseGarnetNetwork int m_buffers_per_data_vc; int m_buffers_per_ctrl_vc; + + // Statistical variables for power + Stats::Scalar m_dynamic_link_power; + Stats::Scalar m_static_link_power; + Stats::Formula m_total_link_power; + + Stats::Scalar m_dynamic_router_power; + Stats::Scalar m_static_router_power; + Stats::Scalar m_clk_power; + Stats::Formula m_total_router_power; + + // Statistical variables for performance + Stats::Scalar m_average_link_utilization; + Stats::Vector m_average_vc_load; }; inline std::ostream& diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh index 6afb4726b..2c37996b3 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh @@ -161,17 +161,10 @@ class InputUnit_d : public Consumer m_credit_link = credit_link; } - inline double - get_buf_read_count(int vnet) - { - return m_num_buffer_reads[vnet]; - } - - inline double - get_buf_write_count(int vnet) - { - return m_num_buffer_writes[vnet]; - } + double get_buf_read_count(unsigned int vnet) const + { return m_num_buffer_reads[vnet]; } + double get_buf_write_count(unsigned int vnet) const + { return m_num_buffer_writes[vnet]; } uint32_t functionalWrite(Packet *pkt); @@ -179,8 +172,6 @@ class InputUnit_d : public Consumer int m_id; int m_num_vcs; int m_vc_per_vnet; - std::vector m_num_buffer_writes; - std::vector m_num_buffer_reads; Router_d *m_router; NetworkLink_d *m_in_link; @@ -189,6 +180,10 @@ class InputUnit_d : public Consumer // Virtual channels std::vector m_vcs; + + // Statistical variables + std::vector m_num_buffer_writes; + std::vector m_num_buffer_reads; }; #endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_INPUT_UNIT_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc index d84bf8e69..32fce83ce 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc @@ -76,18 +76,6 @@ NetworkLink_d::wakeup() } } -std::vector -NetworkLink_d::getVcLoad() -{ - return m_vc_load; -} - -int -NetworkLink_d::getLinkUtilization() -{ - return m_link_utilized; -} - NetworkLink_d * NetworkLink_dParams::create() { diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh index 9e149392e..fcdd28b67 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh @@ -53,14 +53,15 @@ class NetworkLink_d : public ClockedObject, public Consumer void setLinkConsumer(Consumer *consumer); void setSourceQueue(flitBuffer_d *srcQueue); void print(std::ostream& out) const{} - int getLinkUtilization(); - std::vector getVcLoad(); int get_id(){return m_id;} - double get_dynamic_power(){return m_power_dyn;} - double get_static_power(){return m_power_sta;} void wakeup(); - double calculate_power(); + void calculate_power(); + double get_dynamic_power() const { return m_power_dyn; } + double get_static_power()const { return m_power_sta; } + + unsigned int getLinkUtilization() const { return m_link_utilized; } + const std::vector & getVcLoad() const { return m_vc_load; } inline bool isReady(Cycles curTime) { return linkBuffer->isReady(curTime); } @@ -71,7 +72,7 @@ class NetworkLink_d : public ClockedObject, public Consumer void init_net_ptr(GarnetNetwork_d* net_ptr) { m_net_ptr = net_ptr; } uint32_t functionalWrite(Packet *); - protected: + private: int m_id; Cycles m_latency; int channel_width; @@ -80,10 +81,12 @@ class NetworkLink_d : public ClockedObject, public Consumer flitBuffer_d *linkBuffer; Consumer *link_consumer; flitBuffer_d *link_srcQueue; - int m_link_utilized; - std::vector m_vc_load; int m_flit_width; + // Statistical variables + unsigned int m_link_utilized; + std::vector m_vc_load; + double m_power_dyn; double m_power_sta; }; diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc index fd4ce5389..3370c356c 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc @@ -186,7 +186,7 @@ Router_d::printFaultVector(ostream& out) for (int fault_type_index = 0; fault_type_index < num_fault_types; fault_type_index++){ out << " - probability of ("; - out << + out << m_network_ptr->fault_model->fault_type_to_string(fault_type_index); out << ") = "; out << fault_vector[fault_type_index] << endl; @@ -198,7 +198,7 @@ Router_d::printAggregateFaultProbability(std::ostream& out) { int temperature_celcius = BASELINE_TEMPERATURE_CELCIUS; float aggregate_fault_prob; - get_aggregate_fault_probability(temperature_celcius, + get_aggregate_fault_probability(temperature_celcius, &aggregate_fault_prob); out << "Router-" << m_id << " fault probability: "; out << aggregate_fault_prob << endl; diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh index 4aa437c9c..17ba54fa5 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh @@ -89,12 +89,12 @@ class Router_d : public BasicRouter void printFaultVector(std::ostream& out); void printAggregateFaultProbability(std::ostream& out); - double calculate_power(); + void calculate_power(); void calculate_performance_numbers(); + double get_dynamic_power() const { return m_power_dyn; } + double get_static_power() const { return m_power_sta; } + double get_clk_power() const { return m_clk_power; } - double get_dynamic_power(){return m_power_dyn;} - double get_static_power(){return m_power_sta;} - double get_clk_power(){return m_clk_power;} bool get_fault_vector(int temperature, float fault_vector[]){ return m_network_ptr->fault_model->fault_vector(m_id, temperature, fault_vector); @@ -110,11 +110,6 @@ class Router_d : public BasicRouter private: int m_virtual_networks, m_num_vcs, m_vc_per_vnet; GarnetNetwork_d *m_network_ptr; - - std::vector buf_read_count; - std::vector buf_write_count; - std::vector vc_local_arbit_count; - std::vector vc_global_arbit_count; double sw_local_arbit_count, sw_global_arbit_count; double crossbar_count; @@ -125,9 +120,16 @@ class Router_d : public BasicRouter SWallocator_d *m_sw_alloc; Switch_d *m_switch; + // Statistical variables for power double m_power_dyn; double m_power_sta; double m_clk_power; + + // Statistical variables for performance + std::vector buf_read_count; + std::vector buf_write_count; + std::vector vc_local_arbit_count; + std::vector vc_global_arbit_count; }; #endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_ROUTER_D_HH__ diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh index d28c6f82f..246b7ad2f 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh @@ -57,26 +57,17 @@ class VCallocator_d : public Consumer bool is_invc_candidate(int inport_iter, int invc_iter); void select_outvc(int inport_iter, int invc_iter); - inline double - get_local_arbit_count(int vnet) - { - return m_local_arbiter_activity[vnet]; - } - - inline double - get_global_arbit_count(int vnet) - { - return m_global_arbiter_activity[vnet]; - } + double get_local_arbit_count(unsigned int vnet) const + { return m_local_arbiter_activity[vnet]; } + + double get_global_arbit_count(unsigned int vnet) const + { return m_global_arbiter_activity[vnet]; } private: int m_num_vcs, m_vc_per_vnet; int m_num_inports; int m_num_outports; - std::vector m_local_arbiter_activity; - std::vector m_global_arbiter_activity; - Router_d *m_router; // First stage of arbitration @@ -94,6 +85,10 @@ class VCallocator_d : public Consumer std::vector m_input_unit; std::vector m_output_unit; + + // Statistical variables + std::vector m_local_arbiter_activity; + std::vector m_global_arbiter_activity; }; #endif // __MEM_RUBY_NETWORK_GARNET_FIXED_PIPELINE_VC_ALLOCATOR_D_HH__ -- cgit v1.2.3