Hey guys,
I was just able to reproduce this linker error and Nilay helped to find a
fix for it. Here's the full error message:
build/MOESI_hammer/mem/ruby/network/simple/SimpleNetwork.o: In function
`operator=':
/home/joel/research/gem5/gem5-latest/build/MOESI_hammer/base/statistics.hh:330:
undefined reference to `Stats::DataWrap<Stats::Formula,
Stats::FormulaInfoProxy>::operator=(Stats::DataWrap<Stats::Formula,
Stats::FormulaInfoProxy> const&)'
build/MOESI_hammer/mem/ruby/network/simple/Throttle.o: In function
`operator=':
/home/joel/research/gem5/gem5-latest/build/MOESI_hammer/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
The problem is that the operator= functions for the Throttle and
SimpleNetwork call the DataWrapVec operator= function, which isn't defined.
In gcc/g++ 4.4.7, this manifests in the linker error, while it appears
that later versions of gcc/g++ assume the operator= function to be empty
(Nilay is using 4.7.3).
The simple fix is to explicitly define the empty operator= in DataWrapVec:
-----------------------------
diff --git a/src/base/statistics.hh b/src/base/statistics.hh
--- a/src/base/statistics.hh
+++ b/src/base/statistics.hh
@@ -337,6 +337,9 @@
DataWrapVec(const DataWrapVec &ref)
{}
+ void operator=(const DataWrapVec &)
+ {}
+
// The following functions are specific to vectors. If you use them
// in a non vector context, you will get a nice compiler error!
-----------------------------
Joel
On Mon, Sep 9, 2013 at 12:32 PM, Rio Xiangyu Dong <[email protected]>wrote:
> 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
>
--
Joel Hestness
PhD Student, Computer Architecture
Dept. of Computer Science, University of Wisconsin - Madison
http://pages.cs.wisc.edu/~hestness/
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev