Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
NonBlockingParticleExchanger.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* NonBlockingParticleExchanger.h (C) 2000-2020 */
9/* */
10/* Echangeur de particules. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_NONBLOCKINGPARTICLEEXCHANGER_H
13#define ARCANE_NONBLOCKINGPARTICLEEXCHANGER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/List.h"
18#include "arcane/utils/ScopedPtr.h"
19
20#include "arcane/mesh/MeshGlobal.h"
21
22#include "arcane/IParticleExchanger.h"
23#include "arcane/BasicService.h"
24#include "arcane/VariableCollection.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31class Timer;
32class SerializeMessage;
33}
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38namespace Arcane::mesh
39{
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
47: public BasicService
48, public IParticleExchanger
49{
50 private:
51 static const Integer MESSAGE_EXCHANGE = 1;
52 static const Integer MESSAGE_NB_FINISH_EXCHANGE = 2;
53 static const Integer MESSAGE_FINISH_EXCHANGE_STATUS = 3;
54 static const Integer MESSAGE_CHANGE_BLOCKING = 4;
55 public:
56
59
60 public:
61
62 void build() override {}
63 void initialize(IItemFamily* item_family) override;
64
65 public:
66
67 void beginNewExchange(Integer nb_particule) override;
68 IItemFamily* itemFamily() override { return m_item_family; }
72 IFunctor* functor) override;
77 IFunctor* functor) override;
81
83 IFunctor* functor) override;
84 void addNewParticles(Integer nb_particle) override
85 {
86 ARCANE_UNUSED(nb_particle);
87 throw NotImplementedException(A_FUNCINFO);
88 }
89 void setVerboseLevel(Integer level) override { m_verbose_level = level; }
90 Integer verboseLevel() const override { return m_verbose_level; }
91 IAsyncParticleExchanger * asyncParticleExchanger() override { return nullptr; }
92
93 void reset();
94
95 private:
96
97 IItemFamily* m_item_family;
98 IParallelMng* m_parallel_mng;
99 UniqueArray<SerializeMessage*> m_accumulate_infos;
100
101 Int32 m_rank;
102
105 Real m_total_time_functor;
106 Real m_total_time_waiting;
107
110
113
116
117 Ref<ISerializeMessageList> m_message_list;
118
119 Int64 m_nb_total_particle_finish_exchange;
120 Int64 m_nb_total_particle;
121
122 Integer m_nb_original_blocking_size;
125
126 bool m_exchange_finished;
127 Int32 m_master_proc;
128 bool m_need_general_receive;
129 bool m_end_message_sended;
130 bool m_can_process_messages;
131 bool m_can_process_non_blocking;
132
133 bool m_want_process_non_blocking;
134 bool m_want_fast_send_particles;
135
136 Integer m_nb_receive_message;
137
138 Int64 m_nb_particle_finished_exchange;
139
140 Int32UniqueArray m_waiting_local_ids;
141 Int32UniqueArray m_waiting_sub_domains_to_send;
142 Integer m_verbose_level;
143 bool m_is_debug;
144
145 private:
146
147 void _clearMessages();
148 void _serializeMessage(ISerializeMessage* msg,
152 void _deserializeMessage(ISerializeMessage* msg,
157 void _processFinishTrackingMessage();
158 void _addFinishExchangeParticle(Int64 nb_particle_finish_exchange);
159 void _sendFinishExchangeParticle();
160 void _addItemsToSend(Int32ConstArrayView local_ids,
164 void _sendPendingMessages();
165 void _checkNeedReceiveMessage();
166 bool _exchangeItems(Int32ConstArrayView local_ids,
170 IFunctor* functor);
173 void _checkInitialized();
174 void _processMessages(ItemGroup item_group,Int32Array* new_particle_local_ids,bool wait_all,IFunctor* functor);
175 bool _waitMessages(Integer nb_pending_particle,ItemGroup group,Int32Array* new_particle_local_ids,IFunctor* functor);
176};
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
181} // End namespace Arcane
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186#endif
Tableau d'items de types quelconques.
Classe de base de service lié à un sous-domaine.
Interface d'un échangeur de particules asynchrone.
Interface d'une famille d'entités.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface d'un échangeur de particules.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Structure contenant les informations pour créer un service.
Gestion d'un timer.
Definition Timer.h:62
Collection de variables.
void initialize(IItemFamily *item_family) override
Initialize l'échangeur pour la familly item_family.
UniqueArray< ISerializeMessage * > m_pending_messages
Liste des message en attente d'envoie.
bool exchangeItems(Integer nb_particle_finish_exchange, Int32ConstArrayView local_ids, Int32ConstArrayView sub_domains_to_send, ItemGroup item_group, IFunctor *functor) override
Échange des particules entre sous-domaines.
IAsyncParticleExchanger * asyncParticleExchanger() override
Gestion de l'asynchronisme (retourne nullptr si fonctionnalité non disponible)
UniqueArray< ISerializeMessage * > m_waiting_messages
Liste des message envoyés mais en cours de traitement.
VariableList m_variables_to_exchange
Liste des variables à échanger.
void beginNewExchange(Integer nb_particule) override
Commence un nouvel échange de particules.
void sendItems(Integer nb_particle_finish_exchange, Int32ConstArrayView local_ids, Int32ConstArrayView sub_domains_to_send) override
bool waitMessages(Integer nb_pending_particle, Int32Array *new_particle_local_ids, IFunctor *functor) override
void build() override
Construction de niveau build du service.
void addNewParticles(Integer nb_particle) override
Ajoute nb_particle dans l'échange actuel.
Integer verboseLevel() const override
Niveau de verbosité
Integer m_nb_blocking_size
Nombre de particules restantes avant de passer en mode bloquant.
IItemFamily * itemFamily() override
Famille associée.
void setVerboseLevel(Integer level) override
Positionne le niveau de verbosité (0 pour aucune message)
Vue constante d'un tableau de type T.
Exception lorsqu'une fonction n'est pas implémentée.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-