16#include "arcane/utils/FatalErrorException.h"
18#include "arcane/parallel/mpithread/internal/HybridMachineShMemWinBaseInternal.h"
20#include "arcane/parallel/mpithread/HybridMessageQueue.h"
22#include "arccore/concurrency/IThreadBarrier.h"
23#include "arccore/message_passing_mpi/internal/MpiMultiMachineShMemWinBaseInternal.h"
34HybridMachineShMemWinBaseInternal::
35HybridMachineShMemWinBaseInternal(
Int32 my_rank_mpi,
Int32 my_rank_local_proc,
Int32 nb_rank_local_proc, ConstArrayView<Int32> ranks,
Int32 sizeof_type, Ref<Mpi::MpiMultiMachineShMemWinBaseInternal> mpi_windows, IThreadBarrier* barrier)
36: m_my_rank_local_proc(my_rank_local_proc)
37, m_nb_rank_local_proc(nb_rank_local_proc)
38, m_my_rank_mpi(my_rank_mpi)
39, m_machine_ranks(ranks)
40, m_sizeof_type(sizeof_type)
41, m_mpi_windows(mpi_windows)
42, m_thread_barrier(barrier)
48Int32 HybridMachineShMemWinBaseInternal::
60 return m_machine_ranks;
66void HybridMachineShMemWinBaseInternal::
69 m_thread_barrier->wait();
70 if (m_my_rank_local_proc == 0)
71 m_mpi_windows->barrier();
72 m_thread_barrier->wait();
81 return m_mpi_windows->segmentView(m_my_rank_local_proc);
88segmentView(
Int32 rank)
90 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
91 const Int32 rank_local_proc = my_fri.localRankValue();
92 const Int32 rank_mpi = my_fri.mpiRankValue();
94 return m_mpi_windows->segmentView(rank_mpi, rank_local_proc);
101segmentConstView()
const
103 return m_mpi_windows->segmentConstView(m_my_rank_local_proc);
110segmentConstView(
Int32 rank)
const
112 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
113 const Int32 rank_local_proc = my_fri.localRankValue();
114 const Int32 rank_mpi = my_fri.mpiRankValue();
116 return m_mpi_windows->segmentConstView(rank_mpi, rank_local_proc);
122void HybridMachineShMemWinBaseInternal::
125 m_mpi_windows->requestAdd(m_my_rank_local_proc, elem);
126 m_thread_barrier->wait();
127 if (m_my_rank_local_proc == 0) {
128 m_mpi_windows->executeAdd();
130 m_thread_barrier->wait();
136void HybridMachineShMemWinBaseInternal::
139 m_thread_barrier->wait();
140 if (m_my_rank_local_proc == 0) {
141 m_mpi_windows->executeAdd();
143 m_thread_barrier->wait();
149void HybridMachineShMemWinBaseInternal::
152 FullRankInfo fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
153 Int32 rank_local_proc = fri.localRankValue();
154 Int32 rank_mpi = fri.mpiRankValue();
156 m_mpi_windows->requestAddToAnotherSegment(m_my_rank_local_proc, rank_mpi, rank_local_proc, elem);
157 m_thread_barrier->wait();
159 if (m_my_rank_local_proc == 0) {
160 m_mpi_windows->executeAddToAnotherSegment();
162 m_thread_barrier->wait();
168void HybridMachineShMemWinBaseInternal::
171 m_thread_barrier->wait();
173 if (m_my_rank_local_proc == 0) {
174 m_mpi_windows->executeAddToAnotherSegment();
176 m_thread_barrier->wait();
182void HybridMachineShMemWinBaseInternal::
183reserve(
Int64 new_capacity)
185 m_mpi_windows->requestReserve(m_my_rank_local_proc, new_capacity);
186 m_thread_barrier->wait();
187 if (m_my_rank_local_proc == 0) {
188 m_mpi_windows->executeReserve();
190 m_thread_barrier->wait();
196void HybridMachineShMemWinBaseInternal::
199 m_thread_barrier->wait();
200 if (m_my_rank_local_proc == 0) {
201 m_mpi_windows->executeReserve();
203 m_thread_barrier->wait();
209void HybridMachineShMemWinBaseInternal::
210resize(
Int64 new_size)
212 m_mpi_windows->requestResize(m_my_rank_local_proc, new_size);
213 m_thread_barrier->wait();
214 if (m_my_rank_local_proc == 0) {
215 m_mpi_windows->executeResize();
217 m_thread_barrier->wait();
223void HybridMachineShMemWinBaseInternal::
226 m_thread_barrier->wait();
227 if (m_my_rank_local_proc == 0) {
228 m_mpi_windows->executeResize();
230 m_thread_barrier->wait();
236void HybridMachineShMemWinBaseInternal::
239 m_thread_barrier->wait();
240 if (m_my_rank_local_proc == 0) {
241 m_mpi_windows->executeShrink();
243 m_thread_barrier->wait();
Constant view of an array of type T.
Correspondence information between the different ranks of a communicator.
View of an array of elements of type T.
Declarations of types and methods used by message exchange mechanisms.
std::int64_t Int64
Signed integer type of 64 bits.
std::int32_t Int32
Signed integer type of 32 bits.