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
45class ArcaneLoadBalanceModule
46:
public ArcaneArcaneLoadBalanceObject
51 ~ArcaneLoadBalanceModule();
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: "
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
181#ifdef OLD_LOADBALANCE
195 Integer nb_weight = m_nb_weight;
204 bool has_compute_time = compute_times.
size()!=0;
205 bool has_cell_time = compute_times.
size()==2;
207 max_compute_time = 1.0;
208 Real compute_times0 = 1.0;
209 Real compute_times1 = 0.0;
210 if (has_compute_time){
211 compute_times0 = compute_times[0];
213 compute_times1 = compute_times[1];
216 bool dump_info =
true;
218 Real time_ratio = compute_times0 / max_compute_time;
219 Real time_ratio2 = compute_times1 / max_compute_time;
222 info() <<
" MAX_COMPUTE=" << max_compute_time;
223 info() <<
" COMPUTE 0=" << compute_times0;
224 info() <<
" COMPUTE 1=" << compute_times1;
225 info() <<
" TIME RATIO 0=" << time_ratio;
226 info() <<
" TIME RATIO 2=" << time_ratio2;
228 Real proportional_time = compute_times0 / (nb_own_cell+1);
231 info() <<
" PROPORTIONAL TIME=" << proportional_time;
234 Real max_weight = 0.0;
236 m_cells_weight.resize(cell_family->
maxLocalId()*nb_weight);
238 const Cell& cell = *iitem;
239 Real v0 = proportional_time;
241 if (dump_info && iitem.index()<10){
247 for(
Integer i=0; i<nb_weight; ++i ){
248 m_cells_weight[(nb_weight*iitem->localId())+i] = (float)(w*((
Real)(i+1)));
256 total_max_weight = 1.0;
259 info() <<
" TOTAL MAX WEIGHT=" << total_max_weight;
263 for(
Integer i=0; i<nb_weight; ++i ){
264 Integer idx = (nb_weight*iitem->localId())+i;
265 m_cells_weight[idx] = (float)(m_cells_weight[idx] / total_max_weight);
274Real ArcaneLoadBalanceModule::
282 Real elapsed_computation_time = time_stats->
elapsedTime(TP_Computation);
283 Real computation_time = elapsed_computation_time - m_elapsed_computation_time();
285 m_elapsed_computation_time = elapsed_computation_time;
295 Real my_time = computation_time;
299 thm->
addValue(
"SubDomainComputeTime",compute_times);
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.
Int32 globalIteration() const
Numéro de l'itération courante.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'une famille d'entités.
virtual Int32 maxLocalId() const =0
virtual void setDynamic(bool v)=0
Positionne la propriété indiquant si le maillage peut évoluer.
Interface d'un partitionneur de maillage.
virtual ARCANE_DEPRECATED_116 void setCellsWeight(ArrayView< float > weights, Integer nb_weight)=0
Permet de définir les poids des objets à partitionner : on doit utiliser le ILoadBalanceMng maintenan...
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 const CommonVariables & commonVariables() const =0
Informations sur les variables standards.
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.
virtual void addValue(const String &name, Real value, bool end_time=true, bool is_local=false)=0
Ajoute la valeur value à l'historique name.
virtual void registerActionMeshPartition(IMeshPartitionerBase *mesh_partitioner)=0
Programme un repartitionnement du maillage avec l'outil de partition mesh_partitioner.
Interface gérant les statistiques sur les temps d'exécution.
virtual Real elapsedTime(eTimePhase phase)=0
Temps réel écoulé pour la phase phase.
Interface d'une variable.
Integer size() const
Nombre d'éléments du groupe.
Classe utilitaire pour imprimer les infos sur une entité.
CellGroup ownCells() const
Retourne le groupe contenant toutes les mailles propres à ce domaine.
Informations pour construire un module.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
Informations sur une version.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
VariableRefScalarT< Real > VariableScalarReal
Variable scalaire de type réel.
@ ReduceMin
Minimum des valeurs.
@ ReduceMax
Maximum des valeurs.
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
Int32 Integer
Type représentant un entier.
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
double Real
Type représentant un réel.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
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.
std::int32_t Int32
Type entier signé sur 32 bits.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.