Arcane  v3.16.7.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
HybridMachineMemoryWindowBaseInternal.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* HybridMachineMemoryWindowBaseInternal.cc (C) 2000-2025 */
9/* */
10/* Classe permettant de créer une fenêtre mémoire pour l'ensemble des */
11/* sous-domaines en mémoire partagée des processus du même noeud. */
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/FatalErrorException.h"
15
16#include "arcane/parallel/mpithread/internal/HybridMachineMemoryWindowBaseInternal.h"
17
18#include "arcane/parallel/mpithread/HybridMessageQueue.h"
19
20#include "arccore/concurrency/IThreadBarrier.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
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)
42{
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());
45}
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50Int32 HybridMachineMemoryWindowBaseInternal::
51sizeofOneElem() const
52{
53 return m_sizeof_type;
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59Span<std::byte> HybridMachineMemoryWindowBaseInternal::
60segment() const
61{
62 const Span<std::byte> segment_proc = m_mpi_window->segment();
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];
65
66 return segment_proc.subSpan(begin_segment_thread, size_segment_thread);
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72Span<std::byte> HybridMachineMemoryWindowBaseInternal::
73segment(Int32 rank) const
74{
75 const FullRankInfo fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
76
77 // Si le rang est un thread de notre processus.
78 if (fri.mpiRankValue() == m_my_rank_mpi) {
79 const Span<std::byte> segment_proc = m_mpi_window->segment();
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()];
82
83 return segment_proc.subSpan(begin_segment_thread, size_segment_thread);
84 }
85
86 const Span<Int64> sum_nb_elem_other_proc = asSpan<Int64>(m_sum_sizeof_sub_segments_global->segment(fri.mpiRankValue()));
87 const Span<Int64> nb_elem_other_proc = asSpan<Int64>(m_sizeof_sub_segments_global->segment(fri.mpiRankValue()));
88
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()];
92
93 return segment_proc.subSpan(begin_segment_thread, size_segment_thread);
94}
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
99Span<std::byte> HybridMachineMemoryWindowBaseInternal::
100window() const
101{
102 return m_mpi_window->window();
103}
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
107
108void HybridMachineMemoryWindowBaseInternal::
109resizeSegment(Int64 new_sizeof_segment)
110{
111 m_sizeof_sub_segments_local_proc[m_my_rank_local_proc] = new_sizeof_segment;
112
113 m_thread_barrier->wait();
114
115 if (m_my_rank_local_proc == 0) {
116 Int64 sum = 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];
120 }
121 m_mpi_window->resizeSegment(sum);
122 }
123 m_thread_barrier->wait();
124}
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
129ConstArrayView<Int32> HybridMachineMemoryWindowBaseInternal::
130machineRanks() const
131{
132 return m_machine_ranks;
133}
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138void HybridMachineMemoryWindowBaseInternal::
139barrier() const
140{
141 m_thread_barrier->wait();
142 if (m_my_rank_local_proc == 0)
143 m_mpi_window->barrier();
144 m_thread_barrier->wait();
145}
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
149
150} // namespace Arcane::MessagePassing
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
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.
Definition Span.h:513
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.
Definition Span.h:605
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>.
Definition Span.h:976
std::int32_t Int32
Type entier signé sur 32 bits.