From 0badfdb207337ab18e5904f30ab74b6eb48bb312 Mon Sep 17 00:00:00 2001 From: Hoa Nguyen Date: Thu, 26 Nov 2020 05:04:45 -0800 Subject: [PATCH] mem-ruby: Update stats style for SimpleNetwork Change-Id: I7d54ed02d01a3811b41dce794e308b8b77576c92 Signed-off-by: Hoa Nguyen Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/38055 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/mem/ruby/network/simple/SimpleNetwork.cc | 35 ++++++++++----- src/mem/ruby/network/simple/SimpleNetwork.hh | 12 +++-- src/mem/ruby/network/simple/Switch.cc | 44 +++++++++++------- src/mem/ruby/network/simple/Switch.hh | 17 ++++--- src/mem/ruby/network/simple/Throttle.cc | 47 +++++++++++++------- src/mem/ruby/network/simple/Throttle.hh | 22 +++++---- 6 files changed, 117 insertions(+), 60 deletions(-) diff --git a/src/mem/ruby/network/simple/SimpleNetwork.cc b/src/mem/ruby/network/simple/SimpleNetwork.cc index 3a15a57a9..1cc6009f6 100644 --- a/src/mem/ruby/network/simple/SimpleNetwork.cc +++ b/src/mem/ruby/network/simple/SimpleNetwork.cc @@ -57,7 +57,8 @@ using namespace std; SimpleNetwork::SimpleNetwork(const Params &p) : Network(p), m_buffer_size(p.buffer_size), m_endpoint_bandwidth(p.endpoint_bandwidth), - m_adaptive_routing(p.adaptive_routing) + m_adaptive_routing(p.adaptive_routing), + networkStats(this) { // record the routers for (vector::const_iterator i = p.routers.begin(); @@ -144,24 +145,29 @@ SimpleNetwork::regStats() for (MessageSizeType type = MessageSizeType_FIRST; type < MessageSizeType_NUM; ++type) { - m_msg_counts[(unsigned int) type] - .name(name() + ".msg_count." + MessageSizeType_to_string(type)) - .flags(Stats::nozero) + networkStats.m_msg_counts[(unsigned int) type] = + new Stats::Formula(&networkStats, + csprintf("msg_count.%s", MessageSizeType_to_string(type)).c_str()); + networkStats.m_msg_counts[(unsigned int) type] + ->flags(Stats::nozero) ; - m_msg_bytes[(unsigned int) type] - .name(name() + ".msg_byte." + MessageSizeType_to_string(type)) - .flags(Stats::nozero) + + networkStats.m_msg_bytes[(unsigned int) type] = + new Stats::Formula(&networkStats, + csprintf("msg_byte.%s", MessageSizeType_to_string(type)).c_str()); + networkStats.m_msg_bytes[(unsigned int) type] + ->flags(Stats::nozero) ; // Now state what the formula is. for (int i = 0; i < m_switches.size(); i++) { - m_msg_counts[(unsigned int) type] += + *(networkStats.m_msg_counts[(unsigned int) type]) += sum(m_switches[i]->getMsgCount(type)); } - m_msg_bytes[(unsigned int) type] = - m_msg_counts[(unsigned int) type] * Stats::constant( - Network::MessageSizeType_to_int(type)); + *(networkStats.m_msg_bytes[(unsigned int) type]) = + *(networkStats.m_msg_counts[(unsigned int) type]) * + Stats::constant(Network::MessageSizeType_to_int(type)); } } @@ -213,3 +219,10 @@ SimpleNetwork::functionalWrite(Packet *pkt) } return num_functional_writes; } + +SimpleNetwork:: +NetworkStats::NetworkStats(Stats::Group *parent) + : Stats::Group(parent) +{ + +} \ No newline at end of file diff --git a/src/mem/ruby/network/simple/SimpleNetwork.hh b/src/mem/ruby/network/simple/SimpleNetwork.hh index aee5ef553..e76b7d1be 100644 --- a/src/mem/ruby/network/simple/SimpleNetwork.hh +++ b/src/mem/ruby/network/simple/SimpleNetwork.hh @@ -90,9 +90,15 @@ class SimpleNetwork : public Network const int m_endpoint_bandwidth; const bool m_adaptive_routing; - //Statistical variables - Stats::Formula m_msg_counts[MessageSizeType_NUM]; - Stats::Formula m_msg_bytes[MessageSizeType_NUM]; + + struct NetworkStats : public Stats::Group + { + NetworkStats(Stats::Group *parent); + + //Statistical variables + Stats::Formula* m_msg_counts[MessageSizeType_NUM]; + Stats::Formula* m_msg_bytes[MessageSizeType_NUM]; + } networkStats; }; inline std::ostream& diff --git a/src/mem/ruby/network/simple/Switch.cc b/src/mem/ruby/network/simple/Switch.cc index 68887ac8f..cab101fad 100644 --- a/src/mem/ruby/network/simple/Switch.cc +++ b/src/mem/ruby/network/simple/Switch.cc @@ -52,8 +52,9 @@ using namespace std; using m5::stl_helpers::operator<<; Switch::Switch(const Params &p) - : BasicRouter(p), perfectSwitch(m_id, this, p.virt_nets), - m_num_connected_buffers(0) + : BasicRouter(p), + perfectSwitch(m_id, this, p.virt_nets), m_num_connected_buffers(0), + switchStats(this) { m_port_buffers.reserve(p.port_buffers.size()); for (auto& buffer : p.port_buffers) { @@ -108,32 +109,35 @@ Switch::regStats() BasicRouter::regStats(); for (auto& throttle : throttles) { - throttle.regStats(name()); + throttle.regStats(); } - m_avg_utilization.name(name() + ".percent_links_utilized"); for (const auto& throttle : throttles) { - m_avg_utilization += throttle.getUtilization(); + switchStats.m_avg_utilization += throttle.getUtilization(); } - m_avg_utilization /= Stats::constant(throttles.size()); + switchStats.m_avg_utilization /= Stats::constant(throttles.size()); for (unsigned int type = MessageSizeType_FIRST; type < MessageSizeType_NUM; ++type) { - m_msg_counts[type] - .name(name() + ".msg_count." + - MessageSizeType_to_string(MessageSizeType(type))) - .flags(Stats::nozero) + switchStats.m_msg_counts[type] = new Stats::Formula(&switchStats, + csprintf("msg_count.%s", + MessageSizeType_to_string(MessageSizeType(type))).c_str()); + switchStats.m_msg_counts[type] + ->flags(Stats::nozero) ; - m_msg_bytes[type] - .name(name() + ".msg_bytes." + - MessageSizeType_to_string(MessageSizeType(type))) - .flags(Stats::nozero) + + switchStats.m_msg_bytes[type] = new Stats::Formula(&switchStats, + csprintf("msg_bytes.%s", + MessageSizeType_to_string(MessageSizeType(type))).c_str()); + switchStats.m_msg_bytes[type] + ->flags(Stats::nozero) ; for (const auto& throttle : throttles) { - m_msg_counts[type] += throttle.getMsgCount(type); + *(switchStats.m_msg_counts[type]) += throttle.getMsgCount(type); } - m_msg_bytes[type] = m_msg_counts[type] * Stats::constant( + *(switchStats.m_msg_bytes[type]) = + *(switchStats.m_msg_counts[type]) * Stats::constant( Network::MessageSizeType_to_int(MessageSizeType(type))); } } @@ -183,3 +187,11 @@ Switch::functionalWrite(Packet *pkt) } return num_functional_writes; } + +Switch:: +SwitchStats::SwitchStats(Stats::Group *parent) + : Stats::Group(parent), + m_avg_utilization(this, "percent_links_utilized") +{ + +} diff --git a/src/mem/ruby/network/simple/Switch.hh b/src/mem/ruby/network/simple/Switch.hh index aac595206..a9502b946 100644 --- a/src/mem/ruby/network/simple/Switch.hh +++ b/src/mem/ruby/network/simple/Switch.hh @@ -73,7 +73,7 @@ class Switch : public BasicRouter void collateStats(); void regStats(); const Stats::Formula & getMsgCount(unsigned int type) const - { return m_msg_counts[type]; } + { return *(switchStats.m_msg_counts[type]); } void print(std::ostream& out) const; void init_net_ptr(SimpleNetwork* net_ptr) { m_network_ptr = net_ptr; } @@ -93,10 +93,17 @@ class Switch : public BasicRouter unsigned m_num_connected_buffers; std::vector m_port_buffers; - // Statistical variables - Stats::Formula m_avg_utilization; - Stats::Formula m_msg_counts[MessageSizeType_NUM]; - Stats::Formula m_msg_bytes[MessageSizeType_NUM]; + + public: + struct SwitchStats : public Stats::Group + { + SwitchStats(Stats::Group *parent); + + // Statistical variables + Stats::Formula m_avg_utilization; + Stats::Formula* m_msg_counts[MessageSizeType_NUM]; + Stats::Formula* m_msg_bytes[MessageSizeType_NUM]; + } switchStats; }; inline std::ostream& diff --git a/src/mem/ruby/network/simple/Throttle.cc b/src/mem/ruby/network/simple/Throttle.cc index 5ed918c6b..5b0206b76 100644 --- a/src/mem/ruby/network/simple/Throttle.cc +++ b/src/mem/ruby/network/simple/Throttle.cc @@ -51,8 +51,10 @@ static int network_message_to_size(Message* net_msg_ptr); Throttle::Throttle(int sID, RubySystem *rs, NodeID node, Cycles link_latency, int link_bandwidth_multiplier, int endpoint_bandwidth, Switch *em) - : Consumer(em), m_switch_id(sID), m_switch(em), m_node(node), - m_ruby_system(rs) + : Consumer(em), + m_switch_id(sID), m_switch(em), m_node(node), + m_ruby_system(rs), + throttleStats(em, node) { m_vnets = 0; @@ -122,7 +124,8 @@ Throttle::operateVnet(int vnet, int &bw_remaining, bool &schedule_wakeup, m_switch->cyclesToTicks(m_link_latency)); // Count the message - m_msg_counts[net_msg_ptr->getMessageSize()][vnet]++; + (*(throttleStats. + m_msg_counts[net_msg_ptr->getMessageSize()]))[vnet]++; DPRINTF(RubyNetwork, "%s\n", *out); } @@ -200,26 +203,27 @@ Throttle::wakeup() } void -Throttle::regStats(string parent) +Throttle::regStats() { - m_link_utilization - .name(parent + csprintf(".throttle%i", m_node) + ".link_utilization"); - for (MessageSizeType type = MessageSizeType_FIRST; type < MessageSizeType_NUM; ++type) { - m_msg_counts[(unsigned int)type] - .init(Network::getNumberOfVirtualNetworks()) - .name(parent + csprintf(".throttle%i", m_node) + ".msg_count." + - MessageSizeType_to_string(type)) + throttleStats.m_msg_counts[(unsigned int)type] = + new Stats::Vector(&throttleStats, + csprintf("msg_count.%s", MessageSizeType_to_string(type)).c_str()); + throttleStats.m_msg_counts[(unsigned int)type] + ->init(Network::getNumberOfVirtualNetworks()) .flags(Stats::nozero) ; - m_msg_bytes[(unsigned int) type] - .name(parent + csprintf(".throttle%i", m_node) + ".msg_bytes." + - MessageSizeType_to_string(type)) - .flags(Stats::nozero) + + throttleStats.m_msg_bytes[(unsigned int) type] = + new Stats::Formula(&throttleStats, + csprintf("msg_bytes.%s", MessageSizeType_to_string(type)).c_str()); + throttleStats.m_msg_bytes[(unsigned int) type] + ->flags(Stats::nozero) ; - m_msg_bytes[(unsigned int) type] = m_msg_counts[type] * Stats::constant( + *(throttleStats.m_msg_bytes[(unsigned int) type]) = + *(throttleStats.m_msg_counts[type]) * Stats::constant( Network::MessageSizeType_to_int(type)); } } @@ -236,7 +240,8 @@ Throttle::collateStats() double time_delta = double(m_ruby_system->curCycle() - m_ruby_system->getStartCycle()); - m_link_utilization = 100.0 * m_link_utilization_proxy / time_delta; + throttleStats.m_link_utilization = + 100.0 * m_link_utilization_proxy / time_delta; } void @@ -259,3 +264,11 @@ network_message_to_size(Message *net_msg_ptr) return size; } + +Throttle:: +ThrottleStats::ThrottleStats(Stats::Group *parent, const NodeID &nodeID) + : Stats::Group(parent, csprintf("throttle%02i", nodeID).c_str()), + m_link_utilization(this, "link_utilization") +{ + +} diff --git a/src/mem/ruby/network/simple/Throttle.hh b/src/mem/ruby/network/simple/Throttle.hh index bf70c3075..0d92041e3 100644 --- a/src/mem/ruby/network/simple/Throttle.hh +++ b/src/mem/ruby/network/simple/Throttle.hh @@ -66,9 +66,9 @@ class Throttle : public Consumer // The average utilization (a fraction) since last clearStats() const Stats::Scalar & getUtilization() const - { return m_link_utilization; } + { return throttleStats.m_link_utilization; } const Stats::Vector & getMsgCount(unsigned int type) const - { return m_msg_counts[type]; } + { return *(throttleStats.m_msg_counts[type]); } int getLinkBandwidth() const { return m_endpoint_bandwidth * m_link_bandwidth_multiplier; } @@ -77,7 +77,7 @@ class Throttle : public Consumer void clearStats(); void collateStats(); - void regStats(std::string name); + void regStats(); void print(std::ostream& out) const; private: @@ -105,12 +105,18 @@ class Throttle : public Consumer int m_endpoint_bandwidth; RubySystem *m_ruby_system; - // Statistical variables - Stats::Scalar m_link_utilization; - Stats::Vector m_msg_counts[MessageSizeType_NUM]; - Stats::Formula m_msg_bytes[MessageSizeType_NUM]; - double m_link_utilization_proxy; + + + struct ThrottleStats : public Stats::Group + { + ThrottleStats(Stats::Group *parent, const NodeID &nodeID); + + // Statistical variables + Stats::Scalar m_link_utilization; + Stats::Vector* m_msg_counts[MessageSizeType_NUM]; + Stats::Formula* m_msg_bytes[MessageSizeType_NUM]; + } throttleStats; }; inline std::ostream& -- 2.30.2