summaryrefslogtreecommitdiff
path: root/src/mem/ruby/network/simple/Throttle.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/ruby/network/simple/Throttle.cc')
-rw-r--r--src/mem/ruby/network/simple/Throttle.cc39
1 files changed, 18 insertions, 21 deletions
diff --git a/src/mem/ruby/network/simple/Throttle.cc b/src/mem/ruby/network/simple/Throttle.cc
index 91bad217b..2da810edb 100644
--- a/src/mem/ruby/network/simple/Throttle.cc
+++ b/src/mem/ruby/network/simple/Throttle.cc
@@ -69,6 +69,8 @@ Throttle::init(NodeID node, Cycles link_latency,
int link_bandwidth_multiplier, int endpoint_bandwidth)
{
m_node = node;
+ m_vnets = 0;
+
assert(link_bandwidth_multiplier > 0);
m_link_bandwidth_multiplier = link_bandwidth_multiplier;
@@ -80,23 +82,19 @@ Throttle::init(NodeID node, Cycles link_latency,
}
void
-Throttle::addLinks(const map<int, MessageBuffer*>& in_vec,
- const map<int, MessageBuffer*>& out_vec)
+Throttle::addLinks(const vector<MessageBuffer*>& in_vec,
+ const vector<MessageBuffer*>& out_vec)
{
assert(in_vec.size() == out_vec.size());
- for (auto& it : in_vec) {
- int vnet = it.first;
-
- auto jt = out_vec.find(vnet);
- assert(jt != out_vec.end());
+ for (int vnet = 0; vnet < in_vec.size(); ++vnet) {
+ MessageBuffer *in_ptr = in_vec[vnet];
+ MessageBuffer *out_ptr = out_vec[vnet];
- MessageBuffer *in_ptr = it.second;
- MessageBuffer *out_ptr = (*jt).second;
-
- m_in[vnet] = in_ptr;
- m_out[vnet] = out_ptr;
- m_units_remaining[vnet] = 0;
+ m_vnets++;
+ m_units_remaining.push_back(0);
+ m_in.push_back(in_ptr);
+ m_out.push_back(out_ptr);
// Set consumer and description
in_ptr->setConsumer(this);
@@ -110,8 +108,9 @@ void
Throttle::operateVnet(int vnet, int &bw_remaining, bool &schedule_wakeup,
MessageBuffer *in, MessageBuffer *out)
{
- assert(out != NULL);
- assert(in != NULL);
+ if (out == nullptr || in == nullptr) {
+ return;
+ }
assert(m_units_remaining[vnet] >= 0);
while (bw_remaining > 0 && (in->isReady() || m_units_remaining[vnet] > 0) &&
@@ -178,16 +177,14 @@ Throttle::wakeup()
}
if (iteration_direction) {
- for (auto& it : m_in) {
- int vnet = it.first;
+ for (int vnet = 0; vnet < m_vnets; ++vnet) {
operateVnet(vnet, bw_remaining, schedule_wakeup,
- it.second, m_out[vnet]);
+ m_in[vnet], m_out[vnet]);
}
} else {
- for (auto it = m_in.rbegin(); it != m_in.rend(); ++it) {
- int vnet = (*it).first;
+ for (int vnet = m_vnets-1; vnet >= 0; --vnet) {
operateVnet(vnet, bw_remaining, schedule_wakeup,
- (*it).second, m_out[vnet]);
+ m_in[vnet], m_out[vnet]);
}
}