14#include "arcane/parallel/VariableParallelOperationBase.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ScopedPtr.h"
19#include "arcane/core/IParallelMng.h"
20#include "arcane/core/ISerializer.h"
21#include "arcane/core/ISerializeMessage.h"
22#include "arcane/core/IParallelExchanger.h"
23#include "arcane/core/ISubDomain.h"
24#include "arcane/core/IVariable.h"
25#include "arcane/core/IItemFamily.h"
26#include "arcane/core/ItemInternal.h"
27#include "arcane/core/ItemGroup.h"
28#include "arcane/core/ParallelMngUtils.h"
38 const Int64 SERIALIZE_MAGIC_NUMBER = 0x4cf92789;
44VariableParallelOperationBase::
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);
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 ){
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);
148 for( VariableList::Enumerator i_var(m_variables); ++i_var; ){
151 var->
serialize(sbuf,dest_items_local_id);
160 sbuf->
putInt64(SERIALIZE_MAGIC_NUMBER);
164 sbuf->
putSpan(dest_items_unique_id);
165 for( VariableList::Enumerator i_var(m_variables); ++i_var; ){
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 ){
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);
207 for( VariableList::Enumerator ivar(m_variables); ++ivar; ){
209 var->
serialize(sbuf,items_local_id,operation);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
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.
Interface d'un sérialiseur.
void reserveInt64(Int64 n)
Réserve pour n Int64.
@ ModePut
Le sérialiseur attend des reserve()
virtual Int64 getInt64()=0
Récupère une taille.
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual void reserveSpan(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
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.
virtual MessageRank destination() const =0
Rang du destinataire (si isSend() est vrai) ou de l'envoyeur.
virtual ISerializer * serializer()=0
Sérialiseur.
Int32 value() const
Valeur du rang.
IItemFamily * itemFamily() override
Famille d'entités sur laquelle on opère.
Classe d'accès aux traces.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
Vecteur 1D de données avec sémantique par valeur (style STL).
Ref< IParallelExchanger > createExchangerRef(IParallelMng *pm)
Retourne une interface pour transférer des messages entre rangs.
Implémentation de la concurrence.
@ Highest
Niveau le plus élevé
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.