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->segment());
44 m_sum_sizeof_sub_segments_local_proc = asSpan<Int64>(m_sum_sizeof_sub_segments_global->segment());
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);
73segment(
Int32 rank)
const
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->segment(fri.mpiRankValue()));
89 const Span<std::byte> segment_proc = m_mpi_window->segment(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->window();
108void HybridMachineMemoryWindowBaseInternal::
109resizeSegment(
Int64 new_sizeof_segment)
111 m_sizeof_sub_segments_local_proc[m_my_rank_local_proc] = new_sizeof_segment;
113 m_thread_barrier->wait();
115 if (m_my_rank_local_proc == 0) {
117 for (
Int32 i = 0; i < m_nb_rank_local_proc; ++i) {
118 m_sum_sizeof_sub_segments_local_proc[i] = sum;
119 sum += m_sizeof_sub_segments_local_proc[i];
121 m_mpi_window->resizeSegment(sum);
123 m_thread_barrier->wait();
132 return m_machine_ranks;
138void HybridMachineMemoryWindowBaseInternal::
141 m_thread_barrier->wait();
142 if (m_my_rank_local_proc == 0)
143 m_mpi_window->barrier();
144 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.