3 #include "operations.hpp"
12 template<
class T,
class Op>
15 typedef detail::mpi_datatype<T> Datatype;
17 static void broadcast(
const communicator& comm, T& x,
int root)
19 MPI_Bcast(Datatype::address(x),
21 Datatype::datatype(), root, comm);
24 static void broadcast(
const communicator& comm, std::vector<T>& x,
int root)
29 if (comm.rank() != root)
32 MPI_Bcast(Datatype::address(x[0]),
34 Datatype::datatype(), root, comm);
37 static request
ibroadcast(
const communicator& comm, T& x,
int root)
40 MPI_Ibcast(Datatype::address(x),
42 Datatype::datatype(), root, comm, &r.r);
46 static void gather(
const communicator& comm,
const T&
in, std::vector<T>& out,
int root)
48 size_t s = comm.size();
49 s *= Datatype::count(in);
51 MPI_Gather(Datatype::address(const_cast<T&>(in)),
54 Datatype::address(out[0]),
60 static void gather(
const communicator& comm,
const std::vector<T>& in, std::vector< std::vector<T> >& out,
int root)
62 std::vector<int> counts(comm.size());
65 std::vector<int> offsets(comm.size(), 0);
66 for (
unsigned i = 1; i < offsets.size(); ++i)
67 offsets[i] = offsets[i-1] + counts[i-1];
69 std::vector<T> buffer(offsets.back() + counts.back());
70 MPI_Gatherv(Datatype::address(const_cast<T&>(in[0])),
73 Datatype::address(buffer[0]),
79 out.resize(comm.size());
81 for (
unsigned i = 0; i < (unsigned)comm.size(); ++i)
83 out[i].reserve(counts[i]);
84 for (
unsigned j = 0; j < (unsigned)counts[i]; ++j)
85 out[i].push_back(buffer[cur++]);
89 static void gather(
const communicator& comm,
const T& in,
int root)
91 MPI_Gather(Datatype::address(const_cast<T&>(in)),
94 Datatype::address(const_cast<T&>(in)),
100 static void gather(
const communicator& comm,
const std::vector<T>& in,
int root)
104 MPI_Gatherv(Datatype::address(const_cast<T&>(in[0])),
106 Datatype::datatype(),
108 Datatype::datatype(),
112 static void all_gather(
const communicator& comm,
const T& in, std::vector<T>& out)
114 size_t s = comm.size();
115 s *= Datatype::count(in);
117 MPI_Allgather(Datatype::address(const_cast<T&>(in)),
119 Datatype::datatype(),
120 Datatype::address(out[0]),
122 Datatype::datatype(),
126 static void all_gather(
const communicator& comm,
const std::vector<T>& in, std::vector< std::vector<T> >& out)
128 std::vector<int> counts(comm.size());
131 std::vector<int> offsets(comm.size(), 0);
132 for (
unsigned i = 1; i < offsets.size(); ++i)
133 offsets[i] = offsets[i-1] + counts[i-1];
135 std::vector<T> buffer(offsets.back() + counts.back());
136 MPI_Allgatherv(Datatype::address(const_cast<T&>(in[0])),
138 Datatype::datatype(),
139 Datatype::address(buffer[0]),
142 Datatype::datatype(),
145 out.resize(comm.size());
147 for (
int i = 0; i < comm.size(); ++i)
149 out[i].reserve(counts[i]);
150 for (
int j = 0; j < counts[i]; ++j)
151 out[i].push_back(buffer[cur++]);
155 static void reduce(
const communicator& comm,
const T& in, T& out,
int root,
const Op&)
157 MPI_Reduce(Datatype::address(const_cast<T&>(in)),
158 Datatype::address(out),
160 Datatype::datatype(),
161 detail::mpi_op<Op>::get(),
165 static void reduce(
const communicator& comm,
const T& in,
int root,
const Op& op)
167 MPI_Reduce(Datatype::address(const_cast<T&>(in)),
168 Datatype::address(const_cast<T&>(in)),
170 Datatype::datatype(),
171 detail::mpi_op<Op>::get(),
175 static void all_reduce(
const communicator& comm,
const T& in, T& out,
const Op&)
177 MPI_Allreduce(Datatype::address(const_cast<T&>(in)),
178 Datatype::address(out),
180 Datatype::datatype(),
181 detail::mpi_op<Op>::get(),
185 static void all_reduce(
const communicator& comm,
const std::vector<T>& in, std::vector<T>& out,
const Op&)
187 out.resize(in.size());
188 MPI_Allreduce(Datatype::address(const_cast<T&>(in[0])),
189 Datatype::address(out[0]),
191 Datatype::datatype(),
192 detail::mpi_op<Op>::get(),
196 static void scan(
const communicator& comm,
const T& in, T& out,
const Op&)
198 MPI_Scan(Datatype::address(const_cast<T&>(in)),
199 Datatype::address(out),
201 Datatype::datatype(),
202 detail::mpi_op<Op>::get(),
206 static void all_to_all(
const communicator& comm,
const std::vector<T>& in, std::vector<T>& out,
int n = 1)
209 MPI_Alltoall(Datatype::address(const_cast<T&>(in[0])), n,
210 Datatype::datatype(),
211 Datatype::address(out[0]), n,
212 Datatype::datatype(),
249 void gather(
const communicator& comm,
const std::vector<T>& in, std::vector< std::vector<T> >& out,
int root)
285 template<
class T,
class Op>
292 template<
class T,
class Op>
299 template<
class T,
class Op>
306 template<
class T,
class Op>
313 template<
class T,
class Op>
request ibroadcast(const communicator &comm, T &x, int root)
iBroadcast to all processes in comm.
Definition: collectives.hpp:233
void all_reduce(const communicator &comm, const std::vector< T > &in, std::vector< T > &out, const Op &op)
Same as above, but for vectors.
Definition: collectives.hpp:307
void all_to_all(const communicator &comm, const std::vector< T > &in, std::vector< T > &out, int n=1)
all_to_all
Definition: collectives.hpp:321
void reduce(const communicator &comm, const T &in, T &out, int root, const Op &op)
reduce
Definition: collectives.hpp:286
void broadcast(const communicator &comm, std::vector< T > &x, int root)
Broadcast for vectors.
Definition: collectives.hpp:226
void scan(const communicator &comm, const T &in, T &out, const Op &op)
scan
Definition: collectives.hpp:314
void in(const RegularLink< Bounds > &link, const Point &p, OutIter out, const Bounds &domain)
Finds the neighbor(s) containing the target point.
Definition: pick.hpp:102
Simple wrapper around MPI_Comm.
Definition: communicator.hpp:8
void all_gather(const communicator &comm, const T &in, std::vector< T > &out)
all_gather from all processes in comm. out is resized to comm.size() and filled with elements from th...
Definition: collectives.hpp:272
void reduce(const communicator &comm, const T &in, int root, const Op &op)
Simplified version (without out) for use on non-root processes.
Definition: collectives.hpp:293
void all_reduce(const communicator &comm, const T &in, T &out, const Op &op)
all_reduce
Definition: collectives.hpp:300
Definition: request.hpp:5
void all_gather(const communicator &comm, const std::vector< T > &in, std::vector< std::vector< T > > &out)
Same as above, but for vectors.
Definition: collectives.hpp:279
void broadcast(const communicator &comm, T &x, int root)
Broadcast to all processes in comm.
Definition: collectives.hpp:219
void gather(const communicator &comm, const T &in, std::vector< T > &out, int root)
Gather from all processes in comm. On root process, out is resized to comm.size() and filled with ele...
Definition: collectives.hpp:242
void gather(const communicator &comm, const std::vector< T > &in, int root)
Simplified version (without out) for use on non-root processes.
Definition: collectives.hpp:263