Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
LoadBalanceMngInternal.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* LoadBalanceMngInternal.h (C) 2000-2024 */
9/* */
10/* Classe interne gérant l'équilibre de charge des maillages. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_IMPL_INTERNAL_LOADBALANCEMNGINTERNAL_H
13#define ARCANE_IMPL_INTERNAL_LOADBALANCEMNGINTERNAL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/internal/ILoadBalanceMngInternal.h"
18
19#include "arcane/core/IMesh.h"
20#include "arcane/core/IVariable.h"
21#include "arcane/core/VariableBuildInfo.h"
23#include "arcane/core/IVariableMng.h"
24#include "arcane/core/VariableTypes.h"
25#include "arcane/core/CommonVariables.h"
26#include "arcane/core/VariableCollection.h"
27#include "arcane/core/IItemFamily.h"
28#include "arcane/core/IParallelMng.h"
29
30#include "arcane/utils/ObjectImpl.h"
31#include "arcane/utils/AutoRef.h"
32#include "arcane/utils/ScopedPtr.h"
33#include "arcane/utils/FatalErrorException.h"
34#include "arcane/utils/ArgumentException.h"
35
36#include <unordered_map>
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41namespace Arcane
42{
43
44class PartitionerMemoryInfo;
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
55class ARCANE_IMPL_EXPORT IProxyItemVariable
56: public ObjectImpl
57{
58 public:
59 virtual ~IProxyItemVariable() { }
60
62 virtual Real operator[](ItemEnumerator i) const =0;
63
65 virtual Integer getPos() const =0;
66};
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
76class ARCANE_IMPL_EXPORT StoreIProxyItemVariable
77{
78 public:
79
80 StoreIProxyItemVariable(IVariable* var = nullptr, Integer pos = 0)
81 {
82 m_var = StoreIProxyItemVariable::proxyItemVariableFactory(var,pos);
83 }
84
86 if (m_var != src.m_var)
87 m_var = src.m_var;
88 }
89
91 Real operator[](ItemEnumerator i) const {
92 return ((*m_var)[i]);
93 }
94
96 /* if (m_var != src.m_var) */
97 m_var = src.m_var;
98 return *this;
99 }
100
101 Integer getPos() const {
102 return m_var->getPos();
103 }
104
105 protected:
107 static IProxyItemVariable* proxyItemVariableFactory(IVariable* var, Integer pos=0);
108
109 private:
112};
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
125{
126 public:
127
130 : m_family_names(IK_Unknown + 1, "__special__") // +1 car certaines variables sont associées à IK_Unknown
131 {
132 m_family_names[IK_Cell] = "Cell";
133 m_family_names[IK_Face] = "Face";
134 m_family_names[IK_Edge] = "Edge";
135 m_family_names[IK_Node] = "Node";
136 }
137 ~PartitionerMemoryInfo() = default;
138
140 Integer addEntity(const String& entity)
141 {
142 Integer pos;
143 pos = _findEntity(entity);
144 if (pos < 0) {
145 pos = m_family_names.size();
146 m_family_names.add(entity);
147 }
148 return pos;
149 }
150
151 // Calcul de la consommation mémoire pour chaque type d'entité.
152 // Les mailles bénéficient ensuite des contributions des autres entités adjacentes.
153 void computeMemory(IVariableMng* varMng)
154 {
155 Int32 length = m_family_names.size();
156 m_overall_memory.resize(length);
157 m_resident_memory.resize(length);
158 m_buffer.id = -1;
159 m_overall_memory.fill(0);
160 m_resident_memory.fill(0);
161
162 // For each variable, compute the size for one object.
163 for (VariableCollectionEnumerator vc(varMng->usedVariables()); ++vc;) {
164 const IVariable* var = *vc;
165 Integer memory = 0;
166 try {
167 if (var->dataType() != DT_String)
168 memory = dataTypeSize(var->dataType());
169 }
170 catch (const ArgumentException&) {
171 memory = 0; // Cannot know memory used for that ...
172 continue;
173 }
174 Int32 family_index = -1;
175 Integer kind = var->itemKind();
176 if (kind == IK_Particle) { // Not the same counter for all items
177 family_index = _findEntity(var->itemFamilyName());
178 if (family_index >= 0) {
179 m_overall_memory[family_index] += memory;
180 }
181 }
182 m_overall_memory[kind] += memory;
183
184 int properties = var->property();
185 if ((properties & IVariable::PNoExchange) ||
186 (properties & IVariable::PNoNeedSync) ||
187 (properties & IVariable::PTemporary) ||
188 (properties & IVariable::PSubDomainPrivate)) {
189 continue;
190 }
191 m_resident_memory[kind] += memory;
192 if (family_index >= 0) {
193 m_resident_memory[family_index] += memory;
194 }
195 }
196 }
197
199 Real getOverallMemory(const String& entity) const
200 {
201 Integer pos = _findEntity(entity);
202 if (pos >= 0)
203 return getOverallMemory(pos);
204 else
205 return 0;
206 }
207 Real getOverallMemory(Integer offset) const
208 {
209 return m_overall_memory[offset];
210 }
211 Real getOverallMemory(const Cell& cell)
212 {
213 _computeMemCell(cell);
214 return m_buffer.overall_memory;
215 }
216
218 Real getResidentMemory(const String& entity) const
219 {
220 Integer pos = _findEntity(entity);
221 if (pos >= 0)
222 return getResidentMemory(pos);
223 else
224 return 0;
225 }
226 Real getResidentMemory(Integer offset) const
227 {
228 return m_resident_memory[offset];
229 }
230 Real getResidentMemory(const Cell& cell)
231 {
232 _computeMemCell(cell);
233 return m_buffer.resident_memory;
234 }
235
237 Integer operator[](const String& entity) const
238 {
239 return _findEntity(entity);
240 }
241 const String& operator[](unsigned int i) const
242 {
243 return m_family_names[i];
244 }
245
246 private:
247
248 Integer _findEntity(const String& entity) const
249 {
250 for (int i = 0; i < m_family_names.size(); ++i) {
251 if (m_family_names[i] == entity)
252 return i;
253 }
254 return -1;
255 }
256
257 // Pour les mailles, on calcule la contribution mémoire des noeuds, aretes et faces.
258 void _computeMemCell(Cell cell)
259 {
260 Real contrib;
261 if (cell.localId() == m_buffer.id) // already computed
262 return;
263 m_buffer.id = cell.localId();
264 m_buffer.overall_memory = m_overall_memory[IK_Cell];
265 m_buffer.resident_memory = m_resident_memory[IK_Cell];
266
267 contrib = _computeMemContrib<Node>(cell.nodes());
268 m_buffer.overall_memory += contrib * m_overall_memory[IK_Node];
269 m_buffer.resident_memory += contrib * m_resident_memory[IK_Node];
270
271 contrib = _computeMemContrib<Face>(cell.faces());
272 m_buffer.overall_memory += contrib * m_overall_memory[IK_Face];
273 m_buffer.resident_memory += contrib * m_resident_memory[IK_Face];
274
275 contrib = _computeMemContrib<Edge>(cell.edges());
276 m_buffer.overall_memory += contrib * m_overall_memory[IK_Edge];
277 m_buffer.resident_memory += contrib * m_resident_memory[IK_Edge];
278 }
279
281 template <typename ItemKind>
283 {
284 Real contrib = 0.0;
285 //ItemEnumeratorT<ItemKind> iterator = list.enumerator();
286 for (const auto& item : list) {
287 contrib += 1.0 / (Real)(item.nbCell());
288 }
289 return contrib;
290 }
291
292 UniqueArray<String> m_family_names;
293 UniqueArray<Int32> m_overall_memory;
294 UniqueArray<Int32> m_resident_memory;
295
297 struct MemInfo
298 {
299 Int32 id = -1;
300 Real overall_memory = 0;
301 Real resident_memory = 0;
302 };
303 MemInfo m_buffer;
304};
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
310{
311 public:
312
314
315 public:
316
317 void init(IMesh* mesh);
318
319 void defaultMassCriterion(bool mass_criterion)
320 {
321 if (!m_is_edited_mass_criterion)
322 m_use_mass_as_criterion = mass_criterion;
323 }
324
325 void setMassCriterion(bool mass_criterion)
326 {
327 m_is_edited_mass_criterion = true;
328 m_use_mass_as_criterion = mass_criterion;
329 }
330
331 bool useMassAsCriterion() const { return m_use_mass_as_criterion; }
332 bool useNbCellsAsCriterion() const { return m_nb_cells_as_criterion; }
333
334 void resetCriteria();
335 void clearVariables();
336
337 void addCriterion(const StoreIProxyItemVariable& criterion)
338 {
339 m_event_vars.add(criterion);
340 }
341
342 Integer nbCriteria();
344
345 const VariableCellArrayReal& criteriaWeight() const
346 {
347 return *m_event_weights;
348 }
349
350 void addCommCost(const StoreIProxyItemVariable& comm_cost) { m_comm_vars.add(comm_cost); }
351 const VariableCellReal& massResWeight() const { return *m_mass_res_weight; }
352 const VariableCellReal& massWeight() const { return *m_mass_over_weight; }
353
354 void fillCellNewOwner()
355 {
356 if (!m_cell_new_owner.isNull())
357 m_cell_new_owner->fill(m_mesh->parallelMng()->commRank(), m_mesh->ownCells());
358 }
359
360 const VariableFaceReal& commCost() const { return *m_comm_costs; }
361
362 void setComputeComm(bool active) { m_need_compute_comm = active; }
363 bool cellCommContrib() const { return m_cell_comm; }
364 void setCellCommContrib(bool active) { m_cell_comm = active; }
365 void setNbCellsAsCriterion(bool active) { m_nb_cells_as_criterion = active; }
366 void addMass(const StoreIProxyItemVariable& mass) { m_mass_vars.add(mass); }
367 bool needComputeComm() const { return m_need_compute_comm; }
368 bool isInit() const { return m_is_init; }
369 Integer addEntity(const String& entity) { return m_criteria->addEntity(entity); }
370 void computeCriteria();
371
372 private:
373
374 void _computeOverallMass();
375 void _computeComm();
376 void _computeResidentMass();
377 void _computeEvents();
378
379 private:
380
384
385 bool m_use_mass_as_criterion = false;
386 bool m_nb_cells_as_criterion = true;
387 bool m_cell_comm = false;
388 bool m_need_compute_comm = false;
389 bool m_is_edited_mass_criterion = false;
390 bool m_is_init = false;
391
392 ScopedPtrT<VariableFaceReal> m_comm_costs;
393 ScopedPtrT<VariableCellReal> m_mass_over_weight;
394 ScopedPtrT<VariableCellReal> m_mass_res_weight;
395 ScopedPtrT<VariableCellArrayReal> m_event_weights;
396 ScopedPtrT<VariableCellInt32> m_cell_new_owner; // SdC This variable is a problem when using a custom mesh
397
398 IMesh* m_mesh = nullptr;
400};
401
402/*---------------------------------------------------------------------------*/
403/*---------------------------------------------------------------------------*/
404
405class ARCANE_IMPL_EXPORT LoadBalanceMngInternal
407{
408 public:
409
411
412 public:
413
414 void addMass(VariableCellInt32& count, IMesh* mesh, const String& entity) override;
415 void addCriterion(VariableCellInt32& count, IMesh* mesh) override;
416 void addCriterion(VariableCellReal& count, IMesh* mesh) override;
417 void addCommCost(VariableFaceInt32& count, IMesh* mesh, const String& entity) override;
418
419 void setMassAsCriterion(IMesh* mesh, bool active) override;
420 void setNbCellsAsCriterion(IMesh* mesh, bool active) override;
421 void setCellCommContrib(IMesh* mesh, bool active) override;
422 void setComputeComm(IMesh* mesh, bool active) override;
423 const VariableFaceReal& commCost(IMesh* mesh) override;
424 const VariableCellReal& massWeight(IMesh* mesh) override;
425 const VariableCellReal& massResWeight(IMesh* mesh) override;
426 const VariableCellArrayReal& mCriteriaWeight(IMesh* mesh) override;
427
428 bool cellCommContrib(IMesh* mesh) override;
429 Integer nbCriteria(IMesh* mesh) override;
430
431 void reset(IMesh* mesh) override;
432 void initAccess(IMesh* mesh) override;
433 void endAccess() override;
434 void notifyEndPartition() override;
435
436 private:
437
438 MeshHandle m_mesh_handle;
439 bool m_default_mass_criterion = false;
440 bool m_is_legacy_init = false;
441 std::unordered_map<IMesh*, Ref<CriteriaMng>> m_mesh_criterion;
442
443 private:
444
445 CriteriaMng& _getCriteria(IMesh* mesh);
446};
447
448/*---------------------------------------------------------------------------*/
449/*---------------------------------------------------------------------------*/
450
451} // End namespace Arcane
452
453/*---------------------------------------------------------------------------*/
454/*---------------------------------------------------------------------------*/
455
456#endif
Types et macros pour itérer sur les entités du maillage.
API interne à Arcane de ILoadBalanceMng.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface proxy pour accéder aux variables définissant les poids.
virtual Real operator[](ItemEnumerator i) const =0
Accès à la valeur associée à une entité du maillage, sous forme d'un Real.
virtual Integer getPos() const =0
Accès au numéro de la famille associée.
Interface du gestionnaire de variables.
Interface d'une variable.
Definition IVariable.h:54
virtual String itemFamilyName() const =0
Nom de la famille associée (nul si aucune).
virtual int property() const =0
Retourne les propriétés de la variable.
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
@ PNoExchange
Indique que la variable ne doit pas être échangée.
Definition IVariable.h:143
@ PTemporary
Indique que la variable est temporaire.
Definition IVariable.h:126
@ PSubDomainPrivate
Indique que la variable est privée au sous-domaine.
Definition IVariable.h:99
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
Definition IVariable.h:80
Enumérateur sur une liste d'entités.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Handle sur un maillage.
Definition MeshHandle.h:47
Classe de base d'un objet avec compteur de référence.
Definition ObjectImpl.h:36
Classe de gestion des critèes de partitionnement.
Integer operator[](const String &entity) const
Gestion des entités et de leur nom.
PartitionerMemoryInfo()
Construction en fonction du IVariableMng.
Real _computeMemContrib(ItemConnectedListViewTypeT< ItemKind > list)
Calcule de la contribution d'un entité sur les mailles adjacentes.
Integer addEntity(const String &entity)
Ajoute une entité et lui attribue un numéro. Un même nom n'est pas dupliqué.
Real getResidentMemory(const String &entity) const
Retourne la mémoire "résidente" (à transférer) associée à une entité.
Real getOverallMemory(const String &entity) const
Retourne la mémoire totale associée à une entité.
Classe pour accéder au proxy sans déférencement dans le code.
AutoRefT< IProxyItemVariable > m_var
Pointeur vers la variable.
Real operator[](ItemEnumerator i) const
Accès à la valeur associée à une entité du maillage, sous forme d'un Real.
Integer size() const
Nombre d'éléments du vecteur.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ARCANE_DATATYPE_EXPORT Integer dataTypeSize(eDataType type)
Taille du type de donnée type (qui doit être différent de DT_String)
Definition DataTypes.cc:109
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
@ DT_String
Donnée de type chaîne de caractère UTF-8.
Definition DataTypes.h:45
Int32 Integer
Type représentant un entier.
Système de cache pour l'accès aux mémoires relatives à une maille.