44#ifndef NIMBLE_MPI_RANK_CLIQUE_REDUCER
45#define NIMBLE_MPI_RANK_CLIQUE_REDUCER
86 :
indices{new int[index_list.size()]},
94 std::copy_n(index_list.data(), index_list.size(),
indices.get());
100 :
indices{new int[index_list.size()]},
107 std::copy_n(index_list.data(), index_list.size(),
indices.get());
130 template <
int field_size>
136 for (; index_ptr < index_ptr_end; ++index_ptr) {
137 double* sourcescan = source + (*index_ptr) * field_size;
138 for (
int j = 0; j < field_size; ++j) {
139 *destscan = *sourcescan;
145 template <
int field_size>
151 for (; index_ptr < index_ptr_end; ++index_ptr) {
152 double* destscan = dest + (*index_ptr) * field_size;
153 for (
int j = 0; j < field_size; ++j) {
154 *destscan = *sourcescan;
160 template <
int field_size,
class Lookup>
167 for (
int j = 0; j < field_size; ++j) { *destscan++ = source(index, j); }
170 template <
int field_size,
class Lookup>
176 for (
int j = 0; j < field_size; ++j) { dest(index, j) = *sourcescan++; }
182 if (!
okayfieldsizeQ(field_size)) {
throw std::invalid_argument(
"Field size too big"); }
185 template <
int field_size,
class Lookup>
197 template <
int field_size,
class Lookup>
203 "asyncreduce_initialize(data) was called "
204 "when an active asynchronous reduce already exists");
233 "Iallreduce_completedQ() was called "
234 "without an active asynchronous reduce request.");
241 template <
int field_size,
class Lookup>
255 "asyncreduce_finalize(data) was called "
256 "without an active asynchronous reduce request.");
272 int my_mpi_comm_world_rank;
273 MPI_Comm_rank(MPI_COMM_WORLD, &my_mpi_comm_world_rank);
274 int clique_comm_size;
276 std::vector<int> mpi_comm_world_ranks(clique_comm_size);
277 MPI_Allgather(&my_mpi_comm_world_rank, 1, MPI_INT, mpi_comm_world_ranks.data(), 1, MPI_INT,
clique_comm);
278 std::sort(mpi_comm_world_ranks.begin(), mpi_comm_world_ranks.end());
279 return mpi_comm_world_ranks;
Definition nimble.mpi.mpicontext.h:63
const MPI_Comm & get_comm() const
Definition nimble.mpi.mpicontext.h:85
Definition nimble.quanta.arrayview.h:56
Definition kokkos_contact_manager.h:49
#define NIMBLE_ABORT(...)
Definition nimble_macros.h:87
MPI_Request Iallreduce_request
Definition nimble.mpi.rank_clique_reducer.h:68
void resizebuffer(int newbuffersize)
Definition nimble.mpi.rank_clique_reducer.h:123
int GetNumIndices()
Definition nimble.mpi.rank_clique_reducer.h:260
bool Iallreduce_completedQ()
Definition nimble.mpi.rank_clique_reducer.h:224
void reduce(Lookup &&data)
Definition nimble.mpi.rank_clique_reducer.h:187
int n_indices
Definition nimble.mpi.rank_clique_reducer.h:66
std::unique_ptr< int[]> indices
Definition nimble.mpi.rank_clique_reducer.h:62
ReductionClique_t(const std::vector< int > &index_list, int buffersize, int comm_color, const mpicontext &context)
Definition nimble.mpi.rank_clique_reducer.h:85
std::unique_ptr< double[]> recvbuffer
Definition nimble.mpi.rank_clique_reducer.h:64
void asyncreduce_initialize(Lookup &&databuffer)
Definition nimble.mpi.rank_clique_reducer.h:199
ReductionClique_t(const std::vector< int > &index_list, int buffersize, MPI_Comm clique_comm)
Definition nimble.mpi.rank_clique_reducer.h:99
MPI_Comm clique_comm
Definition nimble.mpi.rank_clique_reducer.h:67
void fitnewfieldsize(int new_field_size)
Definition nimble.mpi.rank_clique_reducer.h:118
bool asyncreduce_finalize(Lookup &&databuffer)
Definition nimble.mpi.rank_clique_reducer.h:243
void pack(Lookup &source)
Definition nimble.mpi.rank_clique_reducer.h:162
void unpack(Lookup &dest)
Definition nimble.mpi.rank_clique_reducer.h:172
ReductionClique_t & operator=(ReductionClique_t &&source)=default
std::unique_ptr< double[]> sendbuffer
Definition nimble.mpi.rank_clique_reducer.h:63
int buffersize
Definition nimble.mpi.rank_clique_reducer.h:65
bool okayfieldsizeQ(int field_size)
Definition nimble.mpi.rank_clique_reducer.h:113
int const * GetIndices()
Definition nimble.mpi.rank_clique_reducer.h:265
bool exists_active_asyncreduce_request
Definition nimble.mpi.rank_clique_reducer.h:69
void unpack(double *dest)
Definition nimble.mpi.rank_clique_reducer.h:147
ReductionClique_t(ReductionClique_t &&source)=default
void EnsureDataSafety(int field_size)
Definition nimble.mpi.rank_clique_reducer.h:180
void pack(double *source)
Definition nimble.mpi.rank_clique_reducer.h:132
ReductionClique_t()
Definition nimble.mpi.rank_clique_reducer.h:71
std::vector< int > GetMPICommWorldRanks()
Definition nimble.mpi.rank_clique_reducer.h:270