67 void mpi_reduce_into(A1
const &a_in, A2 &&a_out, mpi::communicator comm = {},
int root = 0,
bool all =
false, MPI_Op op = MPI_SUM) {
69 EXPECTS_WITH_MESSAGE(detail::have_mpi_equal_shapes(a_in, comm),
"Error in nda::mpi_reduce_into: Shapes of arrays/views must be equal");
72 bool const receives = (
all || (comm.rank() == root));
77 if (a_in.is_contiguous() and a_in.has_positive_strides()) {
78 auto a_in_span = std::span{a_in.data(),
static_cast<std::size_t
>(a_in.size())};
79 if ((a_out.is_contiguous() and a_out.has_positive_strides()) || !receives) {
80 auto a_out_span = std::span{a_out.data(),
static_cast<std::size_t
>(a_out.size())};
81 mpi::reduce_range(a_in_span, a_out_span, comm, root,
all, op);
83 mpi::reduce_range(a_in_span, a_out, comm, root,
all, op);
86 if ((a_out.is_contiguous() and a_out.has_positive_strides()) || !receives) {
87 auto a_out_span = std::span{a_out.data(),
static_cast<std::size_t
>(a_out.size())};
88 mpi::reduce_range(a_in, a_out_span, comm, root,
all, op);
90 mpi::reduce_range(a_in, a_out, comm, root,
all, op);
127 auto mpi_reduce(A
const &a, mpi::communicator comm = {},
int root = 0,
bool all =
false, MPI_Op op = MPI_SUM) {
128 using value_t = std::remove_cvref_t<
decltype(mpi::reduce(std::declval<
get_value_t<A>>()))>;
129 using return_t = basic_array<value_t, get_rank<A>,
typename A::layout_policy_t::contiguous_t, get_algebra<A>,
heap<>>;
auto mpi_reduce(A const &a, mpi::communicator comm={}, int root=0, bool all=false, MPI_Op op=MPI_SUM)
Implementation of an MPI reduce for nda::basic_array or nda::basic_array_view types.
void mpi_reduce_into(A1 const &a_in, A2 &&a_out, mpi::communicator comm={}, int root=0, bool all=false, MPI_Op op=MPI_SUM)
Implementation of an MPI reduce for nda::basic_array or nda::basic_array_view types that reduces dire...