ruby: replace g_ruby_start with per-RubySystem m_start_cycle
This patch begins the process of removing global variables from the Ruby source with the goal of eventually allowing users to create multiple Ruby instances in a single simulation. Currently, users cannot do so because several global variables and static members are referenced by the RubySystem object in a way that assumes that there will only ever be a single RubySystem. These need to be replaced with per-RubySystem equivalents. This specific patch replaces the global var g_ruby_start, which is used to calculate throughput statistics for Throttles in simple networks and links in Garnet networks, with a RubySystem instance var m_start_cycle.
This commit is contained in:
parent
9eda4bdc5a
commit
c38f5098b1
10 changed files with 30 additions and 23 deletions
|
@ -32,4 +32,3 @@ using namespace std;
|
||||||
|
|
||||||
RubySystem* g_system_ptr = 0;
|
RubySystem* g_system_ptr = 0;
|
||||||
vector<map<uint32_t, AbstractController *> > g_abs_controls;
|
vector<map<uint32_t, AbstractController *> > g_abs_controls;
|
||||||
Cycles g_ruby_start;
|
|
||||||
|
|
|
@ -41,8 +41,4 @@ extern RubySystem* g_system_ptr;
|
||||||
class AbstractController;
|
class AbstractController;
|
||||||
extern std::vector<std::map<uint32_t, AbstractController *> > g_abs_controls;
|
extern std::vector<std::map<uint32_t, AbstractController *> > g_abs_controls;
|
||||||
|
|
||||||
// A globally visible time at which the actual execution started. Meant only
|
|
||||||
// for components with in Ruby. Initialized in RubySystem::startup().
|
|
||||||
extern Cycles g_ruby_start;
|
|
||||||
|
|
||||||
#endif // __MEM_RUBY_COMMON_GLOBAL_HH__
|
#endif // __MEM_RUBY_COMMON_GLOBAL_HH__
|
||||||
|
|
|
@ -65,7 +65,7 @@ Network::Network(const Params *p)
|
||||||
m_ordered[i] = false;
|
m_ordered[i] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->ruby_system->registerNetwork(this);
|
params()->ruby_system->registerNetwork(this);
|
||||||
|
|
||||||
// Initialize the controller's network pointers
|
// Initialize the controller's network pointers
|
||||||
for (std::vector<BasicExtLink*>::const_iterator i = p->ext_links.begin();
|
for (std::vector<BasicExtLink*>::const_iterator i = p->ext_links.begin();
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh"
|
#include "mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.hh"
|
||||||
#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh"
|
#include "mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh"
|
||||||
#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh"
|
#include "mem/ruby/network/garnet/fixed-pipeline/Router_d.hh"
|
||||||
|
#include "mem/ruby/system/System.hh"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using m5::stl_helpers::deletePointers;
|
using m5::stl_helpers::deletePointers;
|
||||||
|
@ -223,15 +224,16 @@ GarnetNetwork_d::regStats()
|
||||||
void
|
void
|
||||||
GarnetNetwork_d::collateStats()
|
GarnetNetwork_d::collateStats()
|
||||||
{
|
{
|
||||||
|
RubySystem *rs = params()->ruby_system;
|
||||||
|
double time_delta = double(curCycle() - rs->getStartCycle());
|
||||||
|
|
||||||
for (int i = 0; i < m_links.size(); i++) {
|
for (int i = 0; i < m_links.size(); i++) {
|
||||||
m_average_link_utilization +=
|
m_average_link_utilization +=
|
||||||
(double(m_links[i]->getLinkUtilization())) /
|
(double(m_links[i]->getLinkUtilization())) / time_delta;
|
||||||
(double(curCycle() - g_ruby_start));
|
|
||||||
|
|
||||||
vector<unsigned int> vc_load = m_links[i]->getVcLoad();
|
vector<unsigned int> vc_load = m_links[i]->getVcLoad();
|
||||||
for (int j = 0; j < vc_load.size(); j++) {
|
for (int j = 0; j < vc_load.size(); j++) {
|
||||||
m_average_vc_load[j] +=
|
m_average_vc_load[j] += ((double)vc_load[j] / time_delta);
|
||||||
((double)vc_load[j] / (double)(curCycle() - g_ruby_start));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh"
|
#include "mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh"
|
||||||
#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh"
|
#include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh"
|
||||||
#include "mem/ruby/network/garnet/flexible-pipeline/Router.hh"
|
#include "mem/ruby/network/garnet/flexible-pipeline/Router.hh"
|
||||||
|
#include "mem/ruby/system/System.hh"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using m5::stl_helpers::deletePointers;
|
using m5::stl_helpers::deletePointers;
|
||||||
|
@ -227,10 +228,12 @@ GarnetNetwork::regStats()
|
||||||
void
|
void
|
||||||
GarnetNetwork::collateStats()
|
GarnetNetwork::collateStats()
|
||||||
{
|
{
|
||||||
|
RubySystem *rs = params()->ruby_system;
|
||||||
|
double time_delta = double(curCycle() - rs->getStartCycle());
|
||||||
|
|
||||||
for (int i = 0; i < m_links.size(); i++) {
|
for (int i = 0; i < m_links.size(); i++) {
|
||||||
m_average_link_utilization +=
|
m_average_link_utilization +=
|
||||||
(double(m_links[i]->getLinkUtilization())) /
|
(double(m_links[i]->getLinkUtilization())) / time_delta;
|
||||||
(double(curCycle() - g_ruby_start));
|
|
||||||
|
|
||||||
vector<unsigned int> vc_load = m_links[i]->getVcLoad();
|
vector<unsigned int> vc_load = m_links[i]->getVcLoad();
|
||||||
for (int j = 0; j < vc_load.size(); j++) {
|
for (int j = 0; j < vc_load.size(); j++) {
|
||||||
|
|
|
@ -81,7 +81,8 @@ Switch::addOutPort(const vector<MessageBuffer*>& out,
|
||||||
Cycles link_latency, int bw_multiplier)
|
Cycles link_latency, int bw_multiplier)
|
||||||
{
|
{
|
||||||
// Create a throttle
|
// Create a throttle
|
||||||
Throttle* throttle_ptr = new Throttle(m_id, m_throttles.size(),
|
RubySystem *rs = m_network_ptr->params()->ruby_system;
|
||||||
|
Throttle* throttle_ptr = new Throttle(m_id, rs, m_throttles.size(),
|
||||||
link_latency, bw_multiplier,
|
link_latency, bw_multiplier,
|
||||||
m_network_ptr->getEndpointBandwidth(),
|
m_network_ptr->getEndpointBandwidth(),
|
||||||
this);
|
this);
|
||||||
|
|
|
@ -46,19 +46,19 @@ const int PRIORITY_SWITCH_LIMIT = 128;
|
||||||
|
|
||||||
static int network_message_to_size(Message* net_msg_ptr);
|
static int network_message_to_size(Message* net_msg_ptr);
|
||||||
|
|
||||||
Throttle::Throttle(int sID, NodeID node, Cycles link_latency,
|
Throttle::Throttle(int sID, RubySystem *rs, NodeID node, Cycles link_latency,
|
||||||
int link_bandwidth_multiplier, int endpoint_bandwidth,
|
int link_bandwidth_multiplier, int endpoint_bandwidth,
|
||||||
ClockedObject *em)
|
ClockedObject *em)
|
||||||
: Consumer(em)
|
: Consumer(em), m_ruby_system(rs)
|
||||||
{
|
{
|
||||||
init(node, link_latency, link_bandwidth_multiplier, endpoint_bandwidth);
|
init(node, link_latency, link_bandwidth_multiplier, endpoint_bandwidth);
|
||||||
m_sID = sID;
|
m_sID = sID;
|
||||||
}
|
}
|
||||||
|
|
||||||
Throttle::Throttle(NodeID node, Cycles link_latency,
|
Throttle::Throttle(RubySystem *rs, NodeID node, Cycles link_latency,
|
||||||
int link_bandwidth_multiplier, int endpoint_bandwidth,
|
int link_bandwidth_multiplier, int endpoint_bandwidth,
|
||||||
ClockedObject *em)
|
ClockedObject *em)
|
||||||
: Consumer(em)
|
: Consumer(em), m_ruby_system(rs)
|
||||||
{
|
{
|
||||||
init(node, link_latency, link_bandwidth_multiplier, endpoint_bandwidth);
|
init(node, link_latency, link_bandwidth_multiplier, endpoint_bandwidth);
|
||||||
m_sID = 0;
|
m_sID = 0;
|
||||||
|
@ -245,8 +245,10 @@ Throttle::clearStats()
|
||||||
void
|
void
|
||||||
Throttle::collateStats()
|
Throttle::collateStats()
|
||||||
{
|
{
|
||||||
m_link_utilization = 100.0 * m_link_utilization_proxy
|
double time_delta = double(m_ruby_system->curCycle() -
|
||||||
/ (double(g_system_ptr->curCycle() - g_ruby_start));
|
m_ruby_system->getStartCycle());
|
||||||
|
|
||||||
|
m_link_utilization = 100.0 * m_link_utilization_proxy / time_delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -52,11 +52,12 @@ class MessageBuffer;
|
||||||
class Throttle : public Consumer
|
class Throttle : public Consumer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Throttle(int sID, NodeID node, Cycles link_latency,
|
Throttle(int sID, RubySystem *rs, NodeID node, Cycles link_latency,
|
||||||
|
int link_bandwidth_multiplier, int endpoint_bandwidth,
|
||||||
|
ClockedObject *em);
|
||||||
|
Throttle(RubySystem *rs, NodeID node, Cycles link_latency,
|
||||||
int link_bandwidth_multiplier, int endpoint_bandwidth,
|
int link_bandwidth_multiplier, int endpoint_bandwidth,
|
||||||
ClockedObject *em);
|
ClockedObject *em);
|
||||||
Throttle(NodeID node, Cycles link_latency, int link_bandwidth_multiplier,
|
|
||||||
int endpoint_bandwidth, ClockedObject *em);
|
|
||||||
~Throttle() {}
|
~Throttle() {}
|
||||||
|
|
||||||
std::string name()
|
std::string name()
|
||||||
|
@ -103,6 +104,7 @@ class Throttle : public Consumer
|
||||||
Cycles m_link_latency;
|
Cycles m_link_latency;
|
||||||
int m_wakeups_wo_switch;
|
int m_wakeups_wo_switch;
|
||||||
int m_endpoint_bandwidth;
|
int m_endpoint_bandwidth;
|
||||||
|
RubySystem *m_ruby_system;
|
||||||
|
|
||||||
// Statistical variables
|
// Statistical variables
|
||||||
Stats::Scalar m_link_utilization;
|
Stats::Scalar m_link_utilization;
|
||||||
|
|
|
@ -338,7 +338,7 @@ RubySystem::RubyEvent::process()
|
||||||
void
|
void
|
||||||
RubySystem::resetStats()
|
RubySystem::resetStats()
|
||||||
{
|
{
|
||||||
g_ruby_start = curCycle();
|
m_start_cycle = curCycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -78,6 +78,7 @@ class RubySystem : public ClockedObject
|
||||||
static bool getCooldownEnabled() { return m_cooldown_enabled; }
|
static bool getCooldownEnabled() { return m_cooldown_enabled; }
|
||||||
|
|
||||||
SimpleMemory *getPhysMem() { return m_phys_mem; }
|
SimpleMemory *getPhysMem() { return m_phys_mem; }
|
||||||
|
Cycles getStartCycle() { return m_start_cycle; }
|
||||||
const bool getAccessBackingStore() { return m_access_backing_store; }
|
const bool getAccessBackingStore() { return m_access_backing_store; }
|
||||||
|
|
||||||
// Public Methods
|
// Public Methods
|
||||||
|
@ -135,6 +136,7 @@ class RubySystem : public ClockedObject
|
||||||
|
|
||||||
Network* m_network;
|
Network* m_network;
|
||||||
std::vector<AbstractController *> m_abs_cntrl_vec;
|
std::vector<AbstractController *> m_abs_cntrl_vec;
|
||||||
|
Cycles m_start_cycle;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Profiler* m_profiler;
|
Profiler* m_profiler;
|
||||||
|
|
Loading…
Reference in a new issue