Am 17.11.2015 10:10 nachm. schrieb "Hartmut Kaiser" <
[email protected]>:
>
>
> > So, Zach and I have hit the same error when interfacing dg-swem with
> > HPX+LGD, but here we weren't able to work around it via adding -O3.
> > Any ideas for another workaround?
> >
> > Thomas said he's suspecting a bug in HPX, but I can't really figure
> > out what's going wrong.
>
> As said, I don't understand what you're doing with that code. The
> component-registry stuff is very subtle to get right and I don't see any
> obvious reason you create your own.

Does it work when you use the HPX provided registration macros?

>
> Regards Hartmut
> ---------------
> http://boost-spirit.com
> http://stellar.cct.lsu.edu
>
>
> >
> > Thanks!
> > -Andreas
> >
> >
> > On 23:49 Sun 15 Nov     , Andreas Schäfer wrote:
> > > Heya,
> > >
> > > I've recently seen some of my HPX applications terminating right
> > > before hpx_init() is called. Strangely the build system did seem to
> > > determine whether the same code would either run flawlessly, or crash.
> > >
> > > Please find attached a (sort of) minimal example that reproduces the
> > > error. Below is a log of me compiling the code manually. The only
> > > difference here is that for the first run I did add -O3, for the
> > > second run that option was omitted. Any ideas what's going on here?
> > >
> > > > gentryx@neuromancer ~ $ time (rm -f test_hpx &&
> > /usr/lib64/ccache/bin/g++-4.9.3 -O3
-L/home/gentryx/local_install/lib -
> > lhpx test_hpx.cpp   -o test_hpx -std=c++11 -
> > I/home/gentryx/local_install/include -
> > I/home/gentryx/local_install/include/hpx/external -lboost_chrono -
> > lboost_date_time -lboost_filesystem -lboost_program_options
-lboost_system
> > -lboost_thread -lhpx_init -lhpx -ldl -lrt &&
> > LD_LIBRARY_PATH=/home/gentryx/local_install/lib  &&
> > LD_LIBRARY_PATH=/home/gentryx/local_install/lib  ./test_hpx)
> > > > ok
> > > >
> > > > real    0m28.162s
> > > > user    0m27.490s
> > > > sys     0m0.630s
> > > >
> > > > 23:43:58 - 0
> > > > gentryx@neuromancer ~ $ time (rm -f test_hpx &&
> > /usr/lib64/ccache/bin/g++-4.9.3    -L/home/gentryx/local_install/lib
-lhpx
> > test_hpx.cpp   -o test_hpx -std=c++11 -
> > I/home/gentryx/local_install/include -
> > I/home/gentryx/local_install/include/hpx/external -lboost_chrono -
> > lboost_date_time -lboost_filesystem -lboost_program_options
-lboost_system
> > -lboost_thread -lhpx_init -lhpx -ldl -lrt &&
> > LD_LIBRARY_PATH=/home/gentryx/local_install/lib  &&
> > LD_LIBRARY_PATH=/home/gentryx/local_install/lib  ./test_hpx)
> > > > terminate called after throwing an instance of
> >
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_i
> > njector<hpx::exception> >'
> > > >   what():  attempt to insert a GVA with an invalid type,
> > gid({0000000100000001, 0000000000000001}), gva(({0000000100000000,
> > 0000000000000000} component_invalid[-1] 1 0xa41640 0)),
> > locality({0000000100000000, 0000000000000000}): HPX(bad_parameter)
> > > >
> > > > real    0m22.700s
> > > > user    0m21.910s
> > > > sys     0m0.740s
> > > >
> > > > 23:44:41 - 134
> > >
> > > Thanks!
> > > -Andreas
> > >
> > >
> > > --
> > > ==========================================================
> > > Andreas Schäfer
> > > HPC and Grid Computing
> > > Department of Computer Science 3
> > > Friedrich-Alexander-Universität Erlangen-Nürnberg, Germany
> > > +49 9131 85-27910
> > > PGP/GPG key via keyserver
> > > http://www.libgeodecomp.org
> > > ==========================================================
> > >
> > > (\___/)
> > > (+'.'+)
> > > (")_(")
> > > This is Bunny. Copy and paste Bunny into your
> > > signature to help him gain world domination!
> >
> > > #include <iostream>
> > > #include <hpx/hpx.hpp>
> > >
> > > #include <hpx/include/components.hpp>
> > > #include <hpx/lcos/broadcast.hpp>
> > > #include <hpx/lcos/local/receive_buffer.hpp>
> > > #include <hpx/runtime/get_ptr.hpp>
> > >
> > > namespace {
> > > template<typename COMPONENT>
> > > class hpx_plugin_exporter_factory;
> > >
> > > template<typename COMPONENT>
> > > class init_registry_factory_static;
> > >
> > > template<typename T>
> > > class hpx_plugin_exporter_registry;
> > >
> > > }
> > >
> > > namespace LibGeoDecomp {
> > >
> > > /**
> > >  * Instantiate this template to ensure the instantiation of an HPX
> > >  * component template is actually registered. See HPXReceiver for an
> > >  * example on how to use this class and its assorted macros.
> > >  */
> > > template<typename COMPONENT>
> > > class HPXComponentRegistrator
> > > {
> > > public:
> > >     virtual ~HPXComponentRegistrator()
> > >     {}
> > >
> > >     static
> >
hpx::components::component_factory<hpx::components::simple_component<COMPO
> > NENT> > *instanceA;
> > >     static hpx::components::component_registry<
> > hpx::components::simple_component<COMPONENT>,
> > ::hpx::components::factory_check> *instanceB;
> > >
> > >     virtual
> >
hpx::components::component_factory<hpx::components::simple_component<COMPO
> > NENT> > *foo1()
> > >     {
> > >         instanceA = new
> >
hpx::components::component_factory<hpx::components::simple_component<COMPO
> > NENT> >(0, 0, false);
> > >         return instanceA;
> > >     }
> > >
> > >     virtual hpx::components::component_registry<
> > hpx::components::simple_component<COMPONENT>,
> > ::hpx::components::factory_check> *foo2()
> > >     {
> > >         instanceB = new hpx::components::component_registry<
> > hpx::components::simple_component<COMPONENT>,
> > ::hpx::components::factory_check>();
> > >         return instanceB;
> > >     }
> > > };
> > >
> > > template<typename COMPONENT>
> > >
> >
hpx::components::component_factory<hpx::components::simple_component<COMPO
> > NENT> > *HPXComponentRegistrator<COMPONENT>::instanceA;
> > >
> > > template<typename COMPONENT>
> > > hpx::components::component_registry<
> > hpx::components::simple_component<COMPONENT>,
> > ::hpx::components::factory_check>
> > *HPXComponentRegistrator<COMPONENT>::instanceB;
> > >
> > > }
> > >
> > > // fixme: lacks deletion of parentheses
> > > #define LIBGEODECOMP_REGISTER_HPX_COMPONENT_TEMPLATE(PARAMS, TEMPLATE)
> > \
> > >     extern "C" __attribute__((visibility ("default")))
> > \
> > >     std::map<std::string, boost::any> *
> > hpx_exported_plugins_list_hpx_factory(); \
> > >
> > \
> > >     namespace {
> > \
> > >
> > \
> > >     template<typename COMPONENT>
> > \
> > >     class hpx_plugin_exporter_factory;
> > \
> > >
> > \
> > >     template<PARAMS>
> > \
> > >     class hpx_plugin_exporter_factory<TEMPLATE > \
> > >     {
> > \
> > >     public:
> > \
> > >         hpx_plugin_exporter_factory()
> > \
> > >         {
> > \
> > >             static hpx::util::plugin::concrete_factory<
> > hpx::components::component_factory_base,
> >
hpx::components::component_factory<hpx::components::simple_component<TEMPL
> > ATE>> > cf; \
> > >
> >
hpx::util::plugin::abstract_factory<hpx::components::component_factory_bas
> > e>* w = &cf; \
> > >
> > \
> > >             std::string
> > actname(typeid(hpx::components::simple_component<TEMPLATE>).name()); \
> > >             boost::algorithm::to_lower(actname);
> > \
> > >             hpx_exported_plugins_list_hpx_factory()->insert(
> > std::make_pair(actname, w)); \
> > >         }
> > \
> > >
> > \
> > >         static hpx_plugin_exporter_factory instance;
> > \
> > >     };
> > \
> > >
> > \
> > >     template<PARAMS>
> > \
> > >     hpx_plugin_exporter_factory<TEMPLATE>
> > hpx_plugin_exporter_factory<TEMPLATE>::instance; \
> > >
> > \
> > >     }
> > \
> > >
> > \
> > >     extern "C" __attribute__((visibility ("default")))
> > \
> > >     std::map<std::string, boost::any>*
> > hpx_exported_plugins_list_hpx_factory(); \
> > >
> > \
> > >     namespace {
> > \
> > >
> > \
> > >     template<typename COMPONENT>
> > \
> > >     class init_registry_factory_static;
> > \
> > >
> > \
> > >     template<PARAMS>
> > \
> > >     class init_registry_factory_static<TEMPLATE >
> > \
> > >     {
> > \
> > >     public:
> > \
> > >         init_registry_factory_static<TEMPLATE>()
> > \
> > >         {
> > \
> > >             hpx::components::static_factory_load_data_type data = {
> > typeid(hpx::components::simple_component<TEMPLATE>).name(),
> > hpx_exported_plugins_list_hpx_factory }; \
> > >             hpx::components::init_registry_factory(data);
> > \
> > >         }
> > \
> > >
> > \
> > >         static init_registry_factory_static<TEMPLATE> instance;
> > \
> > >     };
> > \
> > >
> > \
> > >     template<PARAMS>
> > \
> > >     init_registry_factory_static<TEMPLATE>
> > init_registry_factory_static<TEMPLATE>::instance; \
> > >
> > \
> > >     }
> > \
> > >
> > \
> > >     namespace hpx {
> > \
> > >     namespace components {
> > \
> > >
> > \
> > >     template <PARAMS> struct
> >
unique_component_name<hpx::components::component_factory<hpx::components::
> > simple_component<TEMPLATE > > > \
> > >     {
> > \
> > >         typedef char const* type;
> > \
> > >
> > \
> > >         static type call(void)
> > \
> > >         {
> > \
> > >             return typeid(hpx::components::simple_component<TEMPLATE
> > >).name(); \
> > >         }
> > \
> > >     };
> > \
> > >
> > \
> > >     }
> > \
> > >     }
> > \
> > >
> > \
> > >     extern "C" __attribute__((visibility ("default")))
> > \
> > >     std::map<std::string, boost::any> *
> > hpx_exported_plugins_list_hpx_registry(); \
> > >
> > \
> > >     namespace {
> > \
> > >
> > \
> > >     template<typename T>
> > \
> > >     class hpx_plugin_exporter_registry;
> > \
> > >
> > \
> > >     template<PARAMS>
> > \
> > >     class hpx_plugin_exporter_registry<TEMPLATE> \
> > >     {
> > \
> > >     public:
> > \
> > >         hpx_plugin_exporter_registry()
> > \
> > >         {
> > \
> > >             static hpx::util::plugin::concrete_factory<
> > hpx::components::component_registry_base,
> >
hpx::components::component_registry<hpx::components::simple_component<TEMP
> > LATE>, ::hpx::components::factory_check> > cf; \
> > >
> >
hpx::util::plugin::abstract_factory<hpx::components::component_registry_ba
> > se>* w = &cf; \
> > >             std::string
> > actname(typeid(hpx::components::simple_component<TEMPLATE>).name()); \
> > >             boost::algorithm::to_lower(actname);
> > \
> > >             hpx_exported_plugins_list_hpx_registry()->insert(
> > std::make_pair(actname, w)); \
> > >         }
> > \
> > >
> > \
> > >         static hpx_plugin_exporter_registry instance;
> > \
> > >     };
> > \
> > >
> > \
> > >     template<PARAMS>
> > \
> > >     hpx_plugin_exporter_registry<TEMPLATE>
> > hpx_plugin_exporter_registry<TEMPLATE>::instance; \
> > >
> > \
> > >     }
> > \
> > >
> > \
> > >     namespace hpx {
> > \
> > >     namespace components {
> > \
> > >
> > \
> > >     template <PARAMS>
> > \
> > >     struct
> >
unique_component_name<hpx::components::component_registry<hpx::components:
> > :simple_component<TEMPLATE >, ::hpx::components::factory_check> > \
> > >     {
> > \
> > >         typedef char const* type;
> > \
> > >         static type call (void)
> > \
> > >         {
> > \
> > >             return typeid(hpx::components::simple_component<TEMPLATE
> > >).name(); \
> > >         }
> > \
> > >     };
> > \
> > >
> > \
> > >     }
> > \
> > >     }
> > \
> > >
> > \
> > >     namespace hpx {
> > \
> > >     namespace traits {
> > \
> > >
> > \
> > >     template<PARAMS, typename ENABLE>
> > \
> > >     __attribute__((visibility("default")))
> > \
> > >     components::component_type component_type_database<CARGO,
> > ENABLE>::get() \
> > >     {
> > \
> > >         return value;
> > \
> > >     }
> > \
> > >
> > \
> > >     template<PARAMS, typename ENABLE>
> > \
> > >     __attribute__((visibility("default")))
> > \
> > >     void component_type_database<CARGO, ENABLE>::set(
> > components::component_type t) \
> > >     {
> > \
> > >         value = t;
> > \
> > >     }
> > \
> > >
> > \
> > >     }
> > \
> > >     };
> > >
> > > #define
> > LIBGEODECOMP_REGISTER_HPX_COMPONENT_TEMPLATE_INSTANTIATIONS(TYPENAME) \
> > >     virtual hpx_plugin_exporter_factory<TYPENAME>
> > hpx_plugin_exporter_factory_registration() \
> > >     {
> > \
> > >         return hpx_plugin_exporter_factory<TYPENAME>::instance;
> > \
> > >     }
> > \
> > >
> > \
> > >     virtual init_registry_factory_static<TYPENAME>
> > hpx_init_registry_factory_static_registration() \
> > >     {
> > \
> > >         return init_registry_factory_static<TYPENAME>::instance;
> > \
> > >     }
> > \
> > >
> > \
> > >     virtual hpx_plugin_exporter_registry<TYPENAME>
> > hpx_plugin_exporter_registry_registration() \
> > >     {
> > \
> > >         return hpx_plugin_exporter_registry<TYPENAME>::instance;
> > \
> > >     }
> > >
> > > namespace LibGeoDecomp {
> > >
> > > template <typename CARGO, typename
> > BUFFER=hpx::lcos::local::receive_buffer<CARGO> >
> > > class DummyHPXReceiver : public
> > hpx::components::simple_component_base<DummyHPXReceiver<CARGO> >
> > > {
> > > public:
> > >     typedef CARGO Cargo;
> > >     typedef BUFFER Buffer;
> > >
> > >     static hpx::future<boost::shared_ptr<DummyHPXReceiver> >
make(const
> > std::string& name, std::size_t rank = 0)
> > >     {
> > >         HPXComponentRegistrator<DummyHPXReceiver>
> > thisEnsuresHPXRegistrationCodeIsRunPriorToComponentCreation;
> > >
> > >         hpx::id_type id =
> > hpx::new_<DummyHPXReceiver>(hpx::find_here()).get();
> > >         hpx::register_with_basename(name, id, rank).get();
> > >         return hpx::get_ptr<DummyHPXReceiver>(id);
> > >     }
> > >
> > >     static hpx::future<hpx::id_type> find(const std::string& name)
> > >     {
> > >         std::vector<hpx::future<hpx::id_type> > ids =
> > hpx::find_all_from_basename(name, 1);
> > >         if (ids.size() != 1) {
> > >             throw std::logic_error("Unexpected amount of
> > DummyHPXReceivers found in AGAS, expected exactly 1");
> > >         }
> > >
> > >         return std::move(ids[0]);
> > >     }
> > >
> > >     static std::vector<hpx::future<hpx::id_type> > find_all(const
> > std::string& name, std::size_t num)
> > >     {
> > >         std::vector<hpx::future<hpx::id_type> > ids =
> > hpx::find_all_from_basename(name, num);
> > >         if (ids.size() != num) {
> > >             throw std::logic_error("Unexpected amount of
> > DummyHPXReceivers found in AGAS, exected exactly ");
> > >         }
> > >
> > >         return ids;
> > >     }
> > >
> > >     static std::vector<CARGO> allGather(
> > >         const CARGO& data,
> > >         std::size_t rank,
> > >         std::size_t size,
> > >         const std::string& name)
> > >     {
> > >         auto receiver = DummyHPXReceiver<CARGO>::make(name,
rank).get();
> > >         std::vector<hpx::future<hpx::id_type> > futures =
> > DummyHPXReceiver<CARGO>::find_all(name, size);
> > >         std::vector<hpx::id_type> ids =
> > hpx::util::unwrapped(std::move(futures));
> > >         std::vector<CARGO> vec;
> > >         vec.reserve(size);
> > >
> > >         hpx::future<void> future = hpx::lcos::broadcast<typename
> > DummyHPXReceiver::receiveAction>(ids, rank, data);
> > >         future.wait();
> > >
> > >         for (std::size_t i = 0; i < size; ++i) {
> > >             vec << receiver->get(i).get();
> > >         }
> > >
> > >         return std::move(vec);
> > >     }
> > >
> > >     virtual ~DummyHPXReceiver()
> > >     {}
> > >
> > >     void receive(std::size_t step, Cargo&& val)
> > >     {
> > >         buffer.store_received(step, std::forward<Cargo>(val));
> > >     }
> > >     HPX_DEFINE_COMPONENT_ACTION(DummyHPXReceiver, receive,
> > receiveAction);
> > >
> > >     hpx::future<Cargo> get(std::size_t step)
> > >     {
> > >         return buffer.receive(step);
> > >     }
> > >
> > > private:
> > >     Buffer buffer;
> > >
> > >
> >
LIBGEODECOMP_REGISTER_HPX_COMPONENT_TEMPLATE_INSTANTIATIONS(DummyHPXReceiv
> > er);
> > > };
> > >
> > > }
> > >
> > > LIBGEODECOMP_REGISTER_HPX_COMPONENT_TEMPLATE(typename CARGO,
> > LibGeoDecomp::DummyHPXReceiver<CARGO>)
> > >
> > > using namespace LibGeoDecomp;
> > >
> > > int hpx_main(int argc, char **argv)
> > > {
> > >     std::cout << "ok\n";
> > >     std::string name = "foo";
> > >     int rank = 0;
> > >     int size = 1;
> > >
> > >     auto receiver = DummyHPXReceiver<int>::make(name, rank).get();
> > >         std::vector<hpx::future<hpx::id_type> > futures =
> > DummyHPXReceiver<int>::find_all(name, size);
> > >         std::vector<hpx::id_type> ids =
> > hpx::util::unwrapped(std::move(futures));
> > >         std::vector<int> vec;
> > >         vec.reserve(size);
> > >
> > >         hpx::future<void> future =
> > hpx::lcos::broadcast<DummyHPXReceiver<int>::receiveAction>(ids, rank,
> > rank);
> > >
> > >         // CoordBox<2> ownBoundingBox;
> > >     // std::string broadcastName = "foobar";
> > >     // HPXReceiver<CoordBox<2> >::allGather(ownBoundingBox, rank,
size,
> > broadcastName);
> > >
> > >     return hpx::finalize();
> > > }
> > >
> > > int main(int argc, char **argv)
> > > {
> > >     std::vector<std::string> config(1, "hpx.run_hpx_main!=1");
> > >     return hpx::init(argc, argv, config);
> > >
> > > }
> >
> >
> > --
> > ==========================================================
> > Andreas Schäfer
> > HPC and Grid Computing
> > Department of Computer Science 3
> > Friedrich-Alexander-Universität Erlangen-Nürnberg, Germany
> > +49 9131 85-27910
> > PGP/GPG key via keyserver
> > http://www.libgeodecomp.org
> > ==========================================================
> >
> > (\___/)
> > (+'.'+)
> > (")_(")
> > This is Bunny. Copy and paste Bunny into your
> > signature to help him gain world domination!
>
> _______________________________________________
> hpx-users mailing list
> [email protected]
> https://mail.cct.lsu.edu/mailman/listinfo/hpx-users
_______________________________________________
hpx-users mailing list
[email protected]
https://mail.cct.lsu.edu/mailman/listinfo/hpx-users

Reply via email to