14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/EntryPoint.h"
17#include "arcane/ISubDomain.h"
18#include "arcane/IParallelMng.h"
19#include "arcane/ModuleFactory.h"
20#include "arcane/IMeshPartitioner.h"
21#include "arcane/ServiceUtils.h"
22#include "arcane/CommonVariables.h"
23#include "arcane/ITimeStats.h"
24#include "arcane/ITimeLoopMng.h"
25#include "arcane/ITimeHistoryMng.h"
26#include "arcane/IMesh.h"
27#include "arcane/IMeshModifier.h"
28#include "arcane/ItemPrinter.h"
29#include "arcane/IItemFamily.h"
31#include "arcane/std/ArcaneLoadBalance_axl.h"
38#define OLD_LOADBALANCE
59 void checkLoadBalance();
60 void loadBalanceInit();
77 Real _computeImbalance();
91ArcaneLoadBalanceModule::
94, m_elapsed_computation_time(
VariableBuildInfo(this,
"ArcaneLoadBalanceElapsedComputationTime",
96, m_computation_time(0.0)
106ArcaneLoadBalanceModule::
107~ArcaneLoadBalanceModule()
114void ArcaneLoadBalanceModule::
117 m_elapsed_computation_time = 0;
124void ArcaneLoadBalanceModule::
128 info() <<
"Load balance deactivated.";
133 info() <<
"Load balance required but inactive during serial execution";
137 info() <<
"Load balance active with maximum unbalance: "
150 Integer global_iteration =
sd->commonVariables().globalIteration();
151 int period =
options()->period();
154 if (global_iteration==0)
156 if ((global_iteration % period) != 0)
159 Real imbalance = _computeImbalance();
163 if (imbalance<
options()->maxImbalance())
170 info() <<
"Programme un repartitionnement du maillage";
171#ifdef OLD_LOADBALANCE
174 p->setCellsWeight(m_cells_weight,m_nb_weight);
181#ifdef OLD_LOADBALANCE
189 IMesh* mesh = this->mesh();
248 m_cells_weight[(
nb_weight*
iitem->localId())+i] = (
float)(
w*((Real)(i+1)));
274Real ArcaneLoadBalanceModule::
302 Real reduce_times[2];
303 reduce_times[0] = computation_time;
304 reduce_times[1] = -computation_time;
309 Real min_computation_time = reduce_times[0];
310 Real max_computation_time = -reduce_times[1];
312 max_computation_time = 1.;
314 min_computation_time = 1.;
316 computation_times[0] = computation_time;
320 Real ratio = computation_time / max_computation_time;
321 Real imbalance = (max_computation_time - min_computation_time) / min_computation_time;
322 info() <<
"Computing time used (" << pm->
commRank() <<
") :"
324 <<
" current=" << computation_time
325 <<
" min=" << min_computation_time
326 <<
" max=" << max_computation_time
327 <<
" ratio=" << ratio
328 <<
" imbalance=" << imbalance
331 IMeshPartitioner* p =
options()->partitioner();
332 p->setMaximumComputationTime(max_computation_time);
333 p->setComputationTimes(computation_times);
334 p->setImbalance(imbalance);
335 p->setMaxImbalance(
options()->maxImbalance());
ISubDomain * subDomain() const override
Sous-domaine associé au module.
IMesh * defaultMesh() const override
Maillage par défaut pour ce module.
IParallelMng * parallelMng() const override
Gestionnaire du parallélisme par échange de message.
Generation de la classe de base du Module.
CaseOptionsArcaneLoadBalance * options() const
Options du jeu de données du module.
Module d'équilibrage de charge.
void _computeWeights(RealConstArrayView compute_times, Real max_compute_time)
Calcule le poids de chaque maille et le range dans m_cells_weight.
void checkLoadBalance()
points d'entrée
Real m_computation_time
Temps de calcul depuis le dernier équilibrage Note: cette valeur doit être synchronisée.
virtual VersionInfo versionInfo() const
Version du module.
Interface d'une famille d'entités.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Interface d'un partitionneur de maillage.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void allGather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf)=0
Effectue un regroupement sur tous les processeurs. Il s'agit d'une opération collective....
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface du gestionnaire d'un sous-domaine.
virtual ITimeStats * timeStats() const =0
Statistiques des temps d'exécution.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual ITimeLoopMng * timeLoopMng()=0
Retourne le gestionnaire de la boucle en temps.
virtual ITimeHistoryMng * timeHistoryMng()=0
Retourne le gestionnaire d'historique.
virtual IParallelMng * allReplicaParallelMng() const =0
Retourne le gestionnaire de parallélisme pour tous les réplicats.
Classe gérant un historique de valeurs.
Interface gérant les statistiques sur les temps d'exécution.
Interface d'une variable.
Integer size() const
Nombre d'éléments du groupe.
Classe utilitaire pour imprimer les infos sur une entité.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
CellGroup ownCells() const
Retourne le groupe contenant toutes les mailles propres à ce domaine.
Informations pour construire un module.
Paramètres nécessaires à la construction d'une variable.
Informations sur une version.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue constante d'un tableau de type T.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.