Arcane  v4.1.5.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MachineShMemWinBase.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* MachineShMemWinBase.h (C) 2000-2026 */
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_MACHINESHMEMWINBASE_H
16#define ARCANE_CORE_MACHINESHMEMWINBASE_H
17
18/*---------------------------------------------------------------------------*/
19/*---------------------------------------------------------------------------*/
20
22#include "arcane/utils/Ref.h"
23
24#include "arccore/base/Span.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35class IParallelMng;
36class IParallelMngInternal;
37namespace MessagePassing
38{
39 class IMachineShMemWinBaseInternal;
40}
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
45/*!
46 * \brief Classe permettant de créer une fenêtre mémoire partagée entre les
47 * sous-domaines d'un même noeud.
48 *
49 * Les segments de cette fenêtre ne sont pas contigüs en mémoire et peuvent
50 * être redimensionnés.
51 *
52 * La méthode \a add() permet d'ajouter des éléments de manière itérative.
53 */
54class ARCANE_CORE_EXPORT MachineShMemWinBase
55{
56
57 public:
58
59 /*!
60 * \brief Constructeur.
61 * \param pm Le parallelMng à utiliser.
62 * \param sizeof_segment La taille total de notre segment (en octet / doit
63 * être divisible par \a sizeof_elem).
64 * \param sizeof_elem La taille d'un élément de notre segment (en octet).
65 */
66 MachineShMemWinBase(IParallelMng* pm, Int64 sizeof_segment, Int32 sizeof_elem);
67
68 public:
69
70 /*!
71 * \brief Méthode permettant d'obtenir les rangs qui possèdent un segment
72 * dans la fenêtre.
73 *
74 * Appel non collectif.
75 *
76 * \return Une vue contenant les ids des rangs.
77 */
79
80 /*!
81 * \brief Méthode permettant d'attendre que tous les processus/threads
82 * du noeud appellent cette méthode pour continuer l'exécution.
83 */
84 void barrier() const;
85
86 /*!
87 * \brief Méthode permettant d'obtenir une vue sur notre segment.
88 *
89 * Appel non collectif.
90 *
91 * \return Une vue.
92 */
94
95 /*!
96 * \brief Méthode permettant d'obtenir une vue sur le segment d'un
97 * autre sous-domaine du noeud.
98 *
99 * Appel non collectif.
100 *
101 * \param rank Le rang du sous-domaine.
102 * \return Une vue.
103 */
105
106 /*!
107 * \brief Méthode permettant d'obtenir une vue sur notre segment.
108 *
109 * Appel non collectif.
110 *
111 * \return Une vue.
112 */
114
115 /*!
116 * \brief Méthode permettant d'obtenir une vue sur le segment d'un
117 * autre sous-domaine du noeud.
118 *
119 * Appel non collectif.
120 *
121 * \param rank Le rang du sous-domaine.
122 * \return Une vue.
123 */
125
126 /*!
127 * \brief Méthode permettant d'ajouter des élements dans notre segment.
128 *
129 * Appel collectif.
130 *
131 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
132 *
133 * Si le segment est trop petit, il sera redimensionné.
134 *
135 * Les sous-domaines ne souhaitant pas ajouter d'éléments peuvent appeler la
136 * méthode \a add() sans paramètres ou cette méthode avec une vue vide.
137 *
138 * \param elem Les éléments à ajouter.
139 */
140 void add(Span<const std::byte> elem);
141 /*!
142 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas ajouter
143 * d'éléments dans son segment.
144 *
145 * Appel collectif.
146 *
147 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
148 *
149 * Voir la documentation de \a add(Span<const std::byte> elem).
150 */
151 void add();
152
153 /*!
154 * \brief Méthode permettant d'ajouter des éléments dans le segment d'un
155 * autre sous-domaine.
156 *
157 * Appel collectif.
158 *
159 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
160 *
161 * Deux sous-domaines ne doivent pas ajouter d'éléments dans un même
162 * segment de sous-domaine.
163 *
164 * Si le segment ciblé est trop petit, il sera redimensionné.
165 *
166 * Les sous-domaines ne souhaitant pas ajouter d'éléments peuvent appeler la
167 * méthode \a addToAnotherSegment() sans paramètres.
168 *
169 * \param rank Le rang du sous-domaine avec le segment à modifier.
170 * \param elem Les éléments à ajouter.
171 */
173
174 /*!
175 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas ajouter
176 * d'éléments dans le segment d'un autre sous-domaine.
177 *
178 * Appel collectif.
179 *
180 * \note Les méthodes add(..) et addToAnotherSegment(..) ne se mélangent pas.
181 *
182 * Voir la documentation de \a addToAnotherSegment(Int32 rank, Span<const Type> elem).
183 */
184 void addToAnotherSegment();
185
186 /*!
187 * \brief Méthode permettant de réserver de l'espace mémoire dans notre segment.
188 *
189 * Appel collectif.
190 *
191 * Cette méthode ne fait rien si \a new_capacity est inférieur à l'espace
192 * mémoire déjà alloué pour le segment.
193 * Pour les sous-domaines ne souhaitant pas augmenter l'espace mémoire
194 * disponible pour leur segment, il est possible de mettre le paramètre
195 * \a new_capacity à 0 ou d'utiliser la méthode \a reserve() (sans
196 * arguments).
197 *
198 * L'espace qui sera réservé aura une taille supérieur ou égale à
199 * \a new_capacity.
200 *
201 * Cette méthode ne redimensionne pas le segment, il faudra toujours passer
202 * par la méthode add() pour ajouter des éléments.
203 *
204 * Pour redimensionner le segment, la méthode \a resize(Int64 new_size) est
205 * disponible.
206 *
207 * \param new_nb_elem_segment_capacity La nouvelle capacité demandée (en nombre d'éléments, pas en octet).
208 */
209 void reserve(Int64 new_nb_elem_segment_capacity);
210
211 /*!
212 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas réserver
213 * davantage de mémoire pour leurs segments.
214 *
215 * Appel collectif.
216 *
217 * Voir la documentation de \a reserve(Int64 new_nb_elem_segment_capacity).
218 */
219 void reserve();
220
221 /*!
222 * \brief Méthode permettant de redimensionner notre segment.
223 *
224 * Appel collectif.
225 *
226 * Si la taille fournie est inférieure à la taille actuelle du segment, les
227 * éléments situés après la taille fournie seront supprimés.
228 *
229 * Pour les sous-domaines ne souhaitant pas redimensionner leur segment, il est
230 * possible de mettre l'argument \a new_size à -1 ou d'appeler la méthode
231 * \a resize() (sans arguments).
232 *
233 * \param new_nb_elem_segment La nouvelle taille (en nombre d'éléments, pas en octet).
234 */
235 void resize(Int64 new_nb_elem_segment);
236
237 /*!
238 * \brief Méthode à appeler par le ou les sous-domaines ne souhaitant pas
239 * redimensionner leurs segments.
240 *
241 * Appel collectif.
242 *
243 * Voir la documentation de \a resize(Int64 new_nb_elem_segment).
244 */
245 void resize();
246
247 /*!
248 * \brief Méthode permettant de réduire l'espace mémoire réservé pour les
249 * segments au minimum nécessaire.
250 *
251 * Appel collectif.
252 */
253 void shrink();
254
255 private:
256
257 IParallelMngInternal* m_pm_internal;
259 Int32 m_sizeof_elem;
260};
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
265} // End namespace Arcane
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
270#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.
Interface du gestionnaire de parallélisme pour un sous-domaine.
void reserve(Int64 new_nb_elem_segment_capacity)
Méthode permettant de réserver de l'espace mémoire dans notre segment.
void barrier() const
Méthode permettant d'attendre que tous les processus/threads du noeud appellent cette méthode pour co...
MachineShMemWinBase(IParallelMng *pm, Int64 sizeof_segment, Int32 sizeof_elem)
Constructeur.
Span< const std::byte > segmentConstView() const
Méthode permettant d'obtenir une vue sur notre segment.
void resize(Int64 new_nb_elem_segment)
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.
void addToAnotherSegment(Int32 rank, Span< const std::byte > elem)
Méthode permettant d'ajouter des éléments dans le segment d'un autre sous-domaine.
ConstArrayView< Int32 > machineRanks() const
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
void add(Span< const std::byte > elem)
Méthode permettant d'ajouter des élements dans notre segment.
Span< std::byte > segmentView()
Méthode permettant d'obtenir une vue sur notre segment.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.