88struct ARCCORE_ALINA_EXPORT AlinaCommunicator
92 MPI_Comm m_mpi_communicator = MPI_COMM_NULL;
100 AlinaCommunicator() =
default;
102 explicit AlinaCommunicator(MPI_Comm comm);
106 MPI_Comm mpiCommunicator()
const;
110 template <
typename T>
119 mpAllGather(m_message_passing_mng.get(), v0_view, out_view);
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
146 void wait(MessagePassing::Request request)
const
148 ArrayView<MessagePassing::Request> requests(1, &request);
161 void check(
bool cond,
const String& message);
163 void barrier() {
mpBarrier(m_message_passing_mng.
get()); }
165 template <
typename T> MessagePassing::Request
166 doIReceive(T* buf,
int count,
int source,
int tag)
const
168 using namespace Arcane::MessagePassing;
169 Span<T> s(buf, count);
170 Span<unsigned char> schar(
reinterpret_cast<unsigned char*
>(s.data()), s.sizeBytes());
171 PointToPointMessageInfo msg_info(MessageRank{ source }, MessageTag{ tag }, eBlockingType::NonBlocking);
172 return mpReceive(m_message_passing_mng.
get(), schar, msg_info);
175 template <
typename T>
void
176 doReceive(T* buf,
int count,
int source,
int tag)
const
178 using namespace Arcane::MessagePassing;
179 Span<T> s(buf, count);
180 Span<unsigned char> schar(
reinterpret_cast<unsigned char*
>(s.data()), s.sizeBytes());
181 PointToPointMessageInfo msg_info(MessageRank{ source }, MessageTag{ tag }, eBlockingType::Blocking);
182 mpReceive(m_message_passing_mng.
get(), schar, msg_info);
185 template <
typename T> MessagePassing::Request
186 doISend(
const T* buf,
int count,
int dest,
int tag)
const
188 using namespace Arcane::MessagePassing;
189 Span<const T> s(buf, count);
190 Span<const unsigned char> schar(
reinterpret_cast<const unsigned char*
>(s.data()), s.sizeBytes());
191 PointToPointMessageInfo msg_info(MessageRank{ dest }, MessageTag{ tag }, eBlockingType::NonBlocking);
192 return mpSend(m_message_passing_mng.
get(), schar, msg_info);
195 template <
typename T>
void
196 doSend(
const T* buf,
int count,
int dest,
int tag)
const
198 using namespace Arcane::MessagePassing;
199 Span<const T> s(buf, count);
200 Span<const unsigned char> schar(
reinterpret_cast<const unsigned char*
>(s.data()), s.sizeBytes());
201 PointToPointMessageInfo msg_info(MessageRank{ dest }, MessageTag{ tag }, eBlockingType::Blocking);
202 mpSend(m_message_passing_mng.
get(), schar, msg_info);
207 template <
typename T> std::complex<T>
208 _reduceSumForComplex(
const std::complex<T>& lval)
const
211 FixedArray<T, 2> values = { { lval.real(), lval.imag() } };
212 mpAllReduce(m_message_passing_mng.
get(), MessagePassing::eReduceType::ReduceSum, values.
view());
213 return std::complex<T>(values[0], values[1]);