Arcane  v3.16.8.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
HybridDynamicMachineMemoryWindowBaseInternal.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/* HybridDynamicMachineMemoryWindowBaseInternal.cc (C) 2000-2025 */
9/* */
10/* Classe permettant de créer des fenêtres mémoires pour l'ensemble des */
11/* sous-domaines en mémoire partagée des processus du même noeud. */
12/* Les segments de ces fenêtres ne sont pas contigüs en mémoire et peuvent */
13/* être redimensionnés. */
14/*---------------------------------------------------------------------------*/
15
16#include "arcane/utils/FatalErrorException.h"
17
18#include "arcane/parallel/mpithread/internal/HybridDynamicMachineMemoryWindowBaseInternal.h"
19
20#include "arcane/parallel/mpithread/HybridMessageQueue.h"
21
22#include "arccore/concurrency/IThreadBarrier.h"
23#include "arccore/message_passing_mpi/internal/MpiDynamicMultiMachineMemoryWindowBaseInternal.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34HybridDynamicMachineMemoryWindowBaseInternal::
35HybridDynamicMachineMemoryWindowBaseInternal(Int32 my_rank_mpi, Int32 my_rank_local_proc, Int32 nb_rank_local_proc, ConstArrayView<Int32> ranks, Int32 sizeof_type, Ref<Mpi::MpiDynamicMultiMachineMemoryWindowBaseInternal> mpi_windows, IThreadBarrier* barrier)
36: m_my_rank_local_proc(my_rank_local_proc)
37, m_nb_rank_local_proc(nb_rank_local_proc)
38, m_my_rank_mpi(my_rank_mpi)
39, m_machine_ranks(ranks)
40, m_sizeof_type(sizeof_type)
41, m_mpi_windows(mpi_windows)
42, m_thread_barrier(barrier)
43{}
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48Int32 HybridDynamicMachineMemoryWindowBaseInternal::
49sizeofOneElem() const
50{
51 return m_sizeof_type;
52}
53
54/*---------------------------------------------------------------------------*/
55/*---------------------------------------------------------------------------*/
56
57ConstArrayView<Int32> HybridDynamicMachineMemoryWindowBaseInternal::
58machineRanks() const
59{
60 return m_machine_ranks;
61}
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
66void HybridDynamicMachineMemoryWindowBaseInternal::
67barrier() const
68{
69 m_thread_barrier->wait();
70 if (m_my_rank_local_proc == 0)
71 m_mpi_windows->barrier();
72 m_thread_barrier->wait();
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
78Span<std::byte> HybridDynamicMachineMemoryWindowBaseInternal::
79segmentView()
80{
81 return m_mpi_windows->segmentView(m_my_rank_local_proc);
82}
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87Span<std::byte> HybridDynamicMachineMemoryWindowBaseInternal::
88segmentView(Int32 rank)
89{
90 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
91 const Int32 rank_local_proc = my_fri.localRankValue();
92 const Int32 rank_mpi = my_fri.mpiRankValue();
93
94 return m_mpi_windows->segmentView(rank_mpi, rank_local_proc);
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100Span<const std::byte> HybridDynamicMachineMemoryWindowBaseInternal::
101segmentConstView() const
102{
103 return m_mpi_windows->segmentConstView(m_my_rank_local_proc);
104}
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108
109Span<const std::byte> HybridDynamicMachineMemoryWindowBaseInternal::
110segmentConstView(Int32 rank) const
111{
112 FullRankInfo my_fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
113 const Int32 rank_local_proc = my_fri.localRankValue();
114 const Int32 rank_mpi = my_fri.mpiRankValue();
115
116 return m_mpi_windows->segmentConstView(rank_mpi, rank_local_proc);
117}
118
119/*---------------------------------------------------------------------------*/
120/*---------------------------------------------------------------------------*/
121
122void HybridDynamicMachineMemoryWindowBaseInternal::
123add(Span<const std::byte> elem)
124{
125 m_mpi_windows->requestAdd(m_my_rank_local_proc, elem);
126 m_thread_barrier->wait();
127 if (m_my_rank_local_proc == 0) {
128 m_mpi_windows->executeAdd();
129 }
130 m_thread_barrier->wait();
131}
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135
136void HybridDynamicMachineMemoryWindowBaseInternal::
137add()
138{
139 m_thread_barrier->wait();
140 if (m_my_rank_local_proc == 0) {
141 m_mpi_windows->executeAdd();
142 }
143 m_thread_barrier->wait();
144}
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
149void HybridDynamicMachineMemoryWindowBaseInternal::
150addToAnotherSegment(Int32 rank, Span<const std::byte> elem)
151{
152 FullRankInfo fri = FullRankInfo::compute(MP::MessageRank(rank), m_nb_rank_local_proc);
153 Int32 rank_local_proc = fri.localRankValue();
154 Int32 rank_mpi = fri.mpiRankValue();
155
156 m_mpi_windows->requestAddToAnotherSegment(m_my_rank_local_proc, rank_mpi, rank_local_proc, elem);
157 m_thread_barrier->wait();
158
159 if (m_my_rank_local_proc == 0) {
160 m_mpi_windows->executeAddToAnotherSegment();
161 }
162 m_thread_barrier->wait();
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168void HybridDynamicMachineMemoryWindowBaseInternal::
169addToAnotherSegment()
170{
171 m_thread_barrier->wait();
172
173 if (m_my_rank_local_proc == 0) {
174 m_mpi_windows->executeAddToAnotherSegment();
175 }
176 m_thread_barrier->wait();
177}
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181
182void HybridDynamicMachineMemoryWindowBaseInternal::
183reserve(Int64 new_capacity)
184{
185 m_mpi_windows->requestReserve(m_my_rank_local_proc, new_capacity);
186 m_thread_barrier->wait();
187 if (m_my_rank_local_proc == 0) {
188 m_mpi_windows->executeReserve();
189 }
190 m_thread_barrier->wait();
191}
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
196void HybridDynamicMachineMemoryWindowBaseInternal::
197reserve()
198{
199 m_thread_barrier->wait();
200 if (m_my_rank_local_proc == 0) {
201 m_mpi_windows->executeReserve();
202 }
203 m_thread_barrier->wait();
204}
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209void HybridDynamicMachineMemoryWindowBaseInternal::
210resize(Int64 new_size)
211{
212 m_mpi_windows->requestResize(m_my_rank_local_proc, new_size);
213 m_thread_barrier->wait();
214 if (m_my_rank_local_proc == 0) {
215 m_mpi_windows->executeResize();
216 }
217 m_thread_barrier->wait();
218}
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
223void HybridDynamicMachineMemoryWindowBaseInternal::
224resize()
225{
226 m_thread_barrier->wait();
227 if (m_my_rank_local_proc == 0) {
228 m_mpi_windows->executeResize();
229 }
230 m_thread_barrier->wait();
231}
232
233/*---------------------------------------------------------------------------*/
234/*---------------------------------------------------------------------------*/
235
236void HybridDynamicMachineMemoryWindowBaseInternal::
237shrink()
238{
239 m_thread_barrier->wait();
240 if (m_my_rank_local_proc == 0) {
241 m_mpi_windows->executeShrink();
242 }
243 m_thread_barrier->wait();
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
249} // namespace Arcane::MessagePassing
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
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
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.
std::int32_t Int32
Type entier signé sur 32 bits.