mem-garnet: Use static allocation in InputUnit

Use static allocation for the pointers managed by InputUnit.

Change-Id: I3eab42c6c08b1a519b9b55de26e820bad2ef03c4
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/24245
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Daniel R. Carvalho
2020-01-07 23:53:28 +01:00
committed by Daniel Carvalho
parent f545497057
commit 0fa704526d
2 changed files with 31 additions and 44 deletions

View File

@@ -1,6 +1,7 @@
/*
* Copyright (c) 2008 Princeton University
* Copyright (c) 2020 Inria
* Copyright (c) 2016 Georgia Institute of Technology
* Copyright (c) 2008 Princeton University
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,23 +31,17 @@
#include "mem/ruby/network/garnet2.0/InputUnit.hh"
#include "base/stl_helpers.hh"
#include "debug/RubyNetwork.hh"
#include "mem/ruby/network/garnet2.0/Credit.hh"
#include "mem/ruby/network/garnet2.0/Router.hh"
using namespace std;
using m5::stl_helpers::deletePointers;
InputUnit::InputUnit(int id, PortDirection direction, Router *router)
: Consumer(router)
: Consumer(router), m_router(router), m_id(id), m_direction(direction),
m_vc_per_vnet(m_router->get_vc_per_vnet())
{
m_id = id;
m_direction = direction;
m_router = router;
m_num_vcs = m_router->get_num_vcs();
m_vc_per_vnet = m_router->get_vc_per_vnet();
const int m_num_vcs = m_router->get_num_vcs();
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++) {
@@ -54,20 +49,13 @@ InputUnit::InputUnit(int id, PortDirection direction, Router *router)
m_num_buffer_writes[i] = 0;
}
creditQueue = new flitBuffer();
// Instantiating the virtual channels
m_vcs.resize(m_num_vcs);
virtualChannels.reserve(m_num_vcs);
for (int i=0; i < m_num_vcs; i++) {
m_vcs[i] = new VirtualChannel(i);
virtualChannels.emplace_back(i);
}
}
InputUnit::~InputUnit()
{
delete creditQueue;
deletePointers(m_vcs);
}
/*
* The InputUnit wakeup function reads the input flit from its input link.
* Each flit arrives with an input VC.
@@ -91,7 +79,7 @@ InputUnit::wakeup()
if ((t_flit->get_type() == HEAD_) ||
(t_flit->get_type() == HEAD_TAIL_)) {
assert(m_vcs[vc]->get_state() == IDLE_);
assert(virtualChannels[vc].get_state() == IDLE_);
set_vc_active(vc, m_router->curCycle());
// Route computation for this vc
@@ -104,12 +92,12 @@ InputUnit::wakeup()
grant_outport(vc, outport);
} else {
assert(m_vcs[vc]->get_state() == ACTIVE_);
assert(virtualChannels[vc].get_state() == ACTIVE_);
}
// Buffer the flit
m_vcs[vc]->insertFlit(t_flit);
virtualChannels[vc].insertFlit(t_flit);
int vnet = vc/m_vc_per_vnet;
// number of writes same as reads
@@ -142,7 +130,7 @@ void
InputUnit::increment_credit(int in_vc, bool free_signal, Cycles curTime)
{
Credit *t_credit = new Credit(in_vc, free_signal, curTime);
creditQueue->insert(t_credit);
creditQueue.insert(t_credit);
m_credit_link->scheduleEventAbsolute(m_router->clockEdge(Cycles(1)));
}
@@ -151,8 +139,8 @@ uint32_t
InputUnit::functionalWrite(Packet *pkt)
{
uint32_t num_functional_writes = 0;
for (int i=0; i < m_num_vcs; i++) {
num_functional_writes += m_vcs[i]->functionalWrite(pkt);
for (auto& virtual_channel : virtualChannels) {
num_functional_writes += virtual_channel.functionalWrite(pkt);
}
return num_functional_writes;

View File

@@ -1,6 +1,7 @@
/*
* Copyright (c) 2008 Princeton University
* Copyright (c) 2020 Inria
* Copyright (c) 2016 Georgia Institute of Technology
* Copyright (c) 2008 Princeton University
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -46,7 +47,7 @@ class InputUnit : public Consumer
{
public:
InputUnit(int id, PortDirection direction, Router *router);
~InputUnit();
~InputUnit() = default;
void wakeup();
void print(std::ostream& out) const {};
@@ -56,43 +57,43 @@ class InputUnit : public Consumer
inline void
set_vc_idle(int vc, Cycles curTime)
{
m_vcs[vc]->set_idle(curTime);
virtualChannels[vc].set_idle(curTime);
}
inline void
set_vc_active(int vc, Cycles curTime)
{
m_vcs[vc]->set_active(curTime);
virtualChannels[vc].set_active(curTime);
}
inline void
grant_outport(int vc, int outport)
{
m_vcs[vc]->set_outport(outport);
virtualChannels[vc].set_outport(outport);
}
inline void
grant_outvc(int vc, int outvc)
{
m_vcs[vc]->set_outvc(outvc);
virtualChannels[vc].set_outvc(outvc);
}
inline int
get_outport(int invc)
{
return m_vcs[invc]->get_outport();
return virtualChannels[invc].get_outport();
}
inline int
get_outvc(int invc)
{
return m_vcs[invc]->get_outvc();
return virtualChannels[invc].get_outvc();
}
inline Cycles
get_enqueue_time(int invc)
{
return m_vcs[invc]->get_enqueue_time();
return virtualChannels[invc].get_enqueue_time();
}
void increment_credit(int in_vc, bool free_signal, Cycles curTime);
@@ -100,28 +101,28 @@ class InputUnit : public Consumer
inline flit*
peekTopFlit(int vc)
{
return m_vcs[vc]->peekTopFlit();
return virtualChannels[vc].peekTopFlit();
}
inline flit*
getTopFlit(int vc)
{
return m_vcs[vc]->getTopFlit();
return virtualChannels[vc].getTopFlit();
}
inline bool
need_stage(int vc, flit_stage stage, Cycles time)
{
return m_vcs[vc]->need_stage(stage, time);
return virtualChannels[vc].need_stage(stage, time);
}
inline bool
isReady(int invc, Cycles curTime)
{
return m_vcs[invc]->isReady(curTime);
return virtualChannels[invc].isReady(curTime);
}
flitBuffer* getCreditQueue() { return creditQueue; }
flitBuffer* getCreditQueue() { return &creditQueue; }
inline void
set_in_link(NetworkLink *link)
@@ -146,18 +147,16 @@ class InputUnit : public Consumer
void resetStats();
private:
Router *m_router;
int m_id;
PortDirection m_direction;
int m_num_vcs;
int m_vc_per_vnet;
Router *m_router;
NetworkLink *m_in_link;
CreditLink *m_credit_link;
flitBuffer *creditQueue;
flitBuffer creditQueue;
// Input Virtual channels
std::vector<VirtualChannel *> m_vcs;
std::vector<VirtualChannel> virtualChannels;
// Statistical variables
std::vector<double> m_num_buffer_writes;