15#include <Schema_Comm.h>
17#include <InOutCommBuffers.h>
18#include <Comm_Group.h>
19#include <communications.h>
20#include <Comm_Group_MPI.h>
28int Schema_Comm::n_buffers_ = 0;
35 assert(pe >= 0 && pe < n_buffers_);
36 return buffers_.obuffers_[pe];
44 assert(pe >= 0 && pe < n_buffers_);
45 return buffers_.ebuffers_[pe];
49static const int BEGIN_COMM_TAG = 1;
50static const int ECHANGE_MESSAGES_COMM_TAG = 2;
51static const int END_COMM_TAG = 3;
52static const int COPY_OPERATOR_TAG = 4;
106 ref_group_ = schema.ref_group_;
112 const Comm_Group& group = ref_group_.valeur();
126 assert(&group == &(ref_group_.valeur()));
136 return ref_group_.valeur();
146 const ArrOfInt& recv_pe_list,
154 const Comm_Group& group = ref_group_.valeur();
175 const Comm_Group& group = ref_group_.valeur();
180static void exchange_data(
const ArrOfInt& send_list,
181 const ArrOfInt& send_size,
182 const char *
const *
const send_buffers,
183 const ArrOfInt& recv_list,
184 const ArrOfInt& recv_size,
185 char *
const *
const recv_buffers,
199 recv_list, recv_size, recv_buffers);
205 const int n = group.
nproc();
209 ArrOfInt a_send_size(n);
210 ArrOfInt a_send_offset(n);
211 ArrOfInt a_recv_size(n);
212 ArrOfInt a_recv_offset(n);
215 for (i = 0; i < nsend; i++)
216 a_send_size[send_list[i]] = send_size[i];
218 for (i = 0, offset = 0; i < n; i++)
220 a_send_offset[i] = offset;
221 offset += a_send_size[i];
223 const int buf_size_send = offset;
225 for (i = 0; i < nrecv; i++)
226 a_recv_size[recv_list[i]] = recv_size[i];
228 for (i = 0, offset = 0; i < n; i++)
230 a_recv_offset[i] = offset;
231 offset += a_recv_size[i];
233 const int buf_size_recv = offset;
235 char *send_buffer = (
char *) malloc(buf_size_send);
236 char *recv_buffer = (
char *) malloc(buf_size_recv);
238 for (i = 0; i < nsend; i++)
239 memcpy(send_buffer + a_send_offset[send_list[i]],
243 ref_cast(
Comm_Group_MPI, group).all_to_allv(send_buffer, a_send_size.addr(), a_send_offset.addr(),
244 recv_buffer, a_recv_size.addr(), a_recv_offset.addr());
246 for (i = 0; i < nrecv; i++)
247 memcpy(recv_buffers[i],
248 recv_buffer + a_recv_offset[recv_list[i]],
265 ArrOfInt& recv_size)
const
267 static ArrOfInt send_sz;
268 static ArrOfInt recv_sz;
273 const Comm_Group& group = ref_group_.valeur();
286 const char ** send_buffers =
new const char* [n_send];
287 char ** recv_buffers =
new char* [n_recv];
290 send_sz =
sizeof(int);
292 for (i = 0; i < n_send; i++)
293 send_buffers[i] = (
char*) (& send_size[i]);
296 recv_sz =
sizeof(int);
298 for (i = 0; i < n_recv; i++)
299 recv_buffers[i] = (
char*) (& recv_size[i]);
306 delete[] recv_buffers;
307 delete[] send_buffers;
317 const ArrOfInt& recv_size)
const
320 const Comm_Group& group = ref_group_.valeur();
330 const char ** send_buffers =
new const char* [n_send];
331 char ** recv_buffers =
new char* [n_recv];
334 for (i = 0; i < n_recv; i++)
337 int size = recv_size[i];
339 recv_buffers[i] = buf.reserve_buffer(size);
341 for (i = 0; i < n_send; i++)
348 assert(send_size[i] == buf.get_buffer_size());
349 send_buffers[i] = buf.get_buffer();
357 delete[] recv_buffers;
358 delete[] send_buffers;
361 for (i = 0; i < n_recv; i++)
374 buf.create_stream_from_output_stream(obuf);
389 static ArrOfInt send_size;
390 static ArrOfInt recv_size;
394 for (i = 0; i < n_send; i++)
415 ArrOfInt send_size(n_send);
417 for (i = 0; i < n_send; i++)
424 ArrOfInt check_recv_size;
426 if (!(check_recv_size == recv_size))
428 Cerr <<
"Error in Schema_Comm::echange_messages : bad recv_size" << finl;
443 const Comm_Group& group = ref_group_.valeur();
453 for (i = 0; i < n; i++)
459 for (i = 0; i < n; i++)
476static int check_PE_in_list(
int num_pe,
const ArrOfInt& list)
480 for (i = 0; i < n && list[i] != num_pe; i++);
573 for (i = 0; i < n1; i++)
577 for (i = 0; i < n2; i++)
589 fail2 = !(recv_list == copie);
594 Cerr <<
"Error in Schema_Comm::check_send_recv_pe_list(), see .log files" << finl;
599 Process::Journal() <<
"processor ranks not in current group: current group size = " << np;
601 Process::Journal() <<
"recv_list should be this one:\n" << recv_list << finl;
: Classe Comm_Group_MPI, derivee de la classe abstraite Comm_Group.
: Cette classe decrit un groupe de processeurs sur lesquels
static int check_enabled()
virtual void send_recv_finish() const =0
int nproc() const
Renvoie le nombre de processeurs dans le groupe *this.
virtual void send_recv_start(const ArrOfInt &send_list, const ArrOfInt &send_size, const char *const *const send_buffers, const ArrOfInt &recv_list, const ArrOfInt &recv_size, char *const *const recv_buffers, TypeHint typehint=CHAR) const =0
virtual void barrier(int tag) const =0
Class defining operators and methods for all reading operation in an input flow (file,...
: Classe outil utilisee exclusivement par Schema_Comm.
static const Comm_Group & current_group()
renvoie une reference au groupe de processeurs actif courant
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
const ArrOfInt & get_send_size() const
renvoie une reference a un tableau qui contient, pour chaque processeur de send_pe_list_,...
const ArrOfInt & get_recv_size() const
renvoie une reference a un tableau qui contient, pour chaque processeur de send_pe_list_,...
void echange_messages(const ArrOfInt &recv_size) const
Cette methode lance l'echange de donnees.
static InputCommBuffer & ebuffer(int pe)
Accesseur a un membre du tableau ebuffers_ (avec verification).
const Schema_Comm & operator=(const Schema_Comm &)
Operateur copie : on copie la liste des processeurs qui communiquent.
void set_group(const Comm_Group &group)
Methode obsolete, le groupe associe au schema est le groupe courant au moment ou on cree le schema.
const Comm_Group & get_group() const
Renvoie le groupe auquel est associe le schema.
void echange_taille_et_messages() const
Cette methode lance l'echange de donnees entre tous les processeurs.
~Schema_Comm()
Destruction d'un schema de communication.
Sortie & send_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y entasser des donnees a envoyer.
static OutputCommBuffer & obuffer(int pe)
Accesseur a un membre du tableau obuffers_ (avec verification).
void end_comm() const
Vide les buffers et libere les ressources: on a fini de lire les donnees recues dans les buffers.
Entree & recv_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y lire les donnees recues.
void echange_taille(const ArrOfInt &send_size, ArrOfInt &recv_size) const
Transmet la taille des messages a envoyer aux processeurs qui vont les recevoir.
const ArrOfInt & get_recv_pe_list() const
void begin_comm() const
Reserve les buffers de comm pour une nouvelle communication.
void check_send_recv_pe_list() const
Verifie que les send/recv_pe_list verifient la propriete "tu m'ecoutes quand je te parle".
const ArrOfInt & get_send_pe_list() const
void set_send_recv_pe_list(const ArrOfInt &send_pe_list, const ArrOfInt &recv_pe_list, const int me_to_me=0)
Definit la liste des processeurs a qui on va envoyer et de qui on va recevoir des donnees.
static Static_Status status_
Schema_Comm()
Construction d'un nouveau schema de communication.
Classe de base des flux de sortie.
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)