Arcane  v3.16.7.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
DynamicMachineMemoryWindow.h
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/* DynamicMachineMemoryWindow.h (C) 2000-2025 */
9/* */
10/* Classe permettant de créer des fenêtres mémoires pour un noeud de calcul. */
11/* Les segments de ces fenêtres ne sont pas contigües en mémoire et peuvent */
12/* être redimensionnées. */
13/*---------------------------------------------------------------------------*/
14
15#ifndef ARCANE_CORE_DYNAMICMACHINEMEMORYWINDOW_H
16#define ARCANE_CORE_DYNAMICMACHINEMEMORYWINDOW_H
17
18/*---------------------------------------------------------------------------*/
19/*---------------------------------------------------------------------------*/
20
21#include "arcane/core/DynamicMachineMemoryWindowBase.h"
23#include "arcane/utils/Ref.h"
24
25#include "arccore/base/Span.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36/*!
37 * \brief Classe permettant de créer une fenêtre mémoire partagée entre les
38 * sous-domaines d'un même noeud.
39 *
40 * Les segments de cette fenêtre ne sont pas contigüs en mémoire et peuvent
41 * être redimensionnés.
42 *
43 * La méthode \a add() permet d'ajouter des éléments de manière itérative.
44 *
45 * \tparam Type Le type des éléments de la fenêtre.
46 */
47template <class Type>
49{
50
51 public:
52
53 /*!
54 * \brief Constructeur.
55 * \param pm Le parallelMng à utiliser.
56 * \param nb_elem_segment Le nombre d'éléments initial.
57 */
59 : m_impl(pm, nb_elem_segment, static_cast<Int32>(sizeof(Type)))
60 {}
61
62 /*!
63 * \brief Constructeur.
64 * \param pm Le parallelMng à utiliser.
65 */
67 : m_impl(pm, 0, static_cast<Int32>(sizeof(Type)))
68 {}
69
70 public:
71
72 /*!
73 * \brief Méthode permettant d'obtenir les rangs qui possèdent un segment
74 * dans la fenêtre.
75 *
76 * Appel non collectif.
77 *
78 * \return Une vue contenant les ids des rangs.
79 */
81 {
82 return m_impl.machineRanks();
83 }
84
85 /*!
86 * \brief Méthode permettant d'attendre que tous les processus/threads
87 * du noeud appellent cette méthode pour continuer l'exécution.
88 */
89 void barrier() const
90 {
91 m_impl.barrier();
92 }
93 /*!
94 * \brief Méthode permettant d'obtenir une vue sur notre segment.
95 *
96 * Appel non collectif.
97 *
98 * \return Une vue.
99 */
101 {
102 return asSpan<Type>(m_impl.segmentView());
103 }
104
105 /*!
106 * \brief Méthode permettant d'obtenir une vue sur le segment d'un
107 * autre sous-domaine du noeud.
108 *
109 * Appel non collectif.
110 *
111 * \param rank Le rang du sous-domaine.
112 * \return Une vue.
113 */
115 {
116 return asSpan<Type>(m_impl.segmentView(rank));
117 }
118
119 /*!
120 * \brief Méthode permettant d'obtenir une vue sur notre segment.
121 *
122 * Appel non collectif.
123 *
124 * \return Une vue.
125 */
127 {
128 return asSpan<const Type>(m_impl.segmentConstView());
129 }
130
131 /*!
132 * \brief Méthode permettant d'obtenir une vue sur le segment d'un
133 * autre sous-domaine du noeud.
134 *
135 * Appel non collectif.
136 *
137 * \param rank Le rang du sous-domaine.
138 * \return Une vue.
139 */
141 {
142 return asSpan<const Type>(m_impl.segmentConstView(rank));
143 }
144
145 /*!
146 * \brief Méthode permettant d'ajouter des élements dans notre segment.
147 *
148 * Appel collectif.
149 *
150 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
151 *
152 * Si le segment est trop petit, il sera redimensionné.
153 *
154 * Les sous-domaines ne souhaitant pas ajouter d'éléments peuvent appeler la
155 * méthode \a add() sans paramètres ou cette méthode avec une vue vide.
156 *
157 * \param elem Les éléments à ajouter.
158 */
160 {
161 const Span<const std::byte> span_bytes(reinterpret_cast<const std::byte*>(elem.data()), elem.sizeBytes());
162 m_impl.add(span_bytes);
163 }
164
165 /*!
166 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas ajouter
167 * d'éléments dans son segment.
168 *
169 * Appel collectif.
170 *
171 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
172 *
173 * Voir la documentation de \a add(Span<const std::byte> elem).
174 */
175 void add()
176 {
177 m_impl.add();
178 }
179
180 /*!
181 * \brief Méthode permettant d'ajouter des éléments dans le segment d'un
182 * autre sous-domaine.
183 *
184 * Appel collectif.
185 *
186 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
187 *
188 * Deux sous-domaines ne doivent pas ajouter d'éléments dans un même
189 * segment de sous-domaine.
190 *
191 * Si le segment ciblé est trop petit, il sera redimensionné.
192 *
193 * Les sous-domaines ne souhaitant pas ajouter d'éléments peuvent appeler la
194 * méthode \a addToAnotherSegment() sans paramètres.
195 *
196 * \param rank Le rang du sous-domaine avec le segment à modifier.
197 * \param elem Les éléments à ajouter.
198 */
200 {
201 const Span<const std::byte> span_bytes(reinterpret_cast<const std::byte*>(elem.data()), elem.sizeBytes());
202 m_impl.addToAnotherSegment(rank, span_bytes);
203 }
204
205 /*!
206 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas ajouter
207 * d'éléments dans le segment d'un autre sous-domaine.
208 *
209 * Appel collectif.
210 *
211 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
212 *
213 * Voir la documentation de \a addToAnotherSegment(Int32 rank, Span<const Type> elem).
214 */
216 {
217 m_impl.addToAnotherSegment();
218 }
219
220 /*!
221 * \brief Méthode permettant de réserver de l'espace mémoire dans notre segment.
222 *
223 * Appel collectif.
224 *
225 * Cette méthode ne fait rien si \a new_capacity est inférieur à l'espace
226 * mémoire déjà alloué pour le segment.
227 * Pour les sous-domaines ne souhaitant pas augmenter l'espace mémoire
228 * disponible pour leur segment, il est possible de mettre le paramètre
229 * \a new_capacity à 0 ou d'utiliser la méthode \a reserve() (sans
230 * arguments).
231 *
232 * L'espace qui sera réservé aura une taille supérieur ou égale à
233 * \a new_capacity.
234 *
235 * Cette méthode ne redimensionne pas le segment, il faudra toujours passer
236 * par la méthode add() pour ajouter des éléments.
237 *
238 * Pour redimensionner le segment, la méthode \a resize(Int64 new_size) est
239 * disponible.
240 *
241 * \param new_capacity La nouvelle capacité demandée.
242 */
243 void reserve(Int64 new_capacity)
244 {
245 m_impl.reserve(new_capacity);
246 }
247
248 /*!
249 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas réserver
250 * davantage de mémoire pour leurs segments.
251 *
252 * Appel collectif.
253 *
254 * Voir la documentation de \a reserve(Int64 new_capacity).
255 */
256 void reserve()
257 {
258 m_impl.reserve();
259 }
260
261 /*!
262 * \brief Méthode permettant de redimensionner notre segment.
263 *
264 * Appel collectif.
265 *
266 * Si la taille fournie est inférieure à la taille actuelle du segment, les
267 * éléments situés après la taille fournie seront supprimés.
268 *
269 * Pour les sous-domaines ne souhaitant pas redimensionner leur segment, il est
270 * possible de mettre l'argument \a new_size à -1 ou d'appeler la méthode
271 * \a resize() (sans arguments).
272 *
273 * \param new_nb_elem La nouvelle taille.
274 */
275 void resize(Int64 new_nb_elem)
276 {
277 m_impl.resize(new_nb_elem);
278 }
279
280 /*!
281 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas
282 * redimensionner leurs segments.
283 *
284 * Appel collectif.
285 *
286 * Voir la documentation de \a resize(Int64 new_nb_elem).
287 */
288 void resize()
289 {
290 m_impl.resize();
291 }
292
293 /*!
294 * \brief Méthode permettant de réduire l'espace mémoire réservé pour les
295 * segments au minimum nécessaire.
296 *
297 * Appel collectif.
298 */
299 void shrink()
300 {
301 m_impl.shrink();
302 }
303
304 private:
305
307};
308
309/*---------------------------------------------------------------------------*/
310/*---------------------------------------------------------------------------*/
311
312} // End namespace Arcane
313
314/*---------------------------------------------------------------------------*/
315/*---------------------------------------------------------------------------*/
316
317#endif
Déclarations des types généraux de Arcane.
Vue constante d'un tableau de type T.
void barrier() const
Méthode permettant d'attendre que tous les processus/threads du noeud appellent cette méthode pour co...
void add(Span< const Type > elem)
Méthode permettant d'ajouter des élements dans notre segment.
Span< Type > segmentView()
Méthode permettant d'obtenir une vue sur notre segment.
void addToAnotherSegment()
Méthode à appeler par le ou les sous-domaines ne souhaitant pas ajouter d'éléments dans le segment d'...
void reserve()
Méthode à appeler par le ou les sous-domaines ne souhaitant pas réserver davantage de mémoire pour le...
ConstArrayView< Int32 > machineRanks() const
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
void add()
Méthode à appeler par le ou les sous-domaines ne souhaitant pas ajouter d'éléments dans son segment.
DynamicMachineMemoryWindow(IParallelMng *pm)
Constructeur.
DynamicMachineMemoryWindow(IParallelMng *pm, Int64 nb_elem_segment)
Constructeur.
void resize(Int64 new_nb_elem)
Méthode permettant de redimensionner notre segment.
void shrink()
Méthode permettant de réduire l'espace mémoire réservé pour les segments au minimum nécessaire.
Span< const Type > segmentConstView(Int32 rank) const
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
Span< Type > segmentView(Int32 rank)
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
void reserve(Int64 new_capacity)
Méthode permettant de réserver de l'espace mémoire dans notre segment.
void resize()
Méthode à appeler par le ou les sous-domaines ne souhaitant pas redimensionner leurs segments.
Span< const Type > segmentConstView() const
Méthode permettant d'obtenir une vue sur notre segment.
void addToAnotherSegment(Int32 rank, Span< const Type > elem)
Méthode permettant d'ajouter des éléments dans le segment d'un autre sous-domaine.
Interface du gestionnaire de parallélisme pour un sous-domaine.
constexpr __host__ __device__ SizeType sizeBytes() const noexcept
Retourne la taille du tableau en octets.
Definition Span.h:214
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:422
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
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.