16#include "arcane/utils/FatalErrorException.h"
18#include "arcane/parallel/mpithread/internal/HybridDynamicMachineMemoryWindowBaseInternal.h"
20#include "arcane/parallel/mpithread/HybridMessageQueue.h"
22#include "arccore/concurrency/IThreadBarrier.h"
23#include "arccore/message_passing_mpi/internal/MpiDynamicMultiMachineMemoryWindowBaseInternal.h"
34HybridDynamicMachineMemoryWindowBaseInternal::
35HybridDynamicMachineMemoryWindowBaseInternal(
Int32 my_rank_mpi,
Int32 my_rank_local_proc,
Int32 nb_rank_local_proc, ConstArrayView<Int32> ranks,
Int32 sizeof_type, Ref<Mpi::MpiDynamicMultiMachineMemoryWindowBaseInternal> 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 HybridDynamicMachineMemoryWindowBaseInternal::
60 return m_machine_ranks;
66void HybridDynamicMachineMemoryWindowBaseInternal::
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 HybridDynamicMachineMemoryWindowBaseInternal::
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 HybridDynamicMachineMemoryWindowBaseInternal::
139 m_thread_barrier->wait();
140 if (m_my_rank_local_proc == 0) {
141 m_mpi_windows->executeAdd();
143 m_thread_barrier->wait();
149void HybridDynamicMachineMemoryWindowBaseInternal::
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 HybridDynamicMachineMemoryWindowBaseInternal::
171 m_thread_barrier->wait();
173 if (m_my_rank_local_proc == 0) {
174 m_mpi_windows->executeAddToAnotherSegment();
176 m_thread_barrier->wait();
182void HybridDynamicMachineMemoryWindowBaseInternal::
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 HybridDynamicMachineMemoryWindowBaseInternal::
199 m_thread_barrier->wait();
200 if (m_my_rank_local_proc == 0) {
201 m_mpi_windows->executeReserve();
203 m_thread_barrier->wait();
209void HybridDynamicMachineMemoryWindowBaseInternal::
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 HybridDynamicMachineMemoryWindowBaseInternal::
226 m_thread_barrier->wait();
227 if (m_my_rank_local_proc == 0) {
228 m_mpi_windows->executeResize();
230 m_thread_barrier->wait();
236void HybridDynamicMachineMemoryWindowBaseInternal::
239 m_thread_barrier->wait();
240 if (m_my_rank_local_proc == 0) {
241 m_mpi_windows->executeShrink();
243 m_thread_barrier->wait();
Vue constante d'un tableau de type T.
Informations de correspondances entre les différents rangs d'un communicateur.
Vue d'un tableau d'éléments de type T.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.