summaryrefslogtreecommitdiff
path: root/src/mem/ruby/network/garnet
diff options
context:
space:
mode:
authorTushar Krishna <tushar@csail.mit.edu>2011-02-06 22:14:17 -0800
committerTushar Krishna <tushar@csail.mit.edu>2011-02-06 22:14:17 -0800
commita679e732cee821616c20cc13c22ad2877072ff14 (patch)
treed3225f0f3bc7f4f79fa3eeb7bf0fb40de19509aa /src/mem/ruby/network/garnet
parent59163f824c71e4290399be7c1c4b6e70b799a388 (diff)
downloadgem5-a679e732cee821616c20cc13c22ad2877072ff14.tar.xz
garnet: added orion2.0 for network power calculation
Diffstat (limited to 'src/mem/ruby/network/garnet')
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.cc15
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh12
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh3
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc30
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh13
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc13
-rw-r--r--src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh11
7 files changed, 59 insertions, 38 deletions
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<double> m_num_buffer_writes;
+ std::vector<double> 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<double> buf_read_count;
+ std::vector<double> buf_write_count;
+ std::vector<double> vc_local_arbit_count;
+ std::vector<double> vc_global_arbit_count;
double sw_local_arbit_count, sw_global_arbit_count;
+ double crossbar_count;
std::vector<InputUnit_d *> m_input_unit;
std::vector<OutputUnit_d *> 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<double > m_local_arbiter_activity;
+ std::vector<double > m_global_arbiter_activity;
Router_d *m_router;