14#include "arcane/mesh/AsyncParticleExchanger.h"
15#include "arcane/core/IParallelNonBlockingCollective.h"
17#include "arccore/message_passing/BasicSerializeMessage.h"
29AsyncParticleExchanger::
39AsyncParticleExchanger::
40~AsyncParticleExchanger()
50void AsyncParticleExchanger::
56 m_bpe.setVerboseLevel(0);
62void AsyncParticleExchanger::
71 "AsyncParticleExchanger is not supported because NonBlocking"
72 " collectives are not available");
79void AsyncParticleExchanger::
82 info() <<
"AsyncParticleExchanger is used. It also use BasicParticleExchanger functionnalities";
85 m_nb_particle_send_before_reduction = 0;
86 m_nb_particle_send_before_reduction_tmp = 0;
87 m_sum_of_nb_particle_sent = 1;
93bool AsyncParticleExchanger::
107bool AsyncParticleExchanger::
121void AsyncParticleExchanger::
132bool AsyncParticleExchanger::
143void AsyncParticleExchanger::
155 return m_bpe.itemFamily();
161void AsyncParticleExchanger::
162setVerboseLevel(Integer level)
164 m_bpe.setVerboseLevel(level);
170Integer AsyncParticleExchanger::
173 return m_bpe.verboseLevel();
180asyncParticleExchanger()
188bool AsyncParticleExchanger::
197 ARCANE_UNUSED(functor);
203 m_bpe.m_nb_particle_send =
local_ids.size();
208 if (m_bpe.m_verbose_level>=1)
209 info() <<
"ASE_BeginLoop loop=" << m_bpe.m_nb_loop;
210 m_bpe._sendPendingMessages();
235 m_reduce_requests.clear();
236 if (m_bpe.m_verbose_level>=1)
237 info() <<
"PSM_IAllReduceFinished loop=" << m_bpe.m_nb_loop
238 <<
" total=" << m_sum_of_nb_particle_sent;
244 if ((!
has_local_flying_particles) && (m_reduce_requests.size() == 0) && (m_bpe.m_waiting_messages.size() == 0) && (m_bpe.m_pending_messages.size()==0)) {
245 if (m_sum_of_nb_particle_sent > 0) {
248 m_nb_particle_send_before_reduction = m_nb_particle_send_before_reduction_tmp;
249 if (m_bpe.m_verbose_level>=1)
250 info() <<
"PSM_DoIAllReduce loop=" << m_bpe.m_nb_loop
251 <<
" n=" << m_nb_particle_send_before_reduction
253 m_reduce_requests.add(
pnbc->allReduce(Parallel::ReduceSum,
256 m_nb_particle_send_before_reduction_tmp = 0;
268void AsyncParticleExchanger::
273 IMesh* mesh = m_bpe.m_item_family->mesh();
282 m_bpe.m_accumulate_infos.clear();
300 ISerializeMessage::MT_Send);
301 m_bpe.m_accumulate_infos[
j] =
sm;
303 m_bpe.m_pending_messages.add(
sm);
304 m_nb_particle_send_before_reduction_tmp +=
ids_to_send[
j].size();
314 MessageTag tag(Arcane::MessagePassing::internal::BasicSerializeMessage::DEFAULT_SERIALIZE_TAG_VALUE);
317 message.setBlocking(
false);
322 m_bpe.m_pending_messages.add(
recv_sm);
326 m_bpe.m_accumulate_infos.clear();
328 m_bpe.m_item_family->toParticleFamily()->removeParticles(
local_ids);
329 m_bpe.m_item_family->endUpdate();
335bool AsyncParticleExchanger::
340 m_bpe.m_message_list->waitMessages(Parallel::WaitSomeNonBlocking);
342 m_bpe.m_total_time_waiting += m_bpe.m_timer->lastActivationTime();
348 m_bpe.m_waiting_messages.clear();
357 if (
sm->finished()) {
370 m_bpe.m_waiting_messages.add(
sm);
380 AsyncParticleExchanger);
383 AsyncParticleExchanger);
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_REGISTER_SUB_DOMAIN_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
#define ARCANE_REGISTER_CASE_OPTIONS_NOAXL_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
virtual void build()
Construction de niveau build du service.
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.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual MessageId probe(const PointToPointMessageInfo &message)=0
Sonde si des messages sont disponibles.
virtual IParallelNonBlockingCollective * nonBlockingCollective() const =0
Interface des opérations collectives non blocantes.
virtual UniqueArray< Integer > testSomeRequests(ArrayView< Request > rvalues)=0
Test si une des requêtes rvalues est terminée.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface des opérations parallèles collectives non bloquantes.
Interface d'un échangeur de particules.
Groupe d'entités de maillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Message utilisant un SerializeBuffer.
Structure contenant les informations pour créer un service.
Positionne la phase de l'action en cours d'exécution.
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
Vue constante d'un tableau de type T.
Interface d'un message de sérialisation entre IMessagePassingMng.
Informations pour envoyer/recevoir un message point à point.
Exception lorsqu'une opération n'est pas supportée.
Vecteur 1D de données avec sémantique par valeur (style STL).
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
Int32 Integer
Type représentant un entier.