diff options
Diffstat (limited to 'src/mem/ruby/network/garnet')
9 files changed, 68 insertions, 70 deletions
diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc index 92e45c36d..2aeddad37 100644 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc @@ -66,20 +66,20 @@ BaseGarnetNetwork::init() Network::init(); } -MessageBuffer* -BaseGarnetNetwork::getToNetQueue(NodeID id, bool ordered, int network_num, - string vnet_type) +void +BaseGarnetNetwork::setToNetQueue(NodeID id, bool ordered, int network_num, + string vnet_type, MessageBuffer *b) { checkNetworkAllocation(id, ordered, network_num, vnet_type); - return m_toNetQueues[id][network_num]; + m_toNetQueues[id][network_num] = b; } -MessageBuffer* -BaseGarnetNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num, - string vnet_type) +void +BaseGarnetNetwork::setFromNetQueue(NodeID id, bool ordered, int network_num, + string vnet_type, MessageBuffer *b) { checkNetworkAllocation(id, ordered, network_num, vnet_type); - return m_fromNetQueues[id][network_num]; + m_fromNetQueues[id][network_num] = b; } void diff --git a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh b/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh index c4bb9f5b1..cc1d4d929 100644 --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh @@ -68,12 +68,11 @@ class BaseGarnetNetwork : public Network m_queueing_latency[vnet] += latency; } - // returns the queue requested for the given component - MessageBuffer* getToNetQueue(NodeID id, bool ordered, int network_num, - std::string vnet_type); - MessageBuffer* getFromNetQueue(NodeID id, bool ordered, int network_num, - std::string vnet_type); - + // set the queue + void setToNetQueue(NodeID id, bool ordered, int network_num, + std::string vnet_type, MessageBuffer *b); + void setFromNetQueue(NodeID id, bool ordered, int network_num, + std::string vnet_type, MessageBuffer *b); bool isVNetOrdered(int vnet) { return m_ordered[vnet]; } bool validVirtualNetwork(int vnet) { return m_in_use[vnet]; } diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc index 2f1b5ee46..7384cc6a7 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc @@ -53,8 +53,6 @@ NetworkInterface_d::NetworkInterface_d(const Params *p) m_vc_round_robin = 0; m_ni_buffers.resize(m_num_vcs); m_ni_enqueue_time.resize(m_num_vcs); - inNode_ptr.resize(m_virtual_networks); - outNode_ptr.resize(m_virtual_networks); creditQueue = new flitBuffer_d(); // instantiating the NI flit buffers @@ -108,18 +106,20 @@ NetworkInterface_d::addOutPort(NetworkLink_d *out_link, } void -NetworkInterface_d::addNode(vector<MessageBuffer *>& in, - vector<MessageBuffer *>& out) +NetworkInterface_d::addNode(map<int, MessageBuffer *>& in, + map<int, MessageBuffer *>& out) { - assert(in.size() == m_virtual_networks); inNode_ptr = in; outNode_ptr = out; - for (int j = 0; j < m_virtual_networks; j++) { + for (auto& it : in) { // the protocol injects messages into the NI - inNode_ptr[j]->setConsumer(this); - inNode_ptr[j]->setReceiver(this); - outNode_ptr[j]->setSender(this); + it.second->setConsumer(this); + it.second->setReceiver(this); + } + + for (auto& it : out) { + it.second->setSender(this); } } @@ -223,11 +223,14 @@ NetworkInterface_d::wakeup() // Checking for messages coming from the protocol // can pick up a message/cycle for each virtual net - for (int vnet = 0; vnet < m_virtual_networks; vnet++) { - while (inNode_ptr[vnet]->isReady()) { // Is there a message waiting - msg_ptr = inNode_ptr[vnet]->peekMsgPtr(); + for (auto it = inNode_ptr.begin(); it != inNode_ptr.end(); ++it) { + int vnet = (*it).first; + MessageBuffer *b = (*it).second; + + while (b->isReady()) { // Is there a message waiting + msg_ptr = b->peekMsgPtr(); if (flitisizeMessage(msg_ptr, vnet)) { - inNode_ptr[vnet]->dequeue(); + b->dequeue(); } else { break; } @@ -351,12 +354,15 @@ NetworkInterface_d::get_vnet(int vc) void NetworkInterface_d::checkReschedule() { - for (int vnet = 0; vnet < m_virtual_networks; vnet++) { - if (inNode_ptr[vnet]->isReady()) { // Is there a message waiting + for (const auto& it : inNode_ptr) { + MessageBuffer *b = it.second; + + while (b->isReady()) { // Is there a message waiting scheduleEvent(Cycles(1)); return; } } + for (int vc = 0; vc < m_num_vcs; vc++) { if (m_ni_buffers[vc]->isReady(curCycle() + Cycles(1))) { scheduleEvent(Cycles(1)); diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh index 05142cd28..2494d05d1 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh @@ -60,8 +60,9 @@ class NetworkInterface_d : public ClockedObject, public Consumer void addOutPort(NetworkLink_d *out_link, CreditLink_d *credit_link); void wakeup(); - void addNode(std::vector<MessageBuffer *> &inNode, - std::vector<MessageBuffer *> &outNode); + void addNode(std::map<int, MessageBuffer *> &inNode, + std::map<int, MessageBuffer *> &outNode); + void print(std::ostream& out) const; int get_vnet(int vc); void init_net_ptr(GarnetNetwork_d *net_ptr) { m_net_ptr = net_ptr; } @@ -89,9 +90,9 @@ class NetworkInterface_d : public ClockedObject, public Consumer std::vector<Cycles> m_ni_enqueue_time; // The Message buffers that takes messages from the protocol - std::vector<MessageBuffer *> inNode_ptr; + std::map<int, MessageBuffer *> inNode_ptr; // The Message buffers that provides messages to the protocol - std::vector<MessageBuffer *> outNode_ptr; + std::map<int, MessageBuffer *> outNode_ptr; bool flitisizeMessage(MsgPtr msg_ptr, int vnet); int calculateVC(int vnet); diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc index 13bbe2b08..26d2423e8 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc @@ -49,13 +49,10 @@ NetworkInterface::NetworkInterface(const Params *p) m_virtual_networks = p->virt_nets; m_vc_per_vnet = p->vcs_per_vnet; m_num_vcs = m_vc_per_vnet*m_virtual_networks; - m_vc_round_robin = 0; - m_ni_buffers.resize(m_num_vcs); - inNode_ptr.resize(m_virtual_networks); - outNode_ptr.resize(m_virtual_networks); // instantiating the NI flit buffers + m_ni_buffers.resize(m_num_vcs); for (int i =0; i < m_num_vcs; i++) m_ni_buffers[i] = new flitBuffer(); @@ -93,18 +90,20 @@ NetworkInterface::addOutPort(NetworkLink *out_link) } void -NetworkInterface::addNode(vector<MessageBuffer*>& in, - vector<MessageBuffer*>& out) +NetworkInterface::addNode(map<int, MessageBuffer*>& in, + map<int, MessageBuffer*>& out) { - assert(in.size() == m_virtual_networks); inNode_ptr = in; outNode_ptr = out; - // protocol injects messages into the NI - for (int j = 0; j < m_virtual_networks; j++) { - inNode_ptr[j]->setConsumer(this); - inNode_ptr[j]->setReceiver(this); - outNode_ptr[j]->setSender(this); + for (auto& it: in) { + // the protocol injects messages into the NI + it.second->setConsumer(this); + it.second->setReceiver(this); + } + + for (auto& it : out) { + it.second->setSender(this); } } @@ -243,12 +242,14 @@ NetworkInterface::wakeup() //Checking for messages coming from the protocol // can pick up a message/cycle for each virtual net - for (int vnet = 0; vnet < m_virtual_networks; vnet++) { - while (inNode_ptr[vnet]->isReady()) // Is there a message waiting - { - msg_ptr = inNode_ptr[vnet]->peekMsgPtr(); + for (auto it = inNode_ptr.begin(); it != inNode_ptr.end(); ++it) { + int vnet = (*it).first; + MessageBuffer *b = (*it).second; + + while (b->isReady()) { // Is there a message waiting + msg_ptr = b->peekMsgPtr(); if (flitisizeMessage(msg_ptr, vnet)) { - inNode_ptr[vnet]->dequeue(); + b->dequeue(); } else { break; } @@ -324,14 +325,17 @@ NetworkInterface::scheduleOutputLink() void NetworkInterface::checkReschedule() { - for (int vnet = 0; vnet < m_virtual_networks; vnet++) { - if (inNode_ptr[vnet]->isReady()) { // Is there a message waiting + for (const auto& it : inNode_ptr) { + MessageBuffer *b = it.second; + + while (b->isReady()) { // Is there a message waiting scheduleEvent(Cycles(1)); return; } } + for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_ni_buffers[vc]->isReadyForNext(curCycle())) { + if (m_ni_buffers[vc]->isReady(curCycle() + Cycles(1))) { scheduleEvent(Cycles(1)); return; } diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh index 0af538bf2..aa30bd758 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh +++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh @@ -56,10 +56,10 @@ class NetworkInterface : public ClockedObject, public FlexibleConsumer void addInPort(NetworkLink *in_link); void addOutPort(NetworkLink *out_link); + void addNode(std::map<int, MessageBuffer *> &inNode, + std::map<int, MessageBuffer *> &outNode); void wakeup(); - void addNode(std::vector<MessageBuffer *> &inNode, - std::vector<MessageBuffer *> &outNode); void grant_vc(int out_port, int vc, Cycles grant_time); void release_vc(int out_port, int vc, Cycles release_time); @@ -93,10 +93,10 @@ class NetworkInterface : public ClockedObject, public FlexibleConsumer std::vector<flitBuffer *> m_ni_buffers; // The Message buffers that takes messages from the protocol - std::vector<MessageBuffer *> inNode_ptr; + std::map<int, MessageBuffer *> inNode_ptr; // The Message buffers that provides messages to the protocol - std::vector<MessageBuffer *> outNode_ptr; + std::map<int, MessageBuffer *> outNode_ptr; bool flitisizeMessage(MsgPtr msg_ptr, int vnet); int calculateVC(int vnet); diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc index 851ababc4..0fc2c6be3 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc @@ -387,7 +387,7 @@ Router::checkReschedule() { for (int port = 0; port < m_out_link.size(); port++) { for (int vc = 0; vc < m_num_vcs; vc++) { - if (m_router_buffers[port][vc]->isReadyForNext(curCycle())) { + if (m_router_buffers[port][vc]->isReady(curCycle() + Cycles(1))) { scheduleEvent(Cycles(1)); return; } diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc index 7a8ea8c23..ee31ac3d2 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.cc @@ -62,17 +62,6 @@ flitBuffer::isReady(Cycles curTime) } bool -flitBuffer::isReadyForNext(Cycles curTime) -{ - if (m_buffer.size() != 0 ) { - flit *t_flit = m_buffer.front(); - if (t_flit->get_time() <= (curTime + 1)) - return true; - } - return false; -} - -bool flitBuffer::isFull() { return (m_buffer.size() >= max_size); diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh index 609c5a9b6..99fa2678b 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh +++ b/src/mem/ruby/network/garnet/flexible-pipeline/flitBuffer.hh @@ -44,7 +44,6 @@ class flitBuffer flitBuffer(int maximum_size); bool isReady(Cycles curTime); - bool isReadyForNext(Cycles curTime); bool isFull(); bool isEmpty(); void setMaxSize(int maximum); |