Thank you Hartmut! I'll be double checking the issue today.

V/r,
Chris

On Fri, May 12, 2017 at 7:41 PM, Hartmut Kaiser <[email protected]>
wrote:

> Chris,
>
> > I'm doing some experiments with hpx::dataflow and would like to
> > recursively "chain" a dataflow for execution over a distributed vector of
> > size_t elements.
> > Sample code is provided below (apologies if it's not a perfect compile):
> > static void run(
> >   std::string nom,
> >   size_t v) {
> >   hpx::cout << v << hpx::endl;
> > }
> >
> > HPX_PLAIN_ACTION(run, run_action);
> >
> > static hpx::future<void> run_dataflow(
> >   std::string nom,
> >   hpx::partitioned_vector<size_t> &arr,
> >   std::vector<hpx::id_type> locs,
> >   std::vector<size_t>::iterator curr,
> >   std::vector<size_t>::iterator end) {
> > hpx::future<void> res = (curr != end) ? run_dataflow(nom, arr, locs,
> > std::next(curr), end) : hpx::make_ready_future();
> > return hpx::dataflow(
> >   hpx::util::unwrapped([nom, &arr, localities, &curr] () ->
> > hpx::future<void> {
> >     size_t v = *c;
> >     return hpx::async<run_action>(localities[arr.get_partition(v)], nom,
> > v);
> >   }),
> >   std::move(res) );
> >
> > }
> >
> > int main(int argc, char **argv) {
> > ... /* dvec_size is defined up here */ ...
> >
> > std::vector<hpx::id_type> locs = hpx::find_all_localities();
> > std::string nom = "arr_nom";
> > hpx::partitioned_vector<size_t> arr(dvec_size,
> > hpx::container_layout(locs));
> > arr.register_as(nom);
> >
> > std::vector<size_t> pos;
> > std::iota(
> >   std::begin(pos),
> >   std::end(pos),
> >   dvec_size);
> >
> > hpx::future<void> fd = run_dataflow(
> >   nom,
> >   arr,
> >   std::begin(pos),
> >   std::end(pos) );
> > fd.wait();
> >
> > }
> > I've been getting a runtime errors for this code (segmentation fault) -
> > this is probably a semi-trivial bug or misunderstanding on my part - any
> > help/assistance would be appreciated. (I'm compiling against HPX with
> MPI)
>
> The main reason for this kind of problems is that variables which are
> captured by reference into a lambda (or similar) go out of scope before the
> lambda itself is being executed:
>
> void foo()
> {
>     vector<int> bar = {...};
>     return async([&bar]() { bar.push_back(42); });
> }
>
> foo();
>
> In this example, the variable 'bar' is not valid anymore when the lambda
> (which is scheduled as a new thread) is eventually executed. Please note,
> that dataflow() runs the function passed to it on a new thread as well.
>
> I'd assume that in your example the variable 'arr' goes out of scope
> before the lambda referencing it is run.
>
> HTH
> Regards Hartmut
> ---------------
> http://boost-spirit.com
> http://stellar.cct.lsu.edu
>
>
> >
> > V/r,
> > Chris
>
> _______________________________________________
> 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