15#include "arcane/utils/FatalErrorException.h"
17#include "arcane/parallel/mpithread/internal/HybridMachineMemoryWindowBaseInternalCreator.h"
19#include "arcane/parallel/mpi/MpiParallelMng.h"
20#include "arcane/parallel/mpithread/internal/HybridMachineMemoryWindowBaseInternal.h"
21#include "arcane/parallel/mpithread/internal/HybridDynamicMachineMemoryWindowBaseInternal.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/MpiMachineMemoryWindowBaseInternalCreator.h"
27#include "arccore/message_passing_mpi/internal/MpiMachineMemoryWindowBaseInternal.h"
28#include "arccore/message_passing_mpi/internal/MpiDynamicMultiMachineMemoryWindowBaseInternal.h"
39HybridMachineMemoryWindowBaseInternalCreator::
40HybridMachineMemoryWindowBaseInternalCreator(
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)
49HybridMachineMemoryWindowBaseInternal* HybridMachineMemoryWindowBaseInternalCreator::
50createWindow(Int32 my_rank_global, Int64 sizeof_segment, Int32 sizeof_type, MpiParallelMng* mpi_parallel_mng)
57 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(my_rank_global), m_nb_rank_local_proc);
58 Int32 my_rank_local_proc = my_fri.localRankValue();
59 Int32 my_rank_mpi = my_fri.mpiRankValue();
61 Mpi::MpiMachineMemoryWindowBaseInternalCreator* mpi_window_creator =
nullptr;
63 if (my_rank_local_proc == 0) {
64 mpi_window_creator = mpi_parallel_mng->adapter()->windowCreator();
65 if (m_machine_ranks.empty()) {
66 _buildMachineRanksArray(mpi_window_creator);
70 m_sizeof_sub_segments =
makeRef(mpi_window_creator->createWindow(m_nb_rank_local_proc *
static_cast<Int64
>(
sizeof(Int64)),
sizeof(Int64)));
71 m_sum_sizeof_sub_segments =
makeRef(mpi_window_creator->createWindow(m_nb_rank_local_proc *
static_cast<Int64
>(
sizeof(Int64)),
sizeof(Int64)));
76 Span<Int64> sizeof_sub_segments = asSpan<Int64>(m_sizeof_sub_segments->segmentView());
78 sizeof_sub_segments[my_rank_local_proc] = sizeof_segment;
81 if (my_rank_local_proc == 0) {
82 m_sizeof_segment_local_proc = 0;
83 Span<Int64> sum_sizeof_sub_segments = asSpan<Int64>(m_sum_sizeof_sub_segments->segmentView());
85 for (Int32 i = 0; i < m_nb_rank_local_proc; ++i) {
86 sum_sizeof_sub_segments[i] = m_sizeof_segment_local_proc;
87 m_sizeof_segment_local_proc += sizeof_sub_segments[i];
92 if (my_rank_local_proc == 0) {
93 m_window =
makeRef(mpi_window_creator->createWindow(m_sizeof_segment_local_proc, sizeof_type));
97 auto* window_obj =
new HybridMachineMemoryWindowBaseInternal(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);
101 if (my_rank_local_proc == 0) {
102 m_sizeof_sub_segments.reset();
103 m_sum_sizeof_sub_segments.reset();
104 m_sizeof_segment_local_proc = 0;
114HybridDynamicMachineMemoryWindowBaseInternal* HybridMachineMemoryWindowBaseInternalCreator::
115createDynamicWindow(Int32 my_rank_global, Int64 sizeof_segment, Int32 sizeof_type, MpiParallelMng* mpi_parallel_mng)
117 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(my_rank_global), m_nb_rank_local_proc);
118 Int32 my_rank_local_proc = my_fri.localRankValue();
119 Int32 my_rank_mpi = my_fri.mpiRankValue();
121 Mpi::MpiMachineMemoryWindowBaseInternalCreator* mpi_window_creator =
nullptr;
123 if (my_rank_local_proc == 0) {
124 mpi_window_creator = mpi_parallel_mng->adapter()->windowCreator();
125 if (m_machine_ranks.empty()) {
126 _buildMachineRanksArray(mpi_window_creator);
131 m_sizeof_resize_segments[my_rank_local_proc] = sizeof_segment;
134 if (my_rank_local_proc == 0) {
135 m_windows =
makeRef(mpi_window_creator->createDynamicMultiWindow(m_sizeof_resize_segments.smallSpan(), m_nb_rank_local_proc, sizeof_type));
136 m_sizeof_resize_segments.fill(0);
140 auto* window_obj =
new HybridDynamicMachineMemoryWindowBaseInternal(my_rank_mpi, my_rank_local_proc, m_nb_rank_local_proc, m_machine_ranks, sizeof_type, m_windows, m_barrier);
144 if (my_rank_local_proc == 0) {
154void HybridMachineMemoryWindowBaseInternalCreator::
155_buildMachineRanksArray(
const Mpi::MpiMachineMemoryWindowBaseInternalCreator* mpi_window_creator)
157 ConstArrayView<Int32> mpi_ranks(mpi_window_creator->machineRanks());
158 m_machine_ranks.resize(mpi_ranks.size() * m_nb_rank_local_proc);
161 for (Int32 mpi_rank : mpi_ranks) {
162 for (Int32 thread_rank = 0; thread_rank < m_nb_rank_local_proc; ++thread_rank) {
163 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.