5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH
6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH
22 value = std::make_unique<T>();
30 T tmp = std::move(*
value);
34 operator bool ()
const {
51 : value(
std::forward<V>(t))
53 std::optional<std::reference_wrapper<T>>
value;
59 operator bool ()
const{
73 operator bool ()
const{
84 template<
class R,
class S =
void>
86 mutable MPI_Request req_;
87 mutable MPI_Status status_;
93 : req_(MPI_REQUEST_NULL)
98 template<
class V = R,
class U = S>
99 MPIFuture(V&& recv_data, U&& send_data,
typename std::enable_if_t<!std::is_void<V>::value && !std::is_void<U>::value>* = 0) :
100 req_(MPI_REQUEST_NULL)
101 , data_(
std::forward<R>(recv_data))
102 , send_data_(
std::forward<S>(send_data))
106 template<
class V = R>
107 MPIFuture(V&& recv_data,
typename std::enable_if_t<!std::is_void<V>::value>* = 0)
108 : req_(MPI_REQUEST_NULL)
109 , data_(
std::forward<V>(recv_data))
113 if(req_ != MPI_REQUEST_NULL){
116 MPI_Request_free(&req_);
123 : req_(MPI_REQUEST_NULL)
124 , data_(
std::move(f.data_))
125 , send_data_(
std::move(f.send_data_))
127 std::swap(req_, f.req_);
128 std::swap(status_, f.status_);
132 std::swap(req_, f.req_);
133 std::swap(status_, f.status_);
134 std::swap(data_, f.data_);
135 std::swap(send_data_, f.send_data_);
146 MPI_Wait(&req_, &status_);
151 MPI_Test(&req_, &flag, &status_);
162 return send_data_.
get();
Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
Implements an utility class that provides collective communication methods for sequential programs.
bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
Definition bigunsignedint.hh:549
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
Dune namespace.
Definition alignedallocator.hh:13
auto getMPIData(T &t)
Definition mpidata.hh:43
Collective communication interface and sequential default implementation.
Definition communication.hh:100
This exception is thrown when ready(), wait() or get() is called on an invalid future....
Definition future.hh:18
Definition mpifuture.hh:19
std::unique_ptr< T > value
Definition mpifuture.hh:28
T & operator*() const
Definition mpifuture.hh:37
Buffer(V &&t)
Definition mpifuture.hh:25
T get()
Definition mpifuture.hh:29
Buffer(bool valid)
Definition mpifuture.hh:20
std::optional< std::reference_wrapper< T > > value
Definition mpifuture.hh:53
Buffer(bool valid=false)
Definition mpifuture.hh:44
T & get()
Definition mpifuture.hh:54
Buffer(V &&t)
Definition mpifuture.hh:50
bool valid_
Definition mpifuture.hh:69
void get()
Definition mpifuture.hh:76
Buffer(bool valid=false)
Definition mpifuture.hh:70
Provides a future-like object for MPI communication. It contains the object that will be received and...
Definition mpifuture.hh:85
MPIFuture(V &&recv_data, typename std::enable_if_t<!std::is_void< V >::value > *=0)
Definition mpifuture.hh:107
bool ready() const
Definition mpifuture.hh:149
bool valid() const
Definition mpifuture.hh:139
~MPIFuture()
Definition mpifuture.hh:112
MPIFuture(bool valid=false)
Definition mpifuture.hh:92
MPIFuture & operator=(MPIFuture &&f)
Definition mpifuture.hh:131
auto get_send_mpidata()
Definition mpifuture.hh:169
void wait()
Definition mpifuture.hh:143
auto get_mpidata()
Definition mpifuture.hh:165
R get()
Definition mpifuture.hh:155
MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t<!std::is_void< V >::value &&!std::is_void< U >::value > *=0)
Definition mpifuture.hh:99
S get_send_data()
Definition mpifuture.hh:160
MPIFuture(MPIFuture &&f)
Definition mpifuture.hh:122