Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TransferValuesParallelOperation.cc
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/* TransferValuesParallelOperation.cc (C) 2000-2020 */
9/* */
10/* Transfert de valeurs sur différents processeurs. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
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"
20
21#include "arcane/IParallelMng.h"
22#include "arcane/Timer.h"
23#include "arcane/ISerializer.h"
24#include "arcane/SerializeMessage.h"
25
26#include "arcane/impl/TransferValuesParallelOperation.h"
27
28#include "arccore/message_passing/PointToPointSerializerMng.h"
29
30#include <map>
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37using namespace Arccore::MessagePassing;
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42TransferValuesParallelOperation::
43TransferValuesParallelOperation(IParallelMng* pm)
44: m_parallel_mng(pm)
45{
46}
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
51TransferValuesParallelOperation::
52~TransferValuesParallelOperation()
53{
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59IParallelMng* TransferValuesParallelOperation::
60parallelMng()
61{
62 return m_parallel_mng;
63}
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68void TransferValuesParallelOperation::
69setTransferRanks(Int32ConstArrayView ranks)
70{
71 m_ranks = ranks;
72}
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76
77void TransferValuesParallelOperation::
79{
80 m_send32_values.add(send_values);
81 m_recv32_values.add(recv_values);
82}
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87void TransferValuesParallelOperation::
89{
90 m_send64_values.add(send_values);
91 m_recv64_values.add(recv_values);
92}
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
97void TransferValuesParallelOperation::
99{
100 m_send_real_values.add(send_values);
101 m_recv_real_values.add(recv_values);
102}
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106
107template<typename U> void TransferValuesParallelOperation::
108_putArray(ISerializer* s,
112{
113 Int64 nb = z_indexes.size();
114 tmp_values.resize(nb);
115 for( Integer z=0, zs=arrays.size(); z<zs; ++z ){
116 Span<const U> v = arrays[z];
117 for( Integer zz=0; zz<nb; ++zz )
118 tmp_values[zz] = v[z_indexes[zz]];
120 }
121}
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126template<typename U> void TransferValuesParallelOperation::
127_getArray(ISerializer* s, Integer nb, UniqueArray< SharedArray<U> >& arrays,
128 Array<U>& tmp_values)
129{
130 tmp_values.resize(nb);
131 for( Integer z=0, zs=arrays.size(); z<zs; ++z ){
132 s->getSpan(tmp_values);
133 for( Integer zz=0; zz<nb; ++zz )
134 arrays[z].add(tmp_values[zz]);
135 }
136}
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
141void TransferValuesParallelOperation::
142transferValues()
143{
144 String func_name = "TransfertValuesParallelOperation::transferValues()";
145 IParallelMng* pm = m_parallel_mng;
146 Timer::Phase tphase(pm->timeStats(),TP_Communication);
147
148 if (!pm->isParallel()){
149 throw NotImplementedException(func_name,"in sequential");
150 }
151
152 ITraceMng* trace = pm->traceMng();
153
154
155 Int32 my_rank = pm->commRank();
156 Int32 nb_send = m_ranks.size();
157
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();
161
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");
168
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");
172 }
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");
176 }
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");
180 }
181
182 typedef std::map<Int32,SharedArray<Int32> > SubDomainIndexMap;
184
185 for( Integer i=0; i<nb_send; ++i ){
186 Int32 sd = m_ranks[i];
187 if (sd==NULL_SUB_DOMAIN_ID)
188 ARCANE_FATAL("null sub_domain_id");
189 if (sd==my_rank)
190 ARCANE_FATAL("can not transfer to myself");
191 }
192
193 for( Integer i=0; i<nb_send; ++i ){
194 Int32 sd = m_ranks[i];
195 Int32Array& indexes = sub_domain_list[sd];
196 indexes.add(i);
197 }
198
200 for( SubDomainIndexMap::const_iterator b=sub_domain_list.begin();
201 b!=sub_domain_list.end(); ++b ){
202 Int32 sd = b->first;
203 Int64 n = b->second.size();
207 }
214 for( Int64 i=0, n=total_sub_domain_nb_to_send.size(); i<n; i+=3 ){
215 Int32 rank_send = CheckedConvert::toInt32(total_sub_domain_nb_to_send[i]);
216 Int32 rank_recv = CheckedConvert::toInt32(total_sub_domain_nb_to_send[i+1]);
217 //Integer nb_exchange = total_sub_domain_nb_to_send[i+2];
218 if (rank_send==rank_recv)
219 continue;
220 if (rank_recv==my_rank){
221 serializer_mng.addReceiveMessage(MessageRank(rank_send));
222 trace->info() << " ADD RECV MESSAGE recv=" << rank_recv << " send=" << rank_send;
223 }
224 else if (rank_send==my_rank){
225 trace->info() << " ADD SEND MESSAGE recv=" << rank_recv << " send=" << rank_send;
226 //sm = new SerializeMessage(rank_send,rank_recv,ISerializeMessage::MT_Send);
227 auto sm = serializer_mng.addSendMessage(MessageRank(rank_recv));
228 ISerializer* s = sm->serializer();
229 s->setMode(ISerializer::ModeReserve);
231 Integer nb = z_indexes.size();
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); // Pour la taille
236 for( Integer k=0; k<nb; ++k ){
240 }
241 s->allocateBuffer();
242 s->setMode(ISerializer::ModePut);
243 s->putInteger(nb);
244
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);
248 }
249 }
250
251 auto func = [&](ISerializeMessage* sm)
252 {
253 if (!sm->isSend()){
254 trace->info() << " GET RECV MESSAGE recv=" << sm->destination();
255 ISerializer* s = sm->serializer();
256 s->setMode(ISerializer::ModeGet);
257 Integer nb = s->getInteger();
258 trace->info() << " GET SIZE nb=" << nb;
259
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);
263 }
264 };
265 serializer_mng.waitMessages(Parallel::WaitAll,func);
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270
271} // End namespace Arcane
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Tableau d'items de types quelconques.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Positionne la phase de l'action en cours d'exécution.
Definition Timer.h:128
Exception lorsqu'un argument est invalide.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue constante d'un tableau de type T.
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 Integer getInteger()=0
Récupère une taille.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
virtual void putInteger(Integer value)=0
Ajoute l'entier value.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Communications point à point par des 'ISerializer'.
Exception lorsqu'une fonction n'est pas implémentée.
Vecteur 1D de données avec sémantique par référence.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
Definition MathUtils.h:885
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
@ DT_Real
Donnée de type réel.
Definition DataTypes.h:41
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...
Int32 Integer
Type représentant un entier.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.