1 #ifndef OMEGA_H_COMM_HPP
2 #define OMEGA_H_COMM_HPP
6 #include <Omega_h_mpi.h>
7 #include <Omega_h_array.hpp>
8 #include <Omega_h_defines.hpp>
9 #include <Omega_h_fail.hpp>
10 #include <Omega_h_future.hpp>
11 #include <Omega_h_int128.hpp>
12 #ifndef OMEGA_H_FAIL_HPP
13 #error "included fail but guard not defined"
16 #error "included fail but check not defined"
22 static_assert(
sizeof(
int) == 4,
"Omega_h::Comm assumes 32-bit int");
27 typedef std::shared_ptr<Comm> CommPtr;
30 #ifdef OMEGA_H_USE_MPI
43 #ifdef OMEGA_H_USE_MPI
46 MPI_Comm get_impl()
const {
return impl_; }
48 Comm(
Library* library,
bool is_graph,
bool sends_to_self);
52 Comm& operator=(
Comm const&) =
delete;
59 CommPtr split(I32 color, I32 key)
const;
62 CommPtr graph_inverse()
const;
66 T allreduce(T x, Omega_h_Op op)
const;
67 bool reduce_or(
bool x)
const;
68 bool reduce_and(
bool x)
const;
71 T exscan(T x, Omega_h_Op op)
const;
73 void bcast(T& x,
int root_rank=0)
const;
74 void bcast_string(std::string& s,
int root_rank=0)
const;
87 void send(
int rank,
const T& x);
89 void recv(
int rank, T& x);
92 #ifdef OMEGA_H_USE_MPI
99 #define OMEGA_H_MPI_UNWEIGHTED reinterpret_cast<int*>(MPI_UNWEIGHTED)
101 #define OMEGA_H_MPI_UNWEIGHTED MPI_UNWEIGHTED
108 struct MpiTraits<char> {
109 static MPI_Datatype datatype() {
return MPI_CHAR; }
113 struct MpiTraits<signed char> {
114 static MPI_Datatype datatype() {
return MPI_SIGNED_CHAR; }
118 struct MpiTraits<unsigned char> {
119 static MPI_Datatype datatype() {
return MPI_UNSIGNED_CHAR; }
123 struct MpiTraits<float> {
124 static MPI_Datatype datatype() {
return MPI_FLOAT; }
128 struct MpiTraits<double> {
129 static MPI_Datatype datatype() {
return MPI_DOUBLE; }
133 struct MpiTraits<unsigned short> {
134 static MPI_Datatype datatype() {
return MPI_UNSIGNED_SHORT; }
138 struct MpiTraits<unsigned> {
139 static MPI_Datatype datatype() {
return MPI_UNSIGNED; }
143 struct MpiTraits<unsigned long> {
144 static MPI_Datatype datatype() {
return MPI_UNSIGNED_LONG; }
148 struct MpiTraits<unsigned long long> {
149 static MPI_Datatype datatype() {
return MPI_UNSIGNED_LONG_LONG; }
153 struct MpiTraits<short int> {
154 static MPI_Datatype datatype() {
return MPI_SHORT; }
158 struct MpiTraits<int> {
159 static MPI_Datatype datatype() {
return MPI_INT; }
163 struct MpiTraits<long int> {
164 static MPI_Datatype datatype() {
return MPI_LONG; }
168 struct MpiTraits<long long int> {
169 static MPI_Datatype datatype() {
return MPI_LONG_LONG_INT; }
172 inline MPI_Op mpi_op(Omega_h_Op op) {
181 OMEGA_H_NORETURN(MPI_MIN);
189 void Comm::send(
int rank,
const T& x) {
190 #ifdef OMEGA_H_USE_MPI
191 size_t sz = x.size();
192 int omega_h_mpi_error = MPI_Send(&sz, 1, MpiTraits<size_t>::datatype(), rank, 0, impl_);
193 OMEGA_H_CHECK(MPI_SUCCESS == omega_h_mpi_error);
194 omega_h_mpi_error = MPI_Send(x.data(), x.size(), MpiTraits<typename T::value_type>::datatype(), rank, 0, impl_);;
195 OMEGA_H_CHECK(MPI_SUCCESS == omega_h_mpi_error);
203 void Comm::recv(
int rank, T& x) {
204 #ifdef OMEGA_H_USE_MPI
206 int omega_h_mpi_error = MPI_Recv(&sz, 1, MpiTraits<size_t>::datatype(), rank, 0, impl_, MPI_STATUS_IGNORE);
207 OMEGA_H_CHECK(MPI_SUCCESS == omega_h_mpi_error);
209 omega_h_mpi_error = MPI_Recv(x.data(), x.size(), MpiTraits<typename T::value_type>::datatype(), rank, 0, impl_, MPI_STATUS_IGNORE);
210 OMEGA_H_CHECK(MPI_SUCCESS == omega_h_mpi_error);
217 #define OMEGA_H_EXPL_INST_DECL(T) \
218 extern template T Comm::allreduce(T x, Omega_h_Op op) const; \
219 extern template T Comm::exscan(T x, Omega_h_Op op) const; \
220 extern template void Comm::bcast(T& x, int root_rank) const; \
221 extern template Read<T> Comm::allgather(T x) const; \
222 extern template Read<T> Comm::alltoall(Read<T> x) const; \
223 extern template Read<T> Comm::alltoallv( \
224 Read<T> sendbuf, Read<LO> sdispls, Read<LO> rdispls, Int width) const; \
225 extern template Future<T> Comm::ialltoallv( \
226 Read<T> sendbuf, Read<LO> sdispls, Read<LO> rdispls, Int width) const;
227 OMEGA_H_EXPL_INST_DECL(I8)
228 OMEGA_H_EXPL_INST_DECL(I32)
229 OMEGA_H_EXPL_INST_DECL(I64)
230 OMEGA_H_EXPL_INST_DECL(Real)
231 #undef OMEGA_H_EXPL_INST_DECL
Definition: Omega_h_comm.hpp:29
Abstraction for asynchronous communication.
Definition: Omega_h_future.hpp:19
Definition: Omega_h_library.hpp:10
Definition: amr_mpi_test.cpp:6
Definition: Omega_h_int128.hpp:12