Arcane  v4.1.1.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.
Types et fonctions associés aux classes SpanImpl, SmallSpan and Span.
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__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:537
constexpr __host__ __device__ SizeType sizeBytes() const noexcept
Retourne la taille du tableau en octets.
Definition Span.h:327
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
-*- 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:1114
std::int32_t Int32
Type entier signé sur 32 bits.