27 MPI_Init(&argc, &argv);
49 MPI_Initialized(&mpi_init);
66 using U = std::remove_const_t<T>;
67 if constexpr (std::is_same_v<U, bool>)
71 if constexpr (std::is_same_v<U, char>)
75 if constexpr (std::is_same_v<U, double>)
79 if constexpr (std::is_same_v<U, float>)
83 if constexpr (std::is_same_v<U, int>)
87 if constexpr (std::is_same_v<U, std::size_t>)
89 return MPI_UNSIGNED_LONG;
91 if constexpr (std::is_same_v<U, unsigned int>)
100 std::vector<T> result(mpi.
size);
109static std::vector<T>
allgather(std::vector<T>
const& vector,
Mpi const& mpi)
111 std::size_t
const size = vector.size();
113 std::vector<T> result(mpi.
size * size);
115 MPI_Allgather(vector.data(), size,
mpiType<T>(), result.data(), size,
122static T
allreduce(T
const& value, MPI_Op
const& mpi_op,
Mpi const& mpi)
131static std::vector<T>
allreduce(std::vector<T>
const& vector,
132 MPI_Op
const& mpi_op,
Mpi const& mpi)
134 std::size_t
const size = vector.size();
135 std::vector<T> result(vector.size());
137 MPI_Allreduce(vector.data(), result.data(), size,
mpiType<T>(), mpi_op,
144 MPI_Op
const& mpi_op,
147 MPI_Allreduce(MPI_IN_PLACE,
159 std::span<T>
const send_buffer,
160 std::vector<std::remove_const_t<T>>& receive_buffer,
164 int const size =
static_cast<int>(send_buffer.size());
167 std::vector<int>
const sizes =
allgather(size, mpi);
173 receive_buffer.resize(offsets.back());
175 MPI_Allgatherv(send_buffer.data(), size,
mpiType<T>(),
176 receive_buffer.data(), sizes.data(), offsets.data(),
185static inline bool anyOf(
bool const val
static void allreduceInplace(std::vector< T > &vector, MPI_Op const &mpi_op, Mpi const &mpi)
static bool anyOf(bool const val, Mpi const &mpi=Mpi{OGS_COMM_WORLD})
static std::vector< int > allgatherv(std::span< T > const send_buffer, std::vector< std::remove_const_t< T > > &receive_buffer, Mpi const &mpi)
static T allreduce(T const &value, MPI_Op const &mpi_op, Mpi const &mpi)
constexpr MPI_Datatype mpiType()
static std::vector< T > allgather(T const &value, Mpi const &mpi)
std::vector< ranges::range_value_t< R > > sizesToOffsets(R const &sizes)
Mpi(MPI_Comm const communicator=OGS_COMM_WORLD)
Setup(int argc, char *argv[])