From 46cce440be4999cfdedebbf190c83570ba9f1b49 Mon Sep 17 00:00:00 2001 From: Tushar Krishna Date: Mon, 21 Mar 2011 22:51:59 -0400 Subject: This patch makes garnet use the info about active and inactive vnets during allocation and power estimations etc --- .../garnet/flexible-pipeline/GarnetNetwork.cc | 3 ++ .../network/garnet/flexible-pipeline/Router.cc | 41 ++++++++++++++++++---- .../network/garnet/flexible-pipeline/Router.hh | 1 + 3 files changed, 39 insertions(+), 6 deletions(-) (limited to 'src/mem/ruby/network/garnet/flexible-pipeline') diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc index 8280360c4..205eb1472 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc @@ -260,6 +260,9 @@ GarnetNetwork::printStats(ostream& out) const out << "-------------" << endl; for (int i = 0; i < m_vcs_per_class*m_virtual_networks; i++) { + if (!m_in_use[i/m_vcs_per_class]) + continue; + average_vc_load[i] = (double(average_vc_load[i]) / (double(g_eventQueue_ptr->getTime()) - m_ruby_start)); out << "Average VC Load [" << i << "] = " << average_vc_load[i] << diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc index fef6b00a1..4a0d59973 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc @@ -156,14 +156,27 @@ Router::vc_arbitrate() if (inport >= m_in_link.size()) inport = 0; int invc = m_round_robin_invc[inport]; - m_round_robin_invc[inport]++; - if (m_round_robin_invc[inport] >= m_num_vcs) - m_round_robin_invc[inport] = 0; + int next_round_robin_invc = invc; + do { + next_round_robin_invc++; + + if (next_round_robin_invc >= m_num_vcs) + next_round_robin_invc = 0; + + } while (!(m_net_ptr->validVirtualNetwork( + get_vnet(next_round_robin_invc)))); + + m_round_robin_invc[inport] = next_round_robin_invc; + for (int vc_iter = 0; vc_iter < m_num_vcs; vc_iter++) { invc++; if (invc >= m_num_vcs) invc = 0; + + if (!(m_net_ptr->validVirtualNetwork(get_vnet(invc)))) + continue; + InVcState *in_vc_state = m_in_vc_state[inport][invc]; if (in_vc_state->isInState(VC_AB_, g_eventQueue_ptr->getTime())) { @@ -330,9 +343,17 @@ Router::scheduleOutputLinks() { for (int port = 0; port < m_out_link.size(); port++) { int vc_tolookat = m_vc_round_robin[port]; - m_vc_round_robin[port]++; - if (m_vc_round_robin[port] == m_num_vcs) - m_vc_round_robin[port] = 0; + + int next_round_robin_vc_tolookat = vc_tolookat; + do { + next_round_robin_vc_tolookat++; + + if (next_round_robin_vc_tolookat == m_num_vcs) + next_round_robin_vc_tolookat = 0; + } while (!(m_net_ptr->validVirtualNetwork( + get_vnet(next_round_robin_vc_tolookat)))); + + m_vc_round_robin[port] = next_round_robin_vc_tolookat; for (int i = 0; i < m_num_vcs; i++) { vc_tolookat++; @@ -358,6 +379,14 @@ Router::scheduleOutputLinks() } } +int +Router::get_vnet(int vc) +{ + int vnet = vc/m_vc_per_vnet; + assert(vnet < m_virtual_networks); + return vnet; +} + void Router::checkReschedule() { diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/Router.hh b/src/mem/ruby/network/garnet/flexible-pipeline/Router.hh index 20a4abd54..8f240551c 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/Router.hh +++ b/src/mem/ruby/network/garnet/flexible-pipeline/Router.hh @@ -62,6 +62,7 @@ class Router : public FlexibleConsumer void grant_vc(int out_port, int vc, Time grant_time); void release_vc(int out_port, int vc, Time release_time); void vc_arbitrate(); + int get_vnet(int vc); void printConfig(std::ostream& out) const; void print(std::ostream& out) const; -- cgit v1.2.3