30namespace nda::detail {
36 auto mpi_scatter_shape_impl(A
const &a, mpi::communicator comm,
int root) {
37 auto dims = a.shape();
38 mpi::broadcast(dims, comm, root);
39 auto scattered_size = std::accumulate(dims.begin(), dims.end(), 1, std::multiplies<>());
40 auto stride0 = scattered_size / dims[0];
41 dims[0] = mpi::chunk_length(dims[0], comm.size(), comm.rank());
42 return std::make_tuple(dims, scattered_size, stride0);
82 template <
typename A1,
typename A2>
85 void mpi_scatter_into(A1 const &a_in, A2 &&a_out, mpi::communicator comm = {},
int root = 0) {
87 EXPECTS_WITH_MESSAGE(detail::have_mpi_equal_ranks(a_in, comm),
"Error in nda::mpi_scatter_into: Ranks of arrays/views must be equal")
90 if (comm.rank() == root) detail::check_layout_mpi_compatible(a_in,
"mpi_scatter_into");
91 detail::check_layout_mpi_compatible(a_out,
"mpi_scatter_into");
94 auto [dims, scattered_size, stride0] = detail::mpi_scatter_shape_impl(a_in, comm, root);
98 auto a_out_span = std::span{a_out.data(),
static_cast<std::size_t
>(a_out.size())};
99 auto a_in_span = std::span{a_in.data(),
static_cast<std::size_t
>(a_in.size())};
100 mpi::scatter_range(a_in_span, a_out_span, scattered_size, comm, root, stride0);
119 template <
typename A>
121 auto mpi_scatter(A
const &a, mpi::communicator comm = {},
int root = 0) {
124 mpi::scatter_into(a, a_out, comm, root);
Provides concepts for the nda library.
Provides various convenient aliases and helper functions for nda::basic_array and nda::basic_array_vi...
void resize_or_check_if_view(A &a, std::array< long, A::rank > const &sha)
Resize a given regular array to the given shape or check if a given view as the correct shape.
auto mpi_scatter(A const &a, mpi::communicator comm={}, int root=0)
Implementation of an MPI scatter for nda::basic_array or nda::basic_array_view types.
void mpi_scatter_into(A1 const &a_in, A2 &&a_out, mpi::communicator comm={}, int root=0)
Implementation of an MPI scatter for nda::basic_array or nda::basic_array_view types that scatters di...
decltype(basic_array{std::declval< T >()}) get_regular_t
Get the type of the nda::basic_array that would be obtained by constructing an array from a given typ...
constexpr bool is_regular_or_view_v
Constexpr variable that is true if type A is either a regular array or a view.
Macros used in the nda library.
Provides various utility functions used by the MPI interface of nda.
Provides type traits for the nda library.