Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
IParallelExchanger.h
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/* IParallelExchanger.h (C) 2000-2022 */
9/* */
10/* Echange d'informations entre processeurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_IPARALLELEXCHANGER_H
13#define ARCANE_IPARALLELEXCHANGER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/ArcaneTypes.h"
18#include "arcane/Parallel.h"
19#include "arcane/ParallelExchangerOptions.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30class IParallelMng;
31class IItemFamily;
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*!
36 * \brief Echange d'informations entre processeurs.
37 *
38 * Cette classe permet d'envoyer et de recevoir des messages quelconques
39 * d'un nombre quelconque d'autre processeurs.
40 *
41 * Le fonctionnement est le suivant.
42 *
43 * 1. indiquer les autres PE avec lesquels on souhaite communiquer en appelant
44 * addSender(), éventuellement plusieurs fois.
45 * 2. appeller initializeCommunicationsMessages() pour déterminer la liste des
46 * PE pour lesquels on doit recevoir des infos. Il existe deux surchages
47 * pour cette méthode suivant si on connait ou non le nombre de rangs pour
48 * lesquels on doit recevoir des informations.
49 * 3. pour chaque message d'envoi, sérialiser les informations qu'on souhaite
50 * envoyer.
51 * 4. effectuer les envoies et les réceptions en appelant processExchange()
52 * 5. récupérer les messages recus (via messageToReceive()) et désérialiser
53 * leurs informations.
54 *
55 * Il est possible de spécifier, avant appel à processExchange(), la manière dont
56 * les messages seront envoyés via setExchangeMode(). Par défaut, le mécanisme
57 * utilisé est celui des communications point à point (EM_Independant) mais il
58 * est possible d'utiliser un mode collectif (EM_Collective) qui utilise
59 * des messages de type 'all to all'.
60 */
61class ARCANE_CORE_EXPORT IParallelExchanger
62{
63 public:
64
66 {
67 //! Utilise les échanges point à point (send/recv)
68 EM_Independant = ParallelExchangerOptions::EM_Independant,
69 //! Utilise les opération collectives (allToAll)
70 EM_Collective = ParallelExchangerOptions::EM_Collective,
71 //! Choisi automatiquement entre point à point ou collective.
72 EM_Auto = ParallelExchangerOptions::EM_Auto
73 };
74
75 public:
76
77 virtual ~IParallelExchanger() = default;
78
79 public:
80
81 /*!
82 * \brief Calcule les communications.
83 *
84 A partir de \a m_send_ranks donné par chaque processeur,
85 détermine la liste des processeurs à qui on doit envoyer un message.
86
87 Afin de connaître les processeurs desquels on attend des informations,
88 il est nécessaire de faire une communication (allGatherVariable()). Si on connait
89 à priori ces processeurs, il faut utiliser une des versions surchargée de cette
90 méthode.
91
92 \retval true s'il n'y a rien à échanger
93 \retval false sinon.
94 */
96
97 /*! \brief Calcule les communications.
98 *
99 * Suppose que la liste des processeurs dont on veut les informations est dans
100 * \a recv_ranks.
101 */
103
104 //! Effectue l'échange avec les options par défaut de ParallelExchangerOptions.
105 virtual void processExchange() =0;
106
107 //! Effectue l'échange avec les options \a options
108 virtual void processExchange(const ParallelExchangerOptions& options) =0;
109
110 public:
111
112 virtual IParallelMng* parallelMng() const =0;
113
114 //! Nombre de processeurs auquel on envoie
115 virtual Integer nbSender() const =0;
116 //! Liste des rangs des processeurs auquel on envoie
118 //! Ajoute un processeur à envoyer
119 virtual void addSender(Int32 rank) =0;
120 //! Message destiné au \a ième processeur
121 virtual ISerializeMessage* messageToSend(Integer i) =0;
122
123 //! Nombre de processeurs dont on va réceptionner les messages
124 virtual Integer nbReceiver() const =0;
125 //! Liste des rangs des processeurs dont on va réceptionner les messages
127 //! Message reçu du \a ième processeur
128 virtual ISerializeMessage* messageToReceive(Integer i) =0;
129
130 //! Positionne le mode d'échange.
131 [[deprecated("Y2021: Use ParallelExchangerOptions::setExchangeMode()")]]
132 virtual void setExchangeMode(eExchangeMode mode) =0;
133 //! Mode d'échange spécifié
134 [[deprecated("Y2021: Use ParallelExchangerOptions::exchangeMode()")]]
135 virtual eExchangeMode exchangeMode() const =0;
136
137 //! Positionne le niveau de verbosité
138 virtual void setVerbosityLevel(Int32 v) =0;
139 //! Niveau de verbosité
140 virtual Int32 verbosityLevel() const =0;
141
142 //! Positionne le nom de l'instance. Ce nom est utilisé lors des impressions
143 virtual void setName(const String& name) =0;
144 //! Nom de l'instance
145 virtual String name() const =0;
146};
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151} // End namespace Arcane
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156#endif
157
Echange d'informations entre processeurs.
virtual void addSender(Int32 rank)=0
Ajoute un processeur à envoyer.
virtual void setName(const String &name)=0
Positionne le nom de l'instance. Ce nom est utilisé lors des impressions.
virtual Integer nbSender() const =0
Nombre de processeurs auquel on envoie.
virtual void setExchangeMode(eExchangeMode mode)=0
Positionne le mode d'échange.
virtual Integer nbReceiver() const =0
Nombre de processeurs dont on va réceptionner les messages.
virtual String name() const =0
Nom de l'instance.
virtual void initializeCommunicationsMessages(Int32ConstArrayView recv_ranks)=0
Calcule les communications.
virtual void setVerbosityLevel(Int32 v)=0
Positionne le niveau de verbosité
virtual Int32 verbosityLevel() const =0
Niveau de verbosité
virtual eExchangeMode exchangeMode() const =0
Mode d'échange spécifié
virtual bool initializeCommunicationsMessages()=0
Calcule les communications.
virtual ISerializeMessage * messageToSend(Integer i)=0
Message destiné au ième processeur.
virtual void processExchange()=0
Effectue l'échange avec les options par défaut de ParallelExchangerOptions.
virtual void processExchange(const ParallelExchangerOptions &options)=0
Effectue l'échange avec les options options.
virtual Int32ConstArrayView senderRanks() const =0
Liste des rangs des processeurs auquel on envoie.
virtual Int32ConstArrayView receiverRanks()=0
Liste des rangs des processeurs dont on va réceptionner les messages.
virtual ISerializeMessage * messageToReceive(Integer i)=0
Message reçu du ième processeur.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Options pour IParallelMng::processExchange().
Vue constante d'un tableau de type T.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-