53struct ARCCORE_ALINA_EXPORT AlinaCommunicator
57 MPI_Comm m_mpi_communicator = MPI_COMM_NULL;
65 AlinaCommunicator() =
default;
70 MPI_Comm mpiCommunicator()
const;
73 static AlinaCommunicator createFromMPI(MPI_Comm comm);
85 mpAllGather(m_message_passing_mng.get(), v0_view, out_view);
90 std::complex<long double> reduceSum(
const std::complex<long double>& lval)
const
92 return _reduceSumForComplex(lval);
94 std::complex<double> reduceSum(
const std::complex<double>& lval)
const
96 return _reduceSumForComplex(lval);
98 std::complex<float> reduceSum(
const std::complex<float>& lval)
const
100 return _reduceSumForComplex(lval);
103 template <
typename T> T reduceSum(
const T& lval)
const
105 return mpAllReduce(m_message_passing_mng.
get(), MessagePassing::eReduceType::ReduceSum, lval);
108 void waitAll(ArrayView<MessagePassing::Request> requests)
const
112 void wait(MessagePassing::Request request)
const
114 ArrayView<MessagePassing::Request> requests(1, &request);
127 void check(
bool cond,
const String& message);
129 void barrier() {
mpBarrier(m_message_passing_mng.
get()); }
131 template <
typename T> MessagePassing::Request
132 doIReceive(T* buf,
int count,
int source,
int tag)
const
134 using namespace Arcane::MessagePassing;
135 Span<T> s(buf, count);
136 Span<unsigned char> schar(
reinterpret_cast<unsigned char*
>(s.data()), s.sizeBytes());
137 PointToPointMessageInfo msg_info(MessageRank{ source }, MessageTag{ tag }, eBlockingType::NonBlocking);
138 return mpReceive(m_message_passing_mng.
get(), schar, msg_info);
141 template <
typename T>
void
142 doReceive(T* buf,
int count,
int source,
int tag)
const
144 using namespace Arcane::MessagePassing;
145 Span<T> s(buf, count);
146 Span<unsigned char> schar(
reinterpret_cast<unsigned char*
>(s.data()), s.sizeBytes());
147 PointToPointMessageInfo msg_info(MessageRank{ source }, MessageTag{ tag }, eBlockingType::Blocking);
148 mpReceive(m_message_passing_mng.
get(), schar, msg_info);
151 template <
typename T> MessagePassing::Request
152 doISend(
const T* buf,
int count,
int dest,
int tag)
const
154 using namespace Arcane::MessagePassing;
155 Span<const T> s(buf, count);
156 Span<const unsigned char> schar(
reinterpret_cast<const unsigned char*
>(s.data()), s.sizeBytes());
157 PointToPointMessageInfo msg_info(MessageRank{ dest }, MessageTag{ tag }, eBlockingType::NonBlocking);
158 return mpSend(m_message_passing_mng.
get(), schar, msg_info);
161 template <
typename T>
void
162 doSend(
const T* buf,
int count,
int dest,
int tag)
const
164 using namespace Arcane::MessagePassing;
165 Span<const T> s(buf, count);
166 Span<const unsigned char> schar(
reinterpret_cast<const unsigned char*
>(s.data()), s.sizeBytes());
167 PointToPointMessageInfo msg_info(MessageRank{ dest }, MessageTag{ tag }, eBlockingType::Blocking);
168 mpSend(m_message_passing_mng.
get(), schar, msg_info);
173 template <
typename T> std::complex<T>
174 _reduceSumForComplex(
const std::complex<T>& lval)
const
177 FixedArray<T, 2> values = { { lval.real(), lval.imag() } };
178 mpAllReduce(m_message_passing_mng.
get(), MessagePassing::eReduceType::ReduceSum, values.
view());
179 return std::complex<T>(values[0], values[1]);