87struct mpi_communicator
89 MPI_Comm comm = MPI_COMM_NULL;
94 mpi_communicator() =
default;
96 explicit mpi_communicator(MPI_Comm comm)
99 MPI_Comm_rank(comm, &rank);
100 MPI_Comm_size(comm, &size);
104 operator MPI_Comm()
const
110 template <
typename T>
114 std::vector<T> v(size + 1);
119 mpAllGather(m_message_passing_mng.get(), v0_view, out_view);
120 std::partial_sum(v.begin(), v.end(), v.begin());
124 std::complex<long double> reduceSum(
const std::complex<long double>& lval)
const
126 return _reduceSumForComplex(lval);
128 std::complex<double> reduceSum(
const std::complex<double>& lval)
const
130 return _reduceSumForComplex(lval);
132 std::complex<float> reduceSum(
const std::complex<float>& lval)
const
134 return _reduceSumForComplex(lval);
137 template <
typename T> T reduceSum(
const T& lval)
const
139 return mpAllReduce(m_message_passing_mng.get(), MessagePassing::eReduceType::ReduceSum, lval);
142 void waitAll(ArrayView<MessagePassing::Request> requests)
const
144 mpWaitAll(m_message_passing_mng.get(), requests);
146 void wait(MessagePassing::Request request)
const
148 ArrayView<MessagePassing::Request> requests(1, &request);
149 mpWaitAll(m_message_passing_mng.get(), requests);
161 template <
class Condition,
class Message>
162 void check(
const Condition& cond,
const Message& message)
164 int lc =
static_cast<int>(cond);
165 int gc = _reduce(MPI_PROD, lc);
175 std::cerr <<
"Failed assumption: " << message << std::endl;
176 std::cerr <<
"Offending processes:";
177 for (
int i = 0; i < size; ++i)
179 std::cerr <<
" " << i;
180 std::cerr << std::endl;
183 ARCCORE_FATAL(
"CheckError in MessagePassingUtils: {0}", message);
188 doIReceive(T* buf,
int count,
int source,
int tag)
const
194 return mpReceive(m_message_passing_mng.
get(), schar, msg_info);
197 template <
typename T>
void
198 doReceive(T* buf,
int count,
int source,
int tag)
const
200 using namespace Arcane::MessagePassing;
201 Span<T> s(buf, count);
202 Span<unsigned char> schar(
reinterpret_cast<unsigned char*
>(s.data()), s.sizeBytes());
203 PointToPointMessageInfo msg_info(MessageRank{ source }, MessageTag{ tag }, eBlockingType::Blocking);
204 mpReceive(m_message_passing_mng.get(), schar, msg_info);
207 template <
typename T> MessagePassing::Request
208 doISend(
const T* buf,
int count,
int dest,
int tag)
const
210 using namespace Arcane::MessagePassing;
211 Span<const T> s(buf, count);
212 Span<const unsigned char> schar(
reinterpret_cast<const unsigned char*
>(s.data()), s.sizeBytes());
213 PointToPointMessageInfo msg_info(MessageRank{ dest }, MessageTag{ tag }, eBlockingType::NonBlocking);
214 return mpSend(m_message_passing_mng.get(), schar, msg_info);
217 template <
typename T>
void
218 doSend(
const T* buf,
int count,
int dest,
int tag)
const
220 using namespace Arcane::MessagePassing;
221 Span<const T> s(buf, count);
222 Span<const unsigned char> schar(
reinterpret_cast<const unsigned char*
>(s.data()), s.sizeBytes());
223 PointToPointMessageInfo msg_info(MessageRank{ dest }, MessageTag{ tag }, eBlockingType::Blocking);
224 mpSend(m_message_passing_mng.get(), schar, msg_info);
229 int _reduce(MPI_Op op,
int lval)
const
233 MPI_Allreduce((
void*)&lval, &gval, 1, MPI_INT, op, comm);
237 template <
typename T> std::complex<T>
238 _reduceSumForComplex(
const std::complex<T>& lval)
const
241 FixedArray<T, 2> values = { { lval.real(), lval.imag() } };
242 mpAllReduce(m_message_passing_mng.get(), MessagePassing::eReduceType::ReduceSum, values.
view());
243 return std::complex<T>(values[0], values[1]);