Hi all, I got a compilation error after pulling in some latest changesets. Does anyone see the same error?
build/ARM/base/statistics.hh:330: undefined reference to `Stats::DataWrap<Stats::Vector, Stats::VectorInfoProxy>::operator=(Stats::DataWrap<Stats::Vector, Stats::VectorInfoProxy> const&)' collect2: ld returned 1 exit status scons: *** [build/ARM/gem5.opt] Error 1 Best, Xiangyu -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Nilay Vaish Sent: Friday, September 06, 2013 2:23 PM To: [email protected] Subject: [gem5-dev] changeset in gem5: ruby: network: convert to gem5 style stats changeset 9483739f83ee in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=9483739f83ee description: ruby: network: convert to gem5 style stats diffstat: src/base/statistics.hh | 6 + src/mem/ruby/network/Network.cc | 3 + src/mem/ruby/network/Network.hh | 26 +- src/mem/ruby/network/garnet/BaseGarnetNetwork.cc | 101 +++---- src/mem/ruby/network/garnet/BaseGarnetNetwork.hh | 24 +- src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc | 103 ++++---- src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh | 23 +- src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh | 21 +- src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc | 12 - src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.hh | 19 +- src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc | 4 +- src/mem/ruby/network/garnet/fixed-pipeline/Router_d.hh | 20 +- src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.hh | 21 +- src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc | 58 +--- src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh | 9 +- src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc | 19 +- src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh | 19 +- src/mem/ruby/network/orion/NetworkPower.cc | 46 +-- src/mem/ruby/network/simple/PerfectSwitch.cc | 39 +-- src/mem/ruby/network/simple/PerfectSwitch.hh | 7 +- src/mem/ruby/network/simple/SimpleNetwork.cc | 83 +---- src/mem/ruby/network/simple/SimpleNetwork.hh | 10 +- src/mem/ruby/network/simple/Switch.cc | 122 +++------ src/mem/ruby/network/simple/Switch.hh | 16 +- src/mem/ruby/network/simple/Throttle.cc | 65 ++-- src/mem/ruby/network/simple/Throttle.hh | 35 +- src/mem/ruby/system/System.cc | 3 - src/mem/ruby/system/System.hh | 3 - 28 files changed, 388 insertions(+), 529 deletions(-) diffs (truncated from 1597 to 300 lines): diff -r 54d6728d99cf -r 9483739f83ee src/base/statistics.hh --- a/src/base/statistics.hh Fri Sep 06 16:21:33 2013 -0500 +++ b/src/base/statistics.hh Fri Sep 06 16:21:35 2013 -0500 @@ -331,6 +331,12 @@ public: typedef InfoProxyType<Derived> Info; + DataWrapVec() + {} + + DataWrapVec(const DataWrapVec &ref) + {} + // The following functions are specific to vectors. If you use them // in a non vector context, you will get a nice compiler error! diff -r 54d6728d99cf -r 9483739f83ee src/mem/ruby/network/Network.cc --- a/src/mem/ruby/network/Network.cc Fri Sep 06 16:21:33 2013 -0500 +++ b/src/mem/ruby/network/Network.cc Fri Sep 06 16:21:35 2013 -0500 @@ -59,6 +59,9 @@ AbstractController *abs_cntrl = ext_link->params()->ext_node; abs_cntrl->initNetworkPtr(this); } + + // Register a callback function for combining the statistics + Stats::registerDumpCallback(new StatsCallback(this)); } void diff -r 54d6728d99cf -r 9483739f83ee src/mem/ruby/network/Network.hh --- a/src/mem/ruby/network/Network.hh Fri Sep 06 16:21:33 2013 -0500 +++ b/src/mem/ruby/network/Network.hh Fri Sep 06 16:21:35 2013 -0500 @@ -88,8 +88,7 @@ LinkDirection direction, const NetDest& routing_table_entry) = 0; - virtual void printStats(std::ostream& out) const = 0; - virtual void clearStats() = 0; + virtual void collateStats() = 0; virtual void print(std::ostream& out) const = 0; /* @@ -107,13 +106,30 @@ Network(const Network& obj); Network& operator=(const Network& obj); - protected: - const std::string m_name; - int m_nodes; + uint32_t m_nodes; static uint32_t m_virtual_networks; Topology* m_topology_ptr; static uint32_t m_control_msg_size; static uint32_t m_data_msg_size; + + private: + //! Callback class used for collating statistics from all the + //! controller of this type. + class StatsCallback : public Callback + { + private: + Network *ctr; + + public: + virtual ~StatsCallback() {} + + StatsCallback(Network *_ctr) + : ctr(_ctr) + { + } + + void process() {ctr->collateStats();} + }; }; inline std::ostream& diff -r 54d6728d99cf -r 9483739f83ee src/mem/ruby/network/garnet/BaseGarnetNetwork.cc --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc Fri Sep 06 16:21:33 2013 -0500 +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.cc Fri Sep 06 16:21:35 2013 -0500 @@ -71,17 +71,9 @@ m_in_use.resize(m_virtual_networks); m_ordered.resize(m_virtual_networks); - m_flits_received.resize(m_virtual_networks); - m_flits_injected.resize(m_virtual_networks); - m_network_latency.resize(m_virtual_networks); - m_queueing_latency.resize(m_virtual_networks); for (int i = 0; i < m_virtual_networks; i++) { m_in_use[i] = false; m_ordered[i] = false; - m_flits_received[i] = 0; - m_flits_injected[i] = 0; - m_network_latency[i] = 0.0; - m_queueing_latency[i] = 0.0; } for (int node = 0; node < m_nodes; node++) { @@ -121,60 +113,55 @@ } void -BaseGarnetNetwork::clearStats() +BaseGarnetNetwork::regStats() { -} + m_flits_received + .init(m_virtual_networks) + .name(name() + ".flits_received") + .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) + ; -void -BaseGarnetNetwork::printStats(ostream& out) const -{ - out << endl; - out << "Network Stats" << endl; - out << "-------------" << endl; - out << endl; - printPerformanceStats(out); - printLinkStats(out); - printPowerStats(out); -} + m_flits_injected + .init(m_virtual_networks) + .name(name() + ".flits_injected") + .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) + ; -void -BaseGarnetNetwork::printPerformanceStats(ostream& out) const -{ - int total_flits_injected = 0; - int total_flits_received = 0; - int total_network_latency = 0.0; - int total_queueing_latency = 0.0; + m_network_latency + .init(m_virtual_networks) + .name(name() + ".network_latency") + .flags(Stats::oneline) + ; + + m_queueing_latency + .init(m_virtual_networks) + .name(name() + ".queueing_latency") + .flags(Stats::oneline) + ; for (int i = 0; i < m_virtual_networks; i++) { - if (!m_in_use[i]) - continue; + m_flits_received.subname(i, csprintf("vnet-%i", i)); + m_flits_injected.subname(i, csprintf("vnet-%i", i)); + m_network_latency.subname(i, csprintf("vnet-%i", i)); + m_queueing_latency.subname(i, csprintf("vnet-%i", i)); + } - out << "[Vnet " << i << "]: flits injected = " - << m_flits_injected[i] << endl; - out << "[Vnet " << i << "]: flits received = " - << m_flits_received[i] << endl; - out << "[Vnet " << i << "]: average network latency = " - << ((double) m_network_latency[i] / (double) m_flits_received[i]) - << endl; - out << "[Vnet " << i << "]: average queueing (at source NI) latency = " - << ((double) m_queueing_latency[i] / (double) m_flits_received[i]) - << endl; + m_avg_vnet_latency + .name(name() + ".average_vnet_latency") + .flags(Stats::oneline); + m_avg_vnet_latency = m_network_latency / m_flits_received; - out << endl; - total_flits_injected += m_flits_injected[i]; - total_flits_received += m_flits_received[i]; - total_network_latency += m_network_latency[i]; - total_queueing_latency += m_queueing_latency[i]; - } - out << "Total flits injected = " << total_flits_injected << endl; - out << "Total flits received = " << total_flits_received << endl; - out << "Average network latency = " - << ((double) total_network_latency/ (double) total_flits_received) << endl; - out << "Average queueing (at source NI) latency = " - << ((double) total_queueing_latency/ (double) total_flits_received) << endl; - out << "Average latency = " - << ((double) (total_queueing_latency + total_network_latency) / - (double) total_flits_received)<< endl; - out << "-------------" << endl; - out << endl; + m_avg_vqueue_latency + .name(name() + ".average_vqueue_latency") + .flags(Stats::oneline); + m_avg_vqueue_latency = m_queueing_latency / m_flits_received; + + m_avg_network_latency.name(name() + ".average_network_latency"); + m_avg_network_latency = sum(m_network_latency) / + sum(m_flits_received); + + m_avg_queueing_latency.name(name() + ".average_queueing_latency"); + m_avg_queueing_latency = sum(m_queueing_latency) / + sum(m_flits_received); + + m_avg_latency.name(name() + ".average_latency"); + m_avg_latency = m_avg_network_latency + m_avg_queueing_latency; } diff -r 54d6728d99cf -r 9483739f83ee src/mem/ruby/network/garnet/BaseGarnetNetwork.hh --- a/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh Fri Sep 06 16:21:33 2013 -0500 +++ b/src/mem/ruby/network/garnet/BaseGarnetNetwork.hh Fri Sep 06 16:21:35 2013 -0500 @@ -80,27 +80,31 @@ virtual void checkNetworkAllocation(NodeID id, bool ordered, int network_num, std::string vnet_type) = 0; - void clearStats(); - void printStats(std::ostream& out) const; - void printPerformanceStats(std::ostream& out) const; - virtual void printLinkStats(std::ostream& out) const = 0; - virtual void printPowerStats(std::ostream& out) const = 0; + virtual void regStats(); + virtual void collateStats() {} protected: int m_ni_flit_size; int m_vcs_per_vnet; bool m_enable_fault_model; - std::vector<int> m_flits_received; - std::vector<int> m_flits_injected; - std::vector<double> m_network_latency; - std::vector<double> m_queueing_latency; - std::vector<bool> m_in_use; std::vector<bool> m_ordered; std::vector<std::vector<MessageBuffer*> > m_toNetQueues; std::vector<std::vector<MessageBuffer*> > m_fromNetQueues; + + // Statistical variables + Stats::Vector m_flits_received; + Stats::Vector m_flits_injected; + Stats::Vector m_network_latency; + Stats::Vector m_queueing_latency; + + Stats::Formula m_avg_vnet_latency; + Stats::Formula m_avg_vqueue_latency; + Stats::Formula m_avg_network_latency; + Stats::Formula m_avg_queueing_latency; + Stats::Formula m_avg_latency; }; #endif // __MEM_RUBY_NETWORK_GARNET_BASEGARNETNETWORK_HH__ diff -r 54d6728d99cf -r 9483739f83ee src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Fri Sep 06 16:21:33 2013 -0500 +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Fri Sep 06 16:21:35 2013 -0500 @@ -221,81 +221,82 @@ } void -GarnetNetwork_d::printLinkStats(ostream& out) const +GarnetNetwork_d::regStats() { - double average_link_utilization = 0; - vector<double> average_vc_load; - average_vc_load.resize(m_virtual_networks*m_vcs_per_vnet); + BaseGarnetNetwork::regStats(); + regLinkStats(); + regPowerStats(); +} - for (int i = 0; i < m_virtual_networks*m_vcs_per_vnet; i++) { - average_vc_load[i] = 0; - } +void +GarnetNetwork_d::regLinkStats() +{ + m_average_link_utilization.name(name() + ".avg_link_utilization"); - out << endl; + m_average_vc_load + .init(m_virtual_networks * m_vcs_per_vnet) + .name(name() + ".avg_vc_load") + .flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline) + ; +} + +void +GarnetNetwork_d::regPowerStats() +{ + m_dynamic_link_power.name(name() + ".link_dynamic_power"); + m_static_link_power.name(name() + ".link_static_power"); + + m_total_link_power.name(name() + ".link_total_power"); + m_total_link_power = m_dynamic_link_power + m_static_link_power; + + m_dynamic_router_power.name(name() + ".router_dynamic_power"); + m_static_router_power.name(name() + ".router_static_power"); + m_clk_power.name(name() + ".clk_power"); + + m_total_router_power.name(name() + ".router_total_power"); + m_total_router_power = m_dynamic_router_power + + m_static_router_power + + m_clk_power; } + _______________________________________________ gem5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/gem5-dev _______________________________________________ gem5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/gem5-dev
