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/HybridMessageQueue.h"
23#include "arccore/concurrency/IThreadBarrier.h"
24#include "arccore/message_passing_mpi/internal/MpiAdapter.h"
25#include "arccore/message_passing_mpi/internal/MpiMachineMemoryWindowBaseInternalCreator.h"
26#include "arccore/message_passing_mpi/internal/MpiMachineMemoryWindowBaseInternal.h"
37HybridMachineMemoryWindowBaseInternalCreator::
38HybridMachineMemoryWindowBaseInternalCreator(
Int32 nb_rank_local_proc, IThreadBarrier* barrier)
39: m_nb_rank_local_proc(nb_rank_local_proc)
40, m_sizeof_segment_local_proc(0)
47HybridMachineMemoryWindowBaseInternal* HybridMachineMemoryWindowBaseInternalCreator::
48createWindow(Int32 my_rank_global, Int64 sizeof_segment, Int32 sizeof_type, MpiParallelMng* mpi_parallel_mng)
55 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(my_rank_global), m_nb_rank_local_proc);
56 Int32 my_rank_local_proc = my_fri.localRankValue();
57 Int32 my_rank_mpi = my_fri.mpiRankValue();
59 Mpi::MpiMachineMemoryWindowBaseInternalCreator* mpi_window_creator =
nullptr;
61 if (my_rank_local_proc == 0) {
62 mpi_window_creator = mpi_parallel_mng->adapter()->windowCreator();
63 _buildMachineRanksArray(mpi_window_creator);
66 m_sizeof_sub_segments =
makeRef(mpi_window_creator->createWindow(m_nb_rank_local_proc *
static_cast<Int64
>(
sizeof(Int64)),
sizeof(Int64)));
67 m_sum_sizeof_sub_segments =
makeRef(mpi_window_creator->createWindow(m_nb_rank_local_proc *
static_cast<Int64
>(
sizeof(Int64)),
sizeof(Int64)));
72 Span<Int64> sizeof_sub_segments = asSpan<Int64>(m_sizeof_sub_segments->segment());
74 sizeof_sub_segments[my_rank_local_proc] = sizeof_segment;
77 if (my_rank_local_proc == 0) {
78 m_sizeof_segment_local_proc = 0;
79 Span<Int64> sum_sizeof_sub_segments = asSpan<Int64>(m_sum_sizeof_sub_segments->segment());
81 for (Int32 i = 0; i < m_nb_rank_local_proc; ++i) {
82 sum_sizeof_sub_segments[i] = m_sizeof_segment_local_proc;
83 m_sizeof_segment_local_proc += sizeof_sub_segments[i];
89 if (my_rank_local_proc == 0) {
90 m_window =
makeRef(mpi_window_creator->createWindow(m_sizeof_segment_local_proc, sizeof_type));
94 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);
98 m_sizeof_sub_segments.reset();
99 m_sum_sizeof_sub_segments.reset();
100 m_sizeof_segment_local_proc = 0;
109void HybridMachineMemoryWindowBaseInternalCreator::
110_buildMachineRanksArray(
const Mpi::MpiMachineMemoryWindowBaseInternalCreator* mpi_window_creator)
112 ConstArrayView<Int32> mpi_ranks(mpi_window_creator->machineRanks());
113 m_machine_ranks.resize(mpi_ranks.size() * m_nb_rank_local_proc);
116 for (Int32 mpi_rank : mpi_ranks) {
117 for (Int32 thread_rank = 0; thread_rank < m_nb_rank_local_proc; ++thread_rank) {
118 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.