64 static std::vector<int> serialization_buffer;
69 MPI_Comm_rank(comm, &rank);
76 MPI_Comm_size(comm, &size);
100 mpicontext(MPI_Comm comm) : rank{get_rank(comm)}, size{get_size(comm)}, comm{comm} {}
118 send(
const std::vector<int>& data,
int rank,
int tag)
const
120 MPI_Send(data.data(), data.size(), MPI_INT, rank, tag, this->comm);
123 send(std::pair<int*, int> data,
int rank,
int tag)
const
125 MPI_Send(data.first, data.second, MPI_INT, rank, tag, this->comm);
131 MPI_Status recv_status;
132 MPI_Probe(rank, tag, this->comm, &recv_status);
133 MPI_Get_count(&recv_status, MPI_INT, &count);
137 recv(std::vector<int>& data,
int rank,
int tag)
const
141 MPI_Recv(data.data(), count, MPI_INT, rank, tag, this->comm, MPI_STATUS_IGNORE);
145 recv(
int* data,
int rank,
int tag,
int max_buffer_size)
const
147 MPI_Status recv_status;
148 MPI_Recv(data, max_buffer_size, MPI_INT, rank, tag, this->comm, &recv_status);
150 MPI_Get_count(&recv_status, MPI_INT, &count);
159 if (count > data.size()) data.resize(count);
160 MPI_Recv(data.data(), count, MPI_INT, rank, tag, this->comm, MPI_STATUS_IGNORE);
163 template <
class T,
class podT>
165 sendpacked(
const T& source,
int rank,
int tag, std::vector<podT>& buffer)
const
168 send(buffer, rank, tag);
170 template <
class T,
class podT>
172 recvpacked(T& dest,
int rank,
int tag, std::vector<podT>& buffer)
const
184 send({serialization_buffer.data(), sendcount}, rank, tag);
186 std::vector<std::vector<int>>
187 gather(
const std::vector<int>& source,
int root)
const
191 std::vector<int> recv_counts(this->
get_size());
192 int sendcount = source.size();
197 MPI_Gather(&sendcount, 1, MPI_INT, recv_counts.data(), 1, MPI_INT, root, this->comm);
201 std::vector<int> destination(std::accumulate(recv_counts.begin(), recv_counts.end(), 0));
202 std::vector<int> displacements(this->
get_size(), 0);
203 std::partial_sum(recv_counts.begin(), recv_counts.end() - 1, displacements.data() + 1);
210 displacements.data(),
216 std::vector<std::vector<int>> result(this->
get_size());
217 int * start_iter = destination.data(), *end_iter = destination.data() + recv_counts[0];
218 for (
size_t i = 0; i < result.size(); ++i) {
219 result[i] = std::vector<int>(start_iter, end_iter);
220 start_iter = end_iter;
221 end_iter += recv_counts[i];
227 int sendcount = source.size();
228 MPI_Gather(&sendcount, 1, MPI_INT, 0, 0, MPI_INT, root, this->
get_comm());
231 MPI_Gatherv(source.data(), sendcount, MPI_INT, 0, 0, 0, MPI_INT, root, this->get_comm());
238 scatter(
int root,
const std::vector<std::vector<int>>& source)
const
243 std::vector<int> send_counts(this->
get_size());
244 for (
size_t i = 0; i < send_counts.size(); ++i) { send_counts[i] = source[i].size(); }
245 MPI_Scatter(send_counts.data(), 1, MPI_INT, &recvcount, 1, MPI_INT, root, this->get_comm());
248 std::vector<int> destination(recvcount, 0);
249 std::vector<int> displacements(this->
get_size(), 0);
250 std::vector<int> source_made_contiguous(std::accumulate(send_counts.begin(), send_counts.end(), 0), 0);
252 std::partial_sum(send_counts.begin(), send_counts.end() - 1, displacements.data() + 1);
256 displacements.data(),
265 MPI_Scatter(0, 0, MPI_INT, &recvcount, 1, MPI_INT, root, this->
get_comm());
266 std::vector<int> recvbuff(recvcount);
267 MPI_Scatterv(0, 0, 0, MPI_INT, recvbuff.data(), recvcount, MPI_INT, root, this->get_comm());
270 return std::vector<int>();
273 template <
size_t count>
274 std::vector<std::array<int, count>>
277 std::vector<std::array<int, count>> buffer(
get_size());
292 std::vector<int> buffer(
get_size());
307 std::vector<size_t> buffer(
get_size());
308 if (
sizeof(
unsigned long) ==
sizeof(
size_t)) {
348 std::vector<int> buffer(
get_size());
377 std::vector<std::array<int, n>>
380 std::vector<std::array<int, n>> buffer(
get_size());
410 std::vector<int> buffer(
get_size() * size);
428 template <
size_t count>
430 bcast(std::array<int, count>& arr)
const
432 MPI_Bcast(arr.data(), count, MPI_INT, this->get_root(), this->get_comm());
440 std::vector<int> displacements(counts.size());
441 std::partial_sum(counts.begin(), counts.end() - 1, displacements.begin() + 1);
442 std::string dest((
size_t)(displacements.back() + counts.back()),
' ');
450 displacements.data(),
474 const std::string& str,
475 const std::string& _start,
476 const std::string& separator,
477 const std::string& _end)
const
481 std::vector<int> displacements;
482 displacements.reserve(counts.size());
483 int displacement_accumulator = _start.size();
484 int separator_size = separator.size();
485 for (
int count : counts) {
486 displacements.emplace_back(displacement_accumulator);
487 displacement_accumulator += separator_size + count;
489 std::string dest((
size_t)(displacement_accumulator + _end.size() - separator_size),
' ');
497 displacements.data(),
502 std::copy(_start.begin(), _start.end(), &dest[0]);
503 for (
int i = 0, max = counts.size() - 1; i < max; ++i) {
504 int offset = displacements[i] + counts[i];
505 std::copy(separator.begin(), separator.end(), &dest[offset]);
507 std::copy(_end.begin(), _end.end(), &dest[displacements.back() + counts.back()]);
526 print(
const std::string& s, std::ostream& os = std::cout)
const
534 const std::string& s,
535 const std::string& _start,
536 const std::string& separator,
537 const std::string& _end,
538 std::ostream& os = std::cout)
const
545 println(
const std::string& s, std::ostream& os = std::cout)
const
562 if (
is_root()) { os << s << std::endl; }
582 const std::vector<int>& ints,
583 std::vector<int>& dest,
584 const std::vector<int>& counts,
585 const std::vector<int>& displacements)
const
594 displacements.data(),
602 const std::vector<int>& ints,
603 const std::vector<int>& counts,
604 const std::vector<int>& displacements,
605 std::vector<int>& dest)
const
611 displacements.data(),
643 MPI_Comm_split(
get_comm(), color, key, &new_comm);
Definition nimble.mpi.mpicontext.h:63
void bcast(int &value) const
Definition nimble.mpi.mpicontext.h:424
int recv_avoid_resize(std::vector< int > &data, int rank, int tag) const
Definition nimble.mpi.mpicontext.h:156
void gatherv_send(const std::vector< int > &ints) const
Definition nimble.mpi.mpicontext.h:566
void scatterv_send(const std::vector< int > &ints, const std::vector< int > &counts, const std::vector< int > &displacements, std::vector< int > &dest) const
Definition nimble.mpi.mpicontext.h:601
int recv(std::vector< int > &data, int rank, int tag) const
Definition nimble.mpi.mpicontext.h:137
std::string catenate_gatherv(const std::string &str) const
Definition nimble.mpi.mpicontext.h:436
MPI_Comm split_by_color() const
Definition nimble.mpi.mpicontext.h:647
mpicontext(const mpicontext &context)=default
int get_rank() const
Definition nimble.mpi.mpicontext.h:95
void sendpacked(const T &source, int rank, int tag, std::vector< podT > &buffer) const
Definition nimble.mpi.mpicontext.h:165
mpicontext(mpicontext &&context)=default
mpicontext & operator=(const mpicontext &other)=default
const mpicontext & println(const std::string &s, std::ostream &os=std::cout) const
Definition nimble.mpi.mpicontext.h:545
MPI_Comm split_by_color(int color) const
Definition nimble.mpi.mpicontext.h:635
mpicontext & operator=(mpicontext &&other)=default
const mpicontext & print(const std::string &s, std::ostream &os=std::cout) const
Definition nimble.mpi.mpicontext.h:526
const mpicontext & println_if_root(const T &s, std::ostream &os=std::cout) const
Definition nimble.mpi.mpicontext.h:560
void send(const std::vector< int > &data, int rank, int tag) const
Definition nimble.mpi.mpicontext.h:118
int recv(int *data, int rank, int tag, int max_buffer_size) const
Definition nimble.mpi.mpicontext.h:145
const MPI_Comm & get_comm() const
Definition nimble.mpi.mpicontext.h:85
std::vector< int > gather_recieve(int *data, int size) const
Definition nimble.mpi.mpicontext.h:408
mpicontext(MPI_Comm comm)
Definition nimble.mpi.mpicontext.h:100
void gather_send(int *data, int size) const
Definition nimble.mpi.mpicontext.h:394
int recv_count(int rank, int tag) const
Definition nimble.mpi.mpicontext.h:128
std::vector< std::vector< int > > gather(const std::vector< int > &source, int root) const
Definition nimble.mpi.mpicontext.h:187
std::vector< int > scatter(int root, const std::vector< std::vector< int > > &source) const
Definition nimble.mpi.mpicontext.h:238
std::vector< size_t > allgather_to_vector(size_t value) const
Definition nimble.mpi.mpicontext.h:305
std::vector< int > allgather_to_vector(int value) const
Definition nimble.mpi.mpicontext.h:290
std::vector< int > gather_recieve(int value) const
Definition nimble.mpi.mpicontext.h:346
const mpicontext & print_formatted(const std::string &s, const std::string &_start, const std::string &separator, const std::string &_end, std::ostream &os=std::cout) const
Definition nimble.mpi.mpicontext.h:533
void sendpacked(const T &source, int rank, int tag) const
Definition nimble.mpi.mpicontext.h:181
int get_size() const
Definition nimble.mpi.mpicontext.h:90
MPI_Comm split_by_color(int color, int key) const
Definition nimble.mpi.mpicontext.h:640
const mpicontext & print_if_root(const T &s, std::ostream &os=std::cout) const
Definition nimble.mpi.mpicontext.h:553
void gatherv_recieve(const std::vector< int > &ints, std::vector< int > &dest, const std::vector< int > &counts, const std::vector< int > &displacements) const
Definition nimble.mpi.mpicontext.h:581
void send(std::pair< int *, int > data, int rank, int tag) const
Definition nimble.mpi.mpicontext.h:123
std::string catenate_gatherv_format(const std::string &str, const std::string &_start, const std::string &separator, const std::string &_end) const
Definition nimble.mpi.mpicontext.h:473
void gather_send(const std::array< int, n > &arr) const
Definition nimble.mpi.mpicontext.h:363
void recvpacked(T &dest, int rank, int tag, std::vector< podT > &buffer) const
Definition nimble.mpi.mpicontext.h:172
void scatterv_recieve(std::vector< int > &dest) const
Definition nimble.mpi.mpicontext.h:620
int get_root() const
Definition nimble.mpi.mpicontext.h:108
void bcast(std::array< int, count > &arr) const
Definition nimble.mpi.mpicontext.h:430
void gather_send(int value) const
Definition nimble.mpi.mpicontext.h:332
std::vector< std::array< int, count > > allgather_to_vector(const std::array< int, count > &values) const
Definition nimble.mpi.mpicontext.h:275
bool is_root() const
Definition nimble.mpi.mpicontext.h:113
std::vector< std::array< int, n > > gather_recieve(const std::array< int, n > &arr) const
Definition nimble.mpi.mpicontext.h:378
size_t pack_avoid_resize(const T &object, std::vector< dataT > &vect)
Definition nimble.mpi.serialization.h:313
void unpack(T &object, const std::vector< dataT > &vect)
Definition nimble.mpi.serialization.h:325
Definition kokkos_contact_manager.h:49