TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Schema_Comm.h
1/****************************************************************************
2* Copyright (c) 2024, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Schema_Comm_included
17#define Schema_Comm_included
18
19#include <TRUSTArray.h>
20#include <TRUST_Ref.h>
21
22class Comm_Group;
23
24// Ces objets stockent un graphe de conversation entre
25// processeurs : chaque proc. possede une liste de processeurs a qui
26// envoyer et une liste de processeurs de qui recevoir.
27//
28// Le groupe est l'ensemble des processeurs sur lesquels on GARANTIT
29// que les methodes suivantes seront appelees SIMULTANEMENT sur tous
30// les processeurs du groupe :
31// - begin_comm()
32// - set_send_recv_pe_list(...)
33// - echange_taille_et_messages()
34// - end_comm()
35//
36// En particulier : Il est interdit d'utiliser ces methodes a
37// l'interieur d'une boucle qui n'est pas executee le meme nombre de
38// fois par tous les processeurs du groupe, ni a l'interieur d'un
39// "if() { }" dont le deroulement n'est pas identique sur tous les
40// processeurs du groupe.
41//
42// Il est interdit de commencer une nouvelle communication pendant
43// qu'une autre est en cours (une communication finit toujours par
44// "end_comm()")
45// Interdiction en particulier d'utiliser "envoyer", "recevoir" et les
46// fichiers disques partages entre le premier appel a schema.send_buffer()
47// et "terminer()". Faire tres attention a toutes les methodes qu'on utilise
48// entre ces deux appels !
49//
50// Sur un PE donne, une sequence d'echange doit etre construite comme suit:
51// schema.begin_comm()
52// schema.send_buffer(pe1) << data_to_send;
53// schema.send_buffer(pe2) << data_to_send;
54// ...
55// schema.echanger_taille_et_messages();
56// schema.recv_buffer(pe2) >> data_to_recv;
57// schema.recv_buffer(pe3) >> data_to_recv;
58// ...
59// schema.end_comm();
60//
61// La communication n'est pas forcement symetrique : un processeur peut envoyer
62// un message a un processeur et recevoir d'un autre.
63// En revanche, l'utilisateur garantit que les listes de processeurs fournies dans
64// send_pe_list et recv_pe_list verifient le principe "tu m'ecoutes quand je te parle !"
65// (c'est a dire qu'un processeur A appartient a send_pe_list sur le processeur B
66// si et seulement si le processeur B appartient a recv_pe_list sur le processeur A).
67
68// Modif BM 20/06/2013: j'ajoute set_all_to_allv_flag. Si le drapeau est mis, le schema de
69// communication utilise MPI_alltoallv au lieu de ISend IRecv. Pour tenter de resoudre
70// les problemes rencontres sur supermuc dans la routine de lecture ecriture fichiers
71// (schema tout le monde ecrit au processeur 0 => erreur d'allocation des MPI_requests).
72
75class InputCommBuffer;
76class Comm_Group;
77class Entree;
78class Sortie;
79
81{
82public:
86
87 void set_group(const Comm_Group& group); // Obsolete
88 const Comm_Group& get_group() const;
89
90 const Schema_Comm& operator= (const Schema_Comm&);
91 void set_send_recv_pe_list(const ArrOfInt& send_pe_list, const ArrOfInt& recv_pe_list, const int me_to_me = 0);
92
93 void begin_comm() const; // Statut passe a WRITING
94 // Autorise si status_ == WRITING:
95 Sortie& send_buffer(int num_PE) const;
96 void echange_taille_et_messages() const; // Statut passe a EXCHANGED
97 void echange_messages(const ArrOfInt& recv_size) const; // Statut passe a EXCHANGED
98 // Autorise si status_ == EXCHANGED:
99 Entree& recv_buffer(int num_PE) const;
100 void end_comm() const; // Statut passe a RESET
101 // Accesseurs:
102 const ArrOfInt& get_send_pe_list() const;
103 const ArrOfInt& get_recv_pe_list() const;
104
106
107protected:
108 void echange_taille(const ArrOfInt& send_size, ArrOfInt& recv_size) const;
109 void echange_messages(const ArrOfInt& send_size, const ArrOfInt& recv_size) const;
110 // Statut passe a EXCHANGED
111 void check_send_recv_pe_list() const;
112
113 // Un seul statut pour tous les echanges : on ne supporte pas les
114 // acces concurrents a la classe car on veut limiter le nombre
115 // de buffers et le nombre d'"outstanding requests".
116 // Donc : interdiction de commencer une nouvelle comm si les buffers
117 // sont en cours d'utilisation.
120 static OutputCommBuffer& obuffer(int pe);
121 static InputCommBuffer& ebuffer(int pe);
122
123 ArrOfInt send_pe_list_; // Liste des processeurs a qui envoyer
124 ArrOfInt recv_pe_list_; // Liste des processeurs de qui recevoir
125 int me_to_me_; // Drapeau: est-ce qu'on autorise a s'envoyer des messages a soi ?
126 OBS_PTR(Comm_Group) ref_group_;// Groupe de processeurs qui vont discuter
127
128 int use_all_to_allv_; // Drapeau, quel type de communication faut-il utiliser ?
129private:
130 // Les pointeurs sont ranges dans une classe specifique (destructeur
131 // des membres statiques appele automatiquement a la fin de l'execution
132 // pour liberer la memoire).
133 static InOutCommBuffers buffers_;
134 static int n_buffers_;
135};
136
138{
139public:
140 //void echange_taille();
141 //void echange_messages() const; // Statut passe a EXCHANGED
142 const ArrOfInt& get_send_size() const;
143 const ArrOfInt& get_recv_size() const;
144protected:
145 ArrOfInt send_size_; // Taille des messages a envoyer en bytes
146 ArrOfInt recv_size_; // Taille des messages a recevoir en bytes
147};
148
149#endif
: Cette classe decrit un groupe de processeurs sur lesquels
Definition Comm_Group.h:40
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
: Classe outil utilisee exclusivement par Schema_Comm.
: Classe outil utilisee exclusivement par Schema_Comm.
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.
ArrOfInt recv_pe_list_
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.
int use_all_to_allv_
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
ArrOfInt send_pe_list_
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.
void set_all_to_allv_flag(int x)
OBS_PTR(Comm_Group) ref_group_
static Static_Status status_
Schema_Comm()
Construction d'un nouveau schema de communication.
Classe de base des flux de sortie.
Definition Sortie.h:52