16 #ifndef OHMMS_COMMUNICATION_OPERATORS_MPI_H 17 #define OHMMS_COMMUNICATION_OPERATORS_MPI_H 25 throw std::runtime_error(
"Need specialization for gsum(T&, int)");
31 throw std::runtime_error(
"Need specialization for allreduce(T&)");
37 throw std::runtime_error(
"Need specialization for reduce(T&)");
43 throw std::runtime_error(
"Need specialization for reduce(T* restrict , T* restrict, int n)");
49 throw std::runtime_error(
"Need specialization for reduce_in_place(T* restrict, int n)");
55 throw std::runtime_error(
"Need specialization for bcast(T&)");
61 throw std::runtime_error(
"Need specialization for bcast(T* restrict ,int n)");
67 throw std::runtime_error(
"Need specialization for send(int, int, T& )");
73 throw std::runtime_error(
"Need specialization for gather(T&, T&, int)");
79 throw std::runtime_error(
"Need specialization for allgather(T&, T&, int)");
82 template<
typename T,
typename IT>
85 throw std::runtime_error(
"Need specialization for gatherv(T&, T&, IT&, IT&, int)");
91 throw std::runtime_error(
"Need specialization for scatter(T&, T&, int)");
94 template<
typename T,
typename IT>
97 throw std::runtime_error(
"Need specialization for scatterv(T&, T&, IT&, IT&, int)");
103 throw std::runtime_error(
"Need specialization for irecv(int source, int tag, T& )");
110 throw std::runtime_error(
"Need specialization for isend(int source, int tag, T& )");
117 throw std::runtime_error(
"Need specialization for irecv(int source, int tag, T*, int )");
124 throw std::runtime_error(
"Need specialization for isend(int source, int tag, T*, int )");
131 throw std::runtime_error(
"Need specialization for allgather(T*, T*, int)");
134 template<
typename T,
typename IT>
137 throw std::runtime_error(
"Need specialization for gatherv(T*, T*, int, IT&, IT&, int)");
143 throw std::runtime_error(
"Need specialization for Communicate::::gsum(T&)");
147 inline void gsum(
int& g,
int gid)
150 MPI_Allreduce(&(gt), &(g), 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
159 MPI_Allreduce(g.
begin(), gt.
begin(),
N, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
164 inline void gsum(std::vector<int>& g,
int gid)
166 std::vector<int> gt(g.size(), 0);
167 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_INT, MPI_SUM, MPI_COMM_WORLD);
172 inline void gsum(
double& g,
int gid)
175 MPI_Allreduce(&(gt), &(g), 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
184 MPI_Allreduce(g.
begin(), gt.
begin(),
N, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
189 inline void gsum(std::vector<double>& g,
int gid)
191 std::vector<double> gt(g.size(), 0.0);
192 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
201 std::vector<double> gt(g.
size());
203 MPI_Allreduce(g.
data(), >[0], g.
size(), MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
204 copy(gt.begin(), gt.end(), g.
data());
213 MPI_Allreduce(&(gt), &(g), 1, MPI_INT, MPI_SUM,
myMPI);
222 MPI_Allreduce(&(gt), &(g), 1, MPI_LONG, MPI_SUM,
myMPI);
230 unsigned long gt = g;
231 MPI_Allreduce(&(gt), &(g), 1, MPI_UNSIGNED_LONG, MPI_SUM,
myMPI);
240 MPI_Allreduce(&(gt), &(g), 1, MPI_FLOAT, MPI_SUM,
myMPI);
249 MPI_Allreduce(&(gt), &(g), 1, MPI_DOUBLE, MPI_SUM,
myMPI);
287 std::vector<int> gt(g.size(), 0);
288 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_INT, MPI_SUM,
myMPI);
297 std::vector<long> gt(g.size(), 0);
298 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_LONG, MPI_SUM,
myMPI);
307 std::vector<unsigned long> gt(g.size(), 0);
308 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_UNSIGNED_LONG, MPI_SUM,
myMPI);
315 std::vector<float> gt(g.size(), 0.0f);
316 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_FLOAT, MPI_SUM,
myMPI);
323 std::vector<double> gt(g.size(), 0.0);
324 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_DOUBLE, MPI_SUM,
myMPI);
331 std::vector<std::complex<float>> gt(g.size(), std::complex<float>(0.0));
332 MPI_Allreduce(&(g[0]), &(gt[0]), 2 * g.size(), MPI_FLOAT, MPI_SUM,
myMPI);
339 std::vector<std::complex<double>> gt(g.size(), std::complex<double>(0.0));
340 MPI_Allreduce(&(g[0]), &(gt[0]), 2 * g.size(), MPI_DOUBLE, MPI_SUM,
myMPI);
348 MPI_Allreduce(g.
data(), gt.data(), g.
size(), MPI_FLOAT, MPI_SUM,
myMPI);
356 MPI_Allreduce(&(g[0]), &(gt[0]), g.
size(), MPI_DOUBLE, MPI_SUM,
myMPI);
363 std::vector<float> gt(g.
size());
365 MPI_Allreduce(g.
data(), >[0], g.
size(), MPI_FLOAT, MPI_SUM,
myMPI);
372 std::vector<double> gt(g.
size());
374 MPI_Allreduce(g.
data(), >[0], g.
size(), MPI_DOUBLE, MPI_SUM,
myMPI);
375 copy(gt.begin(), gt.end(), g.
data());
381 std::vector<float> gt(g.size(), 0.0f);
382 MPI_Reduce(&(g[0]), &(gt[0]), g.size(), MPI_FLOAT, MPI_SUM, 0,
myMPI);
390 std::vector<double> gt(g.size(), 0.0);
391 MPI_Reduce(&(g[0]), &(gt[0]), g.size(), MPI_DOUBLE, MPI_SUM, 0,
myMPI);
399 std::vector<int> gt(g.size(), 0.0);
400 MPI_Reduce(&(g[0]), &(gt[0]), g.size(), MPI_INT, MPI_SUM, 0,
myMPI);
408 std::vector<long> gt(g.size(), 0.0);
409 MPI_Reduce(&(g[0]), &(gt[0]), g.size(), MPI_LONG, MPI_SUM, 0,
myMPI);
417 MPI_Reduce(g, res,
n, MPI_INT, MPI_SUM, 0,
myMPI);
423 MPI_Reduce(g, res,
n, MPI_DOUBLE, MPI_SUM, 0,
myMPI);
430 MPI_Reduce(MPI_IN_PLACE, res,
n, MPI_DOUBLE, MPI_SUM, 0,
myMPI);
432 MPI_Reduce(res, NULL,
n, MPI_DOUBLE, MPI_SUM, 0,
myMPI);
439 MPI_Reduce(MPI_IN_PLACE, res,
n, MPI_FLOAT, MPI_SUM, 0,
myMPI);
441 MPI_Reduce(res, NULL,
n, MPI_FLOAT, MPI_SUM, 0,
myMPI);
447 MPI_Bcast(&g, 1, MPI_INT, 0,
myMPI);
453 MPI_Bcast(&g, 1, MPI_UNSIGNED, 0,
myMPI);
459 MPI_Bcast(&(g[0]), g.size(), MPI_UNSIGNED, 0,
myMPI);
466 MPI_Bcast(&g, 1, MPI_DOUBLE, 0,
myMPI);
472 MPI_Bcast(&g, 1, MPI_FLOAT, 0,
myMPI);
479 MPI_Bcast(&val, 1, MPI_INT, 0,
myMPI);
486 MPI_Bcast(g.
begin(), 2, MPI_DOUBLE, 0,
myMPI);
504 MPI_Bcast(&g[0][0], 3 * g.size(), MPI_INT, 0,
myMPI);
510 MPI_Bcast(g.
begin(), 3, MPI_DOUBLE, 0,
myMPI);
522 MPI_Bcast(g.
begin(), 4, MPI_DOUBLE, 0,
myMPI);
528 MPI_Bcast(&(g[0]), 9, MPI_DOUBLE, 0,
myMPI);
534 MPI_Bcast(&(g[0]), 9, MPI_FLOAT, 0,
myMPI);
540 MPI_Bcast(&(g[0]), g.
size(), MPI_DOUBLE, 0,
myMPI);
546 MPI_Bcast(&(g[0]), g.
size(), MPI_FLOAT, 0,
myMPI);
552 MPI_Bcast(&(g[0]), 2 * g.size(), MPI_DOUBLE, 0,
myMPI);
558 MPI_Bcast(&(g[0]), 2 * g.size(), MPI_FLOAT, 0,
myMPI);
564 MPI_Bcast(&(g[0]), g.
size(), MPI_INT, 0,
myMPI);
571 MPI_Bcast(&(g[0]), 2 * g.size(), MPI_DOUBLE, 0,
myMPI);
577 MPI_Bcast(&(g[0]), 3 * g.size(), MPI_DOUBLE, 0,
myMPI);
583 MPI_Bcast(&(g[0]), 3 * g.size(), MPI_FLOAT, 0,
myMPI);
608 MPI_Bcast(g.data(), 2 * g.size(), MPI_DOUBLE, 0,
myMPI);
615 MPI_Bcast(g.data(), 2 * g.size(), MPI_DOUBLE, 0,
myMPI);
621 MPI_Bcast(g.data(), 2 * g.size(), MPI_DOUBLE, 0,
myMPI);
627 MPI_Bcast(g.data(), 2 * g.size(), MPI_FLOAT, 0,
myMPI);
634 MPI_Bcast(&(g[0]), g.size(), MPI_DOUBLE, 0,
myMPI);
640 MPI_Bcast(&(g[0]), 2 * g.size(), MPI_DOUBLE, 0,
myMPI);
646 MPI_Bcast(&(g[0]), 2 * g.size(), MPI_FLOAT, 0,
myMPI);
652 MPI_Bcast(&(g[0]), g.size(), MPI_FLOAT, 0,
myMPI);
676 MPI_Bcast(&(g[0][0]), 2 * g.size(), MPI_DOUBLE, 0,
myMPI);
682 MPI_Bcast(&(g[0][0]), 3 * g.size(), MPI_DOUBLE, 0,
myMPI);
688 MPI_Bcast(&(g[0][0]), 3 * g.size(), MPI_FLOAT, 0,
myMPI);
694 MPI_Bcast(&(g[0]), g.size(), MPI_INT, 0,
myMPI);
700 std::vector<int> intVec(g.size());
701 for (
int i = 0; i < g.size(); i++)
702 intVec[i] = g[i] ? 1 : 0;
703 MPI_Bcast(&(intVec[0]), g.size(), MPI_INT, 0,
myMPI);
704 for (
int i = 0; i < g.size(); i++)
705 g[i] = intVec[i] != 0;
711 MPI_Bcast(x,
n, MPI_DOUBLE, 0,
myMPI);
717 MPI_Bcast(x, 2*
n, MPI_DOUBLE, 0,
myMPI);
723 MPI_Bcast(x,
n, MPI_FLOAT, 0,
myMPI);
729 MPI_Bcast(x, 2*
n, MPI_FLOAT, 0,
myMPI);
735 MPI_Bcast(x,
n, MPI_INT, 0,
myMPI);
741 MPI_Bcast(x,
n, MPI_CHAR, 0,
myMPI);
747 int string_size = g.size();
751 g.resize(string_size);
753 bcast(&g[0], g.size());
759 MPI_Send(&(g[0]), g.size(), MPI_DOUBLE, dest, tag,
myMPI);
766 MPI_Isend(&(g[0]), g.size(), MPI_DOUBLE, dest, tag,
myMPI, &r);
774 MPI_Irecv(&(g[0]), g.size(), MPI_DOUBLE, source, tag,
myMPI, &r);
780 std::vector<char>& g,
781 std::vector<int>& counts,
782 std::vector<int>& displ,
785 int ierr = MPI_Gatherv(&l[0], l.size(), MPI_CHAR, &g[0], &counts[0], &displ[0], MPI_CHAR, dest,
myMPI);
791 std::vector<double>& g,
792 std::vector<int>& counts,
793 std::vector<int>& displ,
796 int ierr = MPI_Gatherv(&l[0], l.size(), MPI_DOUBLE, &g[0], &counts[0], &displ[0], MPI_DOUBLE, dest,
myMPI);
801 std::vector<float>& g,
802 std::vector<int>& counts,
803 std::vector<int>& displ,
806 int ierr = MPI_Gatherv(&l[0], l.size(), MPI_FLOAT, &g[0], &counts[0], &displ[0], MPI_FLOAT, dest,
myMPI);
812 std::vector<int>& counts,
813 std::vector<int>& displ,
816 int ierr = MPI_Gatherv(&l[0], l.size(), MPI_INT, &g[0], &counts[0], &displ[0], MPI_INT, dest,
myMPI);
822 MPI_Allgather(&sb[0], count, MPI_CHAR, &rb[0], count, MPI_CHAR,
myMPI);
828 MPI_Allgather(&sb[0], count, MPI_INT, &rb[0], count, MPI_INT,
myMPI);
835 std::vector<int>& counts,
836 std::vector<int>& displ)
838 int ierr = MPI_Allgatherv(&l[0], l.size(), MPI_INT, &g[0], &counts[0], &displ[0], MPI_INT,
myMPI);
843 std::vector<long>& g,
844 std::vector<int>& counts,
845 std::vector<int>& displ,
848 int ierr = MPI_Gatherv(&l[0], l.size(), MPI_LONG, &g[0], &counts[0], &displ[0], MPI_LONG, dest,
myMPI);
854 int ierr = MPI_Gather(&l[0], l.size(), MPI_DOUBLE, &g[0], l.size(), MPI_DOUBLE, dest,
myMPI);
860 int ierr = MPI_Gather(&l[0], l.size(), MPI_CHAR, &g[0], l.size(), MPI_CHAR, dest,
myMPI);
866 int ierr = MPI_Gather(&l[0], l.size(), MPI_INT, &g[0], l.size(), MPI_INT, dest,
myMPI);
872 std::vector<int>& counts,
873 std::vector<int>& displ,
876 int ierr = MPI_Gatherv(l.
data(), l.
size(), MPI_DOUBLE, g.
data(), &counts[0], &displ[0], MPI_DOUBLE, dest,
myMPI);
888 std::vector<int> gt(g.size(), 0.0);
889 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_INT, MPI_SUM,
myMPI);
896 std::vector<double> gt(g.size(), 0.0);
897 MPI_Allreduce(&(g[0]), &(gt[0]), g.size(), MPI_DOUBLE, MPI_SUM,
myMPI);
902 inline void gsum(std::vector<std::complex<double>>& g,
int gid)
904 std::vector<std::complex<double>> gt(g.size(), 0.0);
905 MPI_Allreduce(&(g[0]), &(gt[0]), 2 * g.size(), MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
912 std::vector<std::complex<double>> gt(g.size(), 0.0);
913 MPI_Allreduce(&(g[0]), &(gt[0]), 2 * g.size(), MPI_DOUBLE, MPI_SUM,
myMPI);
918 inline void Communicate::gatherv(
char* l,
char* g,
int n, std::vector<int>& counts, std::vector<int>& displ,
int dest)
920 int ierr = MPI_Gatherv(l,
n, MPI_CHAR, g, &counts[0], &displ[0], MPI_CHAR, dest,
myMPI);
926 MPI_Allgather(sb, count, MPI_CHAR, rb, count, MPI_CHAR,
myMPI);
931 std::vector<char>& rb,
932 std::vector<int>& counts,
933 std::vector<int>& displ,
936 int ierr = MPI_Scatterv(&sb[0], &counts[0], &displ[0], MPI_CHAR, &rb[0], rb.size(), MPI_CHAR, source,
myMPI);
939 template<
typename T,
typename TMPI,
typename IT>
943 MPI_Gatherv(MPI_IN_PLACE, 0, datatype, buf, counts.data(), displ.data(), datatype, dest,
myMPI);
945 MPI_Gatherv(buf + displ[
d_mycontext], counts[
d_mycontext], datatype, NULL, counts.data(), displ.data(), datatype,
952 std::vector<std::complex<double>> gt(g.size());
953 std::copy(g.begin(), g.end(), gt.begin());
954 MPI_Allreduce(g.data(), >[0], 2 * g.size(), MPI_DOUBLE, MPI_SUM,
myMPI);
955 std::copy(gt.begin(), gt.end(), g.data());
961 std::vector<std::complex<float>> gt(g.size());
962 std::copy(g.begin(), g.end(), gt.begin());
963 MPI_Allreduce(g.data(), >[0], 2 * g.size(), MPI_FLOAT, MPI_SUM,
myMPI);
964 std::copy(gt.begin(), gt.end(), g.data());
970 MPI_Bcast(&g, 2, MPI_DOUBLE, 0,
myMPI);
976 MPI_Bcast(&g, 2, MPI_FLOAT, 0,
myMPI);
Container_t::iterator begin()
request isend(int dest, int tag, T &)
size_type size() const
return the size of the data
request irecv(int source, int tag, T &)
int rank() const
return the rank
void send(int dest, int tag, T &)
T * data()
return the address of the first element
void gsum(T &, int)
dummy declarations to be specialized
void gatherv(T &sb, T &rb, IT &counts, IT &displ, int dest=0)
mpi_comm_type myMPI
Raw communicator.
void copy(const Array< T1, 3 > &src, Array< T2, 3 > &dest)
size_type size() const
return the current size
void allgather(T &sb, T &rb, int count)
void gather(T &sb, T &rb, int dest=0)
void gatherv_in_place(T *buf, TMPI &datatype, IT &counts, IT &displ, int dest=0)
void scatter(T &sb, T &rb, int dest=0)
void reduce_in_place(T *restrict, int n)
static const int MPI_REQUEST_NULL
Container_t::iterator end()
Define a serialized buffer to store anonymous data.
void allgatherv(T &sb, T &rb, IT &counts, IT &displ)
void scatterv(T &sb, T &rb, IT &counts, IT &displ, int source=0)