Generalized operation completion for barrier_async and broadcast

Issue #234 resolved
Dan Bonachea created an issue

As of release 2019.3.2, barrier_async() and broadcast() still only implement future-based completion. This has been a documented non-compliance since the introduction of generalized completion in Jan 2018.

We should implement generalized operation completion (promise, as_lpc) for these collectives.

Demo:

#include <upcxx/upcxx.hpp>
#include <iostream>
#include <cassert>

using namespace upcxx;

int main() {
  init();

  int me = rank_me();

  promise<int> pi;
  reduce_all(rank_me(), op_fast_max, world(), operation_cx::as_promise(pi));

  promise<int> pi2;
  reduce_one(rank_me(), op_fast_max, 0, world(), operation_cx::as_promise(pi2));

#if 1
  promise<> p;
  barrier_async(world(), operation_cx::as_promise(p));

  promise<int> pi3;
  broadcast(42, 0, world(), operation_cx::as_promise(pi3));

  p.finalize().wait();

  int res3 = pi3.finalize().wait();
  assert(res3 == 42);
#endif

  int res = pi.finalize().wait();
  assert(res == (rank_n()-1));

  int res2 = pi2.finalize().wait();
  if (!me) assert(res2 == (rank_n()-1));

  barrier();
  if (!me) std::cout << "SUCCESS" << std::endl;
  finalize();
  return 0;
}

Compiler errors with 2019.3.2/gcc-9.1.0:

dirac$ upcxx -g coll_promise.cpp
coll_promise.cpp: In function 'int main()':
coll_promise.cpp:20:53: error: no matching function for call to 'barrier_async(upcxx::team&, upcxx::detail::support_as_promise<upcxx::operation_cx_event>::as_promise_t<>)'
   20 |   barrier_async(world(), operation_cx::as_promise(p));
      |                                                     ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:11,
                 from coll_promise.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/barrier.hpp:13:12: note: candidate: 'template<class Cxs> upcxx::future<> upcxx::barrier_async(upcxx::team&, upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> >)'
   13 |   future<> barrier_async(team &tm = upcxx::world(),
      |            ^~~~~~~~~~~~~
/usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/barrier.hpp:13:12: note:   template argument deduction/substitution failed:
coll_promise.cpp:20:50: note:   cannot convert 'upcxx::detail::support_as_promise<upcxx::operation_cx_event>::as_promise<>(p)' (type 'upcxx::detail::support_as_promise<upcxx::operation_cx_event>::as_promise_t<>' {aka 'upcxx::completions<upcxx::promise_cx<upcxx::operation_cx_event> >'}) to type 'upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> >'
   20 |   barrier_async(world(), operation_cx::as_promise(p));
      |                          ~~~~~~~~~~~~~~~~~~~~~~~~^~~
coll_promise.cpp:23:58: error: no matching function for call to 'broadcast(int, int, upcxx::team&, upcxx::detail::support_as_promise<upcxx::operation_cx_event>::as_promise_t<int>)'
   23 |   broadcast(42, 0, world(), operation_cx::as_promise(pi3));
      |                                                          ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:12,
                 from coll_promise.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/broadcast.hpp:64:12: note: candidate: 'template<class T, class Cxs> upcxx::future<> upcxx::broadcast(T*, std::size_t, upcxx::intrank_t, upcxx::team&, upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> >)'
   64 |   future<> broadcast(
      |            ^~~~~~~~~
/usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/broadcast.hpp:64:12: note:   template argument deduction/substitution failed:
coll_promise.cpp:23:58: note:   mismatched types 'T*' and 'int'
   23 |   broadcast(42, 0, world(), operation_cx::as_promise(pi3));
      |                                                          ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:12,
                 from coll_promise.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/broadcast.hpp:91:13: note: candidate: 'template<class T, class Cxs> upcxx::future<T> upcxx::broadcast(T, upcxx::intrank_t, upcxx::team&, upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> >)'
   91 |   future<T> broadcast(
      |             ^~~~~~~~~
/usr/local/pkg/upcxx-dirac/gcc-9.1.0/stable-2019.3.2/upcxx.debug.gasnet_seq.ibv/include/upcxx/broadcast.hpp:91:13: note:   template argument deduction/substitution failed:
coll_promise.cpp:23:53: note:   cannot convert 'upcxx::detail::support_as_promise<upcxx::operation_cx_event>::as_promise<int>(pi3)' (type 'upcxx::detail::support_as_promise<upcxx::operation_cx_event>::as_promise_t<int>' {aka 'upcxx::completions<upcxx::promise_cx<upcxx::operation_cx_event, int> >'}) to type 'upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> >'
   23 |   broadcast(42, 0, world(), operation_cx::as_promise(pi3));
      |                             ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~

Comments (1)

  1. Log in to comment