- changed status to resolved
Generalized operation completion for barrier_async and broadcast
Issue #234
resolved
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)
-
- Log in to comment
Fixes issue 234. Enhances (to the state of compliance) the generalized completion nature of
barrier_async
andbroadcast
.→ <<cset dc643092f69e>>