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

Reply via email to