14#include "arcane/utils/FatalErrorException.h"
16#include "arcane/parallel/mpithread/internal/HybridMachineMemoryWindowBaseInternal.h"
18#include "arcane/parallel/mpithread/HybridMessageQueue.h"
20#include "arccore/concurrency/IThreadBarrier.h"
31HybridMachineMemoryWindowBaseInternal::
32HybridMachineMemoryWindowBaseInternal(
Int32 my_rank_mpi,
Int32 my_rank_local_proc,
Int32 nb_rank_local_proc, ConstArrayView<Int32> ranks,
Int32 sizeof_type, Ref<IMachineMemoryWindowBaseInternal> nb_elem, Ref<IMachineMemoryWindowBaseInternal> sum_nb_elem, Ref<IMachineMemoryWindowBaseInternal> mpi_window, IThreadBarrier* barrier)
33: m_my_rank_local_proc(my_rank_local_proc)
34, m_nb_rank_local_proc(nb_rank_local_proc)
35, m_my_rank_mpi(my_rank_mpi)
36, m_machine_ranks(ranks)
37, m_sizeof_type(sizeof_type)
38, m_mpi_window(mpi_window)
39, m_sizeof_sub_segments_global(nb_elem)
40, m_sum_sizeof_sub_segments_global(sum_nb_elem)
41, m_thread_barrier(barrier)
43 m_sizeof_sub_segments_local_proc = asSpan<Int64>(m_sizeof_sub_segments_global->segmentView());
44 m_sum_sizeof_sub_segments_local_proc = asSpan<Int64>(m_sum_sizeof_sub_segments_global->segmentView());
50Int32 HybridMachineMemoryWindowBaseInternal::
63 const Int64 begin_segment_thread = m_sum_sizeof_sub_segments_local_proc[m_my_rank_local_proc];
64 const Int64 size_segment_thread = m_sizeof_sub_segments_local_proc[m_my_rank_local_proc];
66 return segment_proc.
subSpan(begin_segment_thread, size_segment_thread);
73segmentView(
Int32 rank)
75 const FullRankInfo fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
78 if (fri.mpiRankValue() == m_my_rank_mpi) {
80 const Int64 begin_segment_thread = m_sum_sizeof_sub_segments_local_proc[fri.localRankValue()];
81 const Int64 size_segment_thread = m_sizeof_sub_segments_local_proc[fri.localRankValue()];
83 return segment_proc.
subSpan(begin_segment_thread, size_segment_thread);
86 const Span<Int64> sum_nb_elem_other_proc =
asSpan<Int64>(m_sum_sizeof_sub_segments_global->segmentView(fri.mpiRankValue()));
89 const Span<std::byte> segment_proc = m_mpi_window->segmentView(fri.mpiRankValue());
90 const Int64 begin_segment_thread = sum_nb_elem_other_proc[fri.localRankValue()];
91 const Int64 size_segment_thread = nb_elem_other_proc[fri.localRankValue()];
93 return segment_proc.
subSpan(begin_segment_thread, size_segment_thread);
102 return m_mpi_window->windowView();
109segmentConstView()
const
112 const Int64 begin_segment_thread = m_sum_sizeof_sub_segments_local_proc[m_my_rank_local_proc];
113 const Int64 size_segment_thread = m_sizeof_sub_segments_local_proc[m_my_rank_local_proc];
115 return segment_proc.
subSpan(begin_segment_thread, size_segment_thread);
122segmentConstView(
Int32 rank)
const
124 const FullRankInfo fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
127 if (fri.mpiRankValue() == m_my_rank_mpi) {
129 const Int64 begin_segment_thread = m_sum_sizeof_sub_segments_local_proc[fri.localRankValue()];
130 const Int64 size_segment_thread = m_sizeof_sub_segments_local_proc[fri.localRankValue()];
132 return segment_proc.
subSpan(begin_segment_thread, size_segment_thread);
139 const Int64 begin_segment_thread = sum_nb_elem_other_proc[fri.localRankValue()];
140 const Int64 size_segment_thread = nb_elem_other_proc[fri.localRankValue()];
142 return segment_proc.
subSpan(begin_segment_thread, size_segment_thread);
149windowConstView()
const
151 return m_mpi_window->windowConstView();
157void HybridMachineMemoryWindowBaseInternal::
158resizeSegment(
Int64 new_sizeof_segment)
160 m_sizeof_sub_segments_local_proc[m_my_rank_local_proc] = new_sizeof_segment;
162 m_thread_barrier->wait();
164 if (m_my_rank_local_proc == 0) {
166 for (
Int32 i = 0; i < m_nb_rank_local_proc; ++i) {
167 m_sum_sizeof_sub_segments_local_proc[i] = sum;
168 sum += m_sizeof_sub_segments_local_proc[i];
170 m_mpi_window->resizeSegment(sum);
172 m_thread_barrier->wait();
181 return m_machine_ranks;
187void HybridMachineMemoryWindowBaseInternal::
190 m_thread_barrier->wait();
191 if (m_my_rank_local_proc == 0)
192 m_mpi_window->barrier();
193 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.
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
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.
Span< DataType > asSpan(Span< std::byte, Extent > bytes)
Converti un Span<std::byte> en un Span<DataType>.
std::int32_t Int32
Type entier signé sur 32 bits.