4#include "vipra/util/mpi_types.hpp"
18template <
typename data_t>
19[[nodiscard]]
inline auto mpi_gather_all_vectors(std::vector<data_t>
const& localData)
20 -> std::pair<std::vector<data_t>, std::vector<int>>
22 MPI_Barrier(MPI_COMM_WORLD);
26 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
27 MPI_Comm_size(MPI_COMM_WORLD, &size);
29 std::vector<int> counts;
30 std::vector<int> displacements;
34 displacements.resize(size);
37 int localSize =
static_cast<int>(localData.size());
38 MPI_Gather(&localSize, 1, MPI_INT, counts.data(), 1, MPI_INT, 0, MPI_COMM_WORLD);
40 std::vector<data_t> allData;
44 for (
int i = 0; i < size; ++i ) {
45 displacements[i] = totalSize;
46 totalSize += counts[i];
49 allData.resize(totalSize);
53 MPI_Gatherv(localData.data(), localSize, VIPRA::Util::get_mpi_type<data_t>(),
54 allData.data(), counts.data(), displacements.data(),
55 VIPRA::Util::get_mpi_type<data_t>(), 0, MPI_COMM_WORLD);
57 MPI_Barrier(MPI_COMM_WORLD);
59 return {std::move(allData), std::move(counts)};
67inline void master_do(
auto&& func)
71 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
80namespace VIPRA::Util {
81template <
typename data_t>
82[[nodiscard]]
inline auto mpi_gather_all_vectors(std::vector<data_t>
const& localData)
83 -> std::pair<std::vector<data_t>, std::vector<int>>
85 constexpr bool always_false =
false;
86 static_assert(always_false,
87 "Attempting to use mpi_gather_all_vectors when MPI is not enabled");
95inline void master_do(
auto&& func) { func(); }