14#include "arcane/parallel/VariableParallelOperationBase.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ScopedPtr.h"
19#include "arcane/IParallelMng.h"
20#include "arcane/ISerializer.h"
21#include "arcane/ISerializeMessage.h"
22#include "arcane/IParallelExchanger.h"
23#include "arcane/ISubDomain.h"
24#include "arcane/IVariable.h"
25#include "arcane/IItemFamily.h"
26#include "arcane/ItemInternal.h"
27#include "arcane/ItemGroup.h"
28#include "arcane/ParallelMngUtils.h"
38 const Int64 SERIALIZE_MAGIC_NUMBER = 0x4cf92789;
44VariableParallelOperationBase::
45VariableParallelOperationBase(IParallelMng* pm)
46: TraceAccessor(pm->traceMng())
48, m_item_family(nullptr)
55void VariableParallelOperationBase::
60 m_item_family = family;
75void VariableParallelOperationBase::
81 ARCANE_FATAL(
"variable->itemFamily() and itemFamily() differ");
82 m_variables.add(variable);
88void VariableParallelOperationBase::
91 if (m_variables.empty())
95 const bool is_debug_print =
true;
97 const bool is_debug_print =
false;
101 m_items_to_send.clear();
102 m_items_to_send.resize(nb_rank);
108 auto exchanger {ParallelMngUtils::createExchangerRef(pm)};
110 for( Integer i=0; i<nb_rank; ++i )
111 if (!m_items_to_send[i].empty())
112 exchanger->addSender(i);
114 bool no_exchange = exchanger->initializeCommunicationsMessages();
120 for( Integer i=0, is=exchanger->nbSender(); i<is; ++i ){
125 Integer nb_item = dest_items_internal.
size();
126 debug() <<
"Number of items to serialize: " << nb_item <<
" subdomain=" << dest_sub_domain;
130 for( Integer z=0; z<nb_item; ++z ){
131 Item item = item_list[dest_items_internal[z]];
132 dest_items_local_id[z] = item.
localId();
133 dest_items_unique_id[z] = item.
uniqueId().asInt64();
138 sbuf->
setMode(ISerializer::ModeReserve);
151 var->
serialize(sbuf,dest_items_local_id);
157 sbuf->
setMode(ISerializer::ModePut);
160 sbuf->
putInt64(SERIALIZE_MAGIC_NUMBER);
164 sbuf->
putSpan(dest_items_unique_id);
168 var->
serialize(sbuf,dest_items_local_id);
172 exchanger->processExchange();
175 debug() <<
"VariableParallelOperationBase::readVariables()";
181 for( Integer i=0, n=exchanger->nbReceiver(); i<n; ++i ){
188 Int64 magic_number = sbuf->
getInt64();
189 if (magic_number!=SERIALIZE_MAGIC_NUMBER)
190 ARCANE_FATAL(
"Bad magic number actual={0} expected={1}. This is probably due to incoherent messaging",
191 magic_number,SERIALIZE_MAGIC_NUMBER);
195 items_unique_id.
resize(nb_item);
196 sbuf->
getSpan(items_unique_id);
197 items_local_id.
resize(nb_item);
201 for( Integer iz=0; iz<nb_item; ++iz )
205 itemFamily()->itemsUniqueIdToLocalId(items_local_id,items_unique_id);
209 var->
serialize(sbuf,items_local_id,operation);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Interface d'une famille d'entités.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual void serialize(ISerializer *sbuffer, IDataOperation *operation=0)=0
virtual String name() const =0
Nom de la variable.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Vue sur une liste pour obtenir des informations sur les entités.
Classe de base d'un élément de maillage.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'un sérialiseur.
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void reserveSpan(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual Int64 getInt64()=0
Récupère une taille.
virtual void reserve(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
virtual ISerializer * serializer()=0
Sérialiseur.
virtual MessageRank destination() const =0
Rang du destinataire (si isSend() est vrai) ou de l'envoyeur.
Int32 value() const
Valeur du rang.
Vecteur 1D de données avec sémantique par valeur (style STL).
Implémentation de la concurrence.
@ DT_Int64
Donnée de type entier 64 bits.
@ Highest
Niveau le plus élevé