14#include "arcane/utils/Array.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/CheckedConvert.h"
21#include "arcane/core/IParallelMng.h"
22#include "arcane/core/Timer.h"
23#include "arcane/core/ISerializer.h"
24#include "arcane/core/internal/SerializeMessage.h"
26#include "arcane/impl/TransferValuesParallelOperation.h"
28#include "arccore/message_passing/PointToPointSerializerMng.h"
37using namespace Arccore::MessagePassing;
42TransferValuesParallelOperation::
51TransferValuesParallelOperation::
52~TransferValuesParallelOperation()
62 return m_parallel_mng;
68void TransferValuesParallelOperation::
77void TransferValuesParallelOperation::
80 m_send32_values.add(send_values);
81 m_recv32_values.add(recv_values);
87void TransferValuesParallelOperation::
90 m_send64_values.add(send_values);
91 m_recv64_values.add(recv_values);
97void TransferValuesParallelOperation::
100 m_send_real_values.add(send_values);
101 m_recv_real_values.add(recv_values);
107template<
typename U>
void TransferValuesParallelOperation::
115 for(
Integer z=0, zs=arrays.size(); z<zs; ++z ){
117 for(
Integer zz=0; zz<nb; ++zz )
118 tmp_values[zz] = v[z_indexes[zz]];
126template<
typename U>
void TransferValuesParallelOperation::
131 for(
Integer z=0, zs=arrays.size(); z<zs; ++z ){
133 for(
Integer zz=0; zz<nb; ++zz )
134 arrays[z].
add(tmp_values[zz]);
141void TransferValuesParallelOperation::
144 String func_name =
"TransfertValuesParallelOperation::transferValues()";
156 Int32 nb_send = m_ranks.size();
158 Int64 nb_send_int32 = m_send32_values.size();
159 Int64 nb_send_int64 = m_send64_values.size();
160 Int64 nb_send_real = m_send_real_values.size();
162 if (nb_send_int32!=m_recv32_values.size())
163 throw ArgumentException(func_name,
"Int32 send_array and Int32 recv_array do not have the same size");
164 if (nb_send_int64!=m_recv64_values.size())
165 throw ArgumentException(func_name,
"Int64 send_array and Int64 recv_array do not have the same size");
166 if (nb_send_real!=m_recv_real_values.size())
167 throw ArgumentException(func_name,
"Real send_array and Real recv_array do not have the same size");
169 for(
Int64 i=0; i<nb_send_int32; ++i ){
170 if (m_send32_values[i].size()!=nb_send)
171 throw ArgumentException(func_name,
"Int32 array and ranks do not have the same size");
173 for(
Int64 i=0; i<nb_send_int64; ++i ){
174 if (m_send64_values[i].size()!=nb_send)
175 throw ArgumentException(func_name,
"Int64 array and ranks do not have the same size");
177 for(
Int64 i=0; i<nb_send_real; ++i ){
178 if (m_send_real_values[i].size()!=nb_send)
179 throw ArgumentException(func_name,
"Real array and ranks do not have the same size");
182 typedef std::map<Int32,SharedArray<Int32> > SubDomainIndexMap;
183 SubDomainIndexMap sub_domain_list;
185 for(
Integer i=0; i<nb_send; ++i ){
186 Int32 sd = m_ranks[i];
187 if (sd==NULL_SUB_DOMAIN_ID)
193 for(
Integer i=0; i<nb_send; ++i ){
194 Int32 sd = m_ranks[i];
200 for( SubDomainIndexMap::const_iterator b=sub_domain_list.begin();
201 b!=sub_domain_list.end(); ++b ){
203 Int64 n = b->second.size();
204 sub_domain_nb_to_send.
add(my_rank);
205 sub_domain_nb_to_send.
add(sd);
206 sub_domain_nb_to_send.
add(n);
214 for(
Int64 i=0, n=total_sub_domain_nb_to_send.
size(); i<n; i+=3 ){
218 if (rank_send==rank_recv)
220 if (rank_recv==my_rank){
222 trace->
info() <<
" ADD RECV MESSAGE recv=" << rank_recv <<
" send=" << rank_send;
224 else if (rank_send==my_rank){
225 trace->
info() <<
" ADD SEND MESSAGE recv=" << rank_recv <<
" send=" << rank_send;
229 s->
setMode(ISerializer::ModeReserve);
232 trace->
info() <<
" ADD SIZE int32=" << nb*nb_send_int32
233 <<
" int64=" << nb*nb_send_int64
234 <<
" real=" << nb*nb_send_real;
235 s->reserveInteger(1);
245 _putArray(s,z_indexes,m_send32_values,tmp_values_int32);
246 _putArray(s,z_indexes,m_send64_values,tmp_values_int64);
247 _putArray(s,z_indexes,m_send_real_values,tmp_values_real);
254 trace->
info() <<
" GET RECV MESSAGE recv=" << sm->destination();
258 trace->
info() <<
" GET SIZE nb=" << nb;
260 _getArray(s,nb,m_recv32_values,tmp_values_int32);
261 _getArray(s,nb,m_recv64_values,tmp_values_int64);
262 _getArray(s,nb,m_recv_real_values,tmp_values_real);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
Exception lorsqu'un argument est invalide.
Tableau d'items de types quelconques.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual ITimeStats * timeStats() const =0
Gestionnaire de statistiques associé (peut être nul)
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual IMessagePassingMng * messagePassingMng() const =0
Gestionnaire de message de Arccore associé
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface d'un sérialiseur.
virtual Integer getInteger()=0
Récupère une taille.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void putInteger(Integer value)=0
Ajoute l'entier value.
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.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Interface d'un message de sérialisation entre IMessagePassingMng.
Communications point à point par des 'ISerializer'.
Integer waitMessages(eWaitType wt, std::function< void(ISerializeMessage *)> functor)
Attend que les messages aient terminé leur exécution.
Ref< ISerializeMessage > addSendMessage(MessageRank receiver_rank)
Créé message de sérialisation en envoi.
Ref< ISerializeMessage > addReceiveMessage(MessageRank sender_rank)
Créé un message de sérialisation en réception.
Exception lorsqu'une fonction n'est pas implémentée.
Vecteur 1D de données avec sémantique par référence.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Positionne la phase de l'action en cours d'exécution.
Vecteur 1D de données avec sémantique par valeur (style STL).
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ Real
Donnée de type entier 8 bits.
@ Int32
Donnée de type entier 32 bits.
@ Int64
Donnée de type entier 64 bits.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
std::int32_t Int32
Type entier signé sur 32 bits.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.