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.

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_injector<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<COMPONENT>
>  > *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<COMPONENT>
>  > *foo1()
>     {
>         instanceA = new 
> hpx::components::component_factory<hpx::components::simple_component<COMPONENT>
>  >(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<COMPONENT>
>  > *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<TEMPLATE>>
>  > cf; \
>             
> hpx::util::plugin::abstract_factory<hpx::components::component_factory_base>* 
> 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<TEMPLATE>,
>  ::hpx::components::factory_check> > cf; \
>             
> hpx::util::plugin::abstract_factory<hpx::components::component_registry_base>*
>  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(DummyHPXReceiver);
> };
> 
> }
> 
> 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!

Attachment: signature.asc
Description: Digital signature

_______________________________________________
hpx-users mailing list
[email protected]
https://mail.cct.lsu.edu/mailman/listinfo/hpx-users

Reply via email to