From a679e732cee821616c20cc13c22ad2877072ff14 Mon Sep 17 00:00:00 2001 From: Tushar Krishna Date: Sun, 6 Feb 2011 22:14:17 -0800 Subject: garnet: added orion2.0 for network power calculation --- .../network/garnet/fixed-pipeline/InputUnit_d.cc | 15 +++++++---- .../network/garnet/fixed-pipeline/InputUnit_d.hh | 12 +++++---- .../network/garnet/fixed-pipeline/NetworkLink_d.hh | 3 +-- .../ruby/network/garnet/fixed-pipeline/Router_d.cc | 30 ++++++++++++++-------- .../ruby/network/garnet/fixed-pipeline/Router_d.hh | 13 +++++----- .../network/garnet/fixed-pipeline/VCallocator_d.cc | 13 +++++++--- .../network/garnet/fixed-pipeline/VCallocator_d.hh | 11 ++++---- 7 files changed, 59 insertions(+), 38 deletions(-) (limited to 'src/mem/ruby/network/garnet/fixed-pipeline') diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc index 057b11fe9..b62a7d2c7 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc @@ -40,9 +40,14 @@ InputUnit_d::InputUnit_d(int id, Router_d *router) m_id = id; m_router = router; m_num_vcs = m_router->get_num_vcs(); + m_vc_per_vnet = m_router->get_vc_per_vnet(); - m_num_buffer_reads = 0; - m_num_buffer_writes = 0; + m_num_buffer_reads.resize(m_num_vcs/m_vc_per_vnet); + m_num_buffer_writes.resize(m_num_vcs/m_vc_per_vnet); + for (int i = 0; i < m_num_buffer_reads.size(); i++) { + m_num_buffer_reads[i] = 0; + m_num_buffer_writes[i] = 0; + } creditQueue = new flitBuffer_d(); // Instantiating the virtual channels @@ -82,11 +87,11 @@ InputUnit_d::wakeup() // write flit into input buffer m_vcs[vc]->insertFlit(t_flit); - + int vnet = vc/m_vc_per_vnet; // number of writes same as reads // any flit that is written will be read only once - m_num_buffer_writes++; - m_num_buffer_reads++; + m_num_buffer_writes[vnet]++; + m_num_buffer_reads[vnet]++; } } 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 bb2b7aa82..81c60f7e1 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh @@ -162,21 +162,23 @@ class InputUnit_d : public Consumer } inline double - get_buf_read_count() + get_buf_read_count(int vnet) { - return m_num_buffer_reads; + return m_num_buffer_reads[vnet]; } inline double - get_buf_write_count() + get_buf_write_count(int vnet) { - return m_num_buffer_writes; + return m_num_buffer_writes[vnet]; } private: int m_id; int m_num_vcs; - double m_num_buffer_writes, m_num_buffer_reads; + 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; 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 8f64baa37..cc13f5b9e 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh @@ -37,7 +37,7 @@ #include "mem/ruby/network/garnet/NetworkHeader.hh" #include "mem/ruby/common/Consumer.hh" #include "mem/ruby/network/garnet/fixed-pipeline/flitBuffer_d.hh" -#include "mem/ruby/network/orion/power_bus.hh" +#include "mem/ruby/network/orion/NetworkPower.hh" class GarnetNetwork_d; @@ -56,7 +56,6 @@ class NetworkLink_d : public Consumer int get_id(){return m_id;} void wakeup(); - double calculate_offline_power(power_bus*); double calculate_power(); inline bool isReady() { return linkBuffer->isReady(); } 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 44c3a5d64..4ee176653 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc @@ -60,13 +60,19 @@ Router_d::Router_d(int id, GarnetNetwork_d *network_ptr) m_input_unit.clear(); m_output_unit.clear(); - buf_read_count = 0; - buf_write_count = 0; crossbar_count = 0; - vc_local_arbit_count = 0; - vc_global_arbit_count = 0; sw_local_arbit_count = 0; sw_global_arbit_count = 0; + buf_read_count.resize(m_virtual_networks); + buf_write_count.resize(m_virtual_networks); + vc_local_arbit_count.resize(m_virtual_networks); + vc_global_arbit_count.resize(m_virtual_networks); + for (int i = 0; i < m_virtual_networks; i++) { + buf_read_count[i] = 0; + buf_write_count[i] = 0; + vc_local_arbit_count[i] = 0; + vc_global_arbit_count[i] = 0; + } } Router_d::~Router_d() @@ -154,15 +160,19 @@ Router_d::update_sw_winner(int inport, flit_d *t_flit) void Router_d::calculate_performance_numbers() { - for (int i = 0; i < m_input_unit.size(); i++) { - buf_read_count += m_input_unit[i]->get_buf_read_count(); - buf_write_count += m_input_unit[i]->get_buf_write_count(); + for (int j = 0; j < m_virtual_networks; j++) { + for (int i = 0; i < m_input_unit.size(); i++) { + buf_read_count[j] += m_input_unit[i]->get_buf_read_count(j); + buf_write_count[j] += m_input_unit[i]->get_buf_write_count(j); + } + + vc_local_arbit_count[j] = m_vc_alloc->get_local_arbit_count(j); + vc_global_arbit_count[j] = m_vc_alloc->get_global_arbit_count(j); } - crossbar_count = m_switch->get_crossbar_count(); - vc_local_arbit_count = m_vc_alloc->get_local_arbit_count(); - vc_global_arbit_count = m_vc_alloc->get_global_arbit_count(); + sw_local_arbit_count = m_sw_alloc->get_local_arbit_count(); sw_global_arbit_count = m_sw_alloc->get_global_arbit_count(); + crossbar_count = m_switch->get_crossbar_count(); } void 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 4af37cdbe..0c5d51fc3 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh @@ -37,7 +37,7 @@ #include "mem/ruby/network/garnet/NetworkHeader.hh" #include "mem/ruby/network/garnet/fixed-pipeline/flit_d.hh" #include "mem/ruby/common/NetDest.hh" -#include "mem/ruby/network/orion/power_router_init.hh" +#include "mem/ruby/network/orion/NetworkPower.hh" class GarnetNetwork_d; class NetworkLink_d; @@ -78,10 +78,7 @@ class Router_d void swarb_req(); void printConfig(std::ostream& out); - void power_router_initialize(power_router *router, - power_router_info *info); double calculate_power(); - double calculate_offline_power(power_router*, power_router_info*); void calculate_performance_numbers(); private: @@ -90,10 +87,12 @@ class Router_d GarnetNetwork_d *m_network_ptr; int m_flit_width; - double buf_read_count, buf_write_count; - double crossbar_count; - double vc_local_arbit_count, vc_global_arbit_count; + 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; std::vector m_input_unit; std::vector m_output_unit; diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc index 9148cdf9d..3cffda84c 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc @@ -39,8 +39,13 @@ VCallocator_d::VCallocator_d(Router_d *router) m_router = router; m_num_vcs = m_router->get_num_vcs(); m_vc_per_vnet = m_router->get_vc_per_vnet(); - m_local_arbiter_activity = 0; - m_global_arbiter_activity = 0; + + m_local_arbiter_activity.resize(m_num_vcs/m_vc_per_vnet); + m_global_arbiter_activity.resize(m_num_vcs/m_vc_per_vnet); + for (int i = 0; i < m_local_arbiter_activity.size(); i++) { + m_local_arbiter_activity[i] = 0; + m_global_arbiter_activity[i] = 0; + } } void @@ -158,7 +163,7 @@ VCallocator_d::select_outvc(int inport_iter, int invc_iter) outvc_offset = 0; int outvc = outvc_base + outvc_offset; if (m_output_unit[outport]->is_vc_idle(outvc)) { - m_local_arbiter_activity++; + m_local_arbiter_activity[vnet]++; m_outvc_req[outport][outvc][inport_iter][invc_iter] = true; if (!m_outvc_is_req[outport][outvc]) m_outvc_is_req[outport][outvc] = true; @@ -220,7 +225,7 @@ VCallocator_d::arbitrate_outvcs() } int invc = invc_base + invc_offset; if (m_outvc_req[outport_iter][outvc_iter][inport][invc]) { - m_global_arbiter_activity++; + m_global_arbiter_activity[vnet]++; m_input_unit[inport]->grant_vc(invc, outvc_iter); m_output_unit[outport_iter]->update_vc( outvc_iter, inport, invc); 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 3d3e9a4e6..789338244 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh @@ -58,15 +58,15 @@ class VCallocator_d : public Consumer void select_outvc(int inport_iter, int invc_iter); inline double - get_local_arbit_count() + get_local_arbit_count(int vnet) { - return m_local_arbiter_activity; + return m_local_arbiter_activity[vnet]; } inline double - get_global_arbit_count() + get_global_arbit_count(int vnet) { - return m_global_arbiter_activity; + return m_global_arbiter_activity[vnet]; } private: @@ -74,7 +74,8 @@ class VCallocator_d : public Consumer int m_num_inports; int m_num_outports; - double m_local_arbiter_activity, m_global_arbiter_activity; + std::vector m_local_arbiter_activity; + std::vector m_global_arbiter_activity; Router_d *m_router; -- cgit v1.2.3