15#include "arcane/utils/FatalErrorException.h"
17#include "arcane/parallel/mpithread/internal/HybridMachineShMemWinBaseInternalCreator.h"
19#include "arcane/parallel/mpi/MpiParallelMng.h"
20#include "arcane/parallel/mpithread/internal/HybridContigMachineShMemWinBaseInternal.h"
21#include "arcane/parallel/mpithread/internal/HybridMachineShMemWinBaseInternal.h"
22#include "arcane/parallel/mpithread/HybridMessageQueue.h"
24#include "arccore/concurrency/IThreadBarrier.h"
25#include "arccore/message_passing_mpi/internal/MpiAdapter.h"
26#include "arccore/message_passing_mpi/internal/MpiMachineShMemWinBaseInternalCreator.h"
27#include "arccore/message_passing_mpi/internal/MpiContigMachineShMemWinBaseInternal.h"
28#include "arccore/message_passing_mpi/internal/MpiMultiMachineShMemWinBaseInternal.h"
39HybridMachineShMemWinBaseInternalCreator::
40HybridMachineShMemWinBaseInternalCreator(
Int32 nb_rank_local_proc, IThreadBarrier* barrier)
41: m_nb_rank_local_proc(nb_rank_local_proc)
43, m_sizeof_resize_segments(nb_rank_local_proc)
49void HybridMachineShMemWinBaseInternalCreator::
50initializeMpiWindowCreator(Int32 my_rank_global, MpiParallelMng* mpi_parallel_mng)
52 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(my_rank_global), m_nb_rank_local_proc);
53 Int32 my_rank_local_proc = my_fri.localRankValue();
54 if (my_rank_local_proc == 0) {
56 _buildMachineRanksArray(mpi_parallel_mng->adapter()->windowCreator()->machineRanks());
63HybridContigMachineShMemWinBaseInternal* HybridMachineShMemWinBaseInternalCreator::
64createWindow(Int32 my_rank_global, Int64 sizeof_segment, Int32 sizeof_type, MpiParallelMng* mpi_parallel_mng)
71 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(my_rank_global), m_nb_rank_local_proc);
72 Int32 my_rank_local_proc = my_fri.localRankValue();
73 Int32 my_rank_mpi = my_fri.mpiRankValue();
75 Mpi::MpiMachineShMemWinBaseInternalCreator* mpi_window_creator =
nullptr;
77 if (my_rank_local_proc == 0) {
78 mpi_window_creator = mpi_parallel_mng->adapter()->windowCreator();
81 m_sizeof_sub_segments =
makeRef(mpi_window_creator->createWindow(m_nb_rank_local_proc *
static_cast<Int64
>(
sizeof(Int64)),
sizeof(Int64)));
82 m_sum_sizeof_sub_segments =
makeRef(mpi_window_creator->createWindow(m_nb_rank_local_proc *
static_cast<Int64
>(
sizeof(Int64)),
sizeof(Int64)));
87 Span<Int64> sizeof_sub_segments = asSpan<Int64>(m_sizeof_sub_segments->segmentView());
89 sizeof_sub_segments[my_rank_local_proc] = sizeof_segment;
92 if (my_rank_local_proc == 0) {
93 m_sizeof_segment_local_proc = 0;
94 Span<Int64> sum_sizeof_sub_segments = asSpan<Int64>(m_sum_sizeof_sub_segments->segmentView());
96 for (Int32 i = 0; i < m_nb_rank_local_proc; ++i) {
97 sum_sizeof_sub_segments[i] = m_sizeof_segment_local_proc;
98 m_sizeof_segment_local_proc += sizeof_sub_segments[i];
103 if (my_rank_local_proc == 0) {
104 m_window =
makeRef(mpi_window_creator->createWindow(m_sizeof_segment_local_proc, sizeof_type));
108 auto* window_obj =
new HybridContigMachineShMemWinBaseInternal(my_rank_mpi, my_rank_local_proc, m_nb_rank_local_proc, m_machine_ranks, sizeof_type, m_sizeof_sub_segments, m_sum_sizeof_sub_segments, m_window, m_barrier);
112 if (my_rank_local_proc == 0) {
113 m_sizeof_sub_segments.reset();
114 m_sum_sizeof_sub_segments.reset();
115 m_sizeof_segment_local_proc = 0;
125HybridMachineShMemWinBaseInternal* HybridMachineShMemWinBaseInternalCreator::
126createDynamicWindow(Int32 my_rank_global, Int64 sizeof_segment, Int32 sizeof_type, MpiParallelMng* mpi_parallel_mng)
128 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(my_rank_global), m_nb_rank_local_proc);
129 Int32 my_rank_local_proc = my_fri.localRankValue();
130 Int32 my_rank_mpi = my_fri.mpiRankValue();
132 Mpi::MpiMachineShMemWinBaseInternalCreator* mpi_window_creator =
nullptr;
134 if (my_rank_local_proc == 0) {
135 mpi_window_creator = mpi_parallel_mng->adapter()->windowCreator();
139 m_sizeof_resize_segments[my_rank_local_proc] = sizeof_segment;
142 if (my_rank_local_proc == 0) {
143 m_windows =
makeRef(mpi_window_creator->createDynamicMultiWindow(m_sizeof_resize_segments.smallSpan(), m_nb_rank_local_proc, sizeof_type));
144 m_sizeof_resize_segments.fill(0);
148 auto* window_obj =
new HybridMachineShMemWinBaseInternal(my_rank_mpi, my_rank_local_proc, m_nb_rank_local_proc, m_machine_ranks, sizeof_type, m_windows, m_barrier);
152 if (my_rank_local_proc == 0) {
162ConstArrayView<Int32> HybridMachineShMemWinBaseInternalCreator::
165 return m_machine_ranks;
171void HybridMachineShMemWinBaseInternalCreator::
172machineBarrier(Int32 my_rank_global, MpiParallelMng* mpi_parallel_mng)
const
174 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(my_rank_global), m_nb_rank_local_proc);
175 Int32 my_rank_local_proc = my_fri.localRankValue();
177 if (my_rank_local_proc == 0)
178 mpi_parallel_mng->barrier();
185void HybridMachineShMemWinBaseInternalCreator::
186_buildMachineRanksArray(ConstArrayView<Int32> mpi_machine_ranks)
188 m_machine_ranks.resize(mpi_machine_ranks.size() * m_nb_rank_local_proc);
191 for (Int32 mpi_rank : mpi_machine_ranks) {
192 for (Int32 thread_rank = 0; thread_rank < m_nb_rank_local_proc; ++thread_rank) {
193 m_machine_ranks[iter++] = thread_rank + m_nb_rank_local_proc * mpi_rank;
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.