Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
GatherMessageInfo.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* GatherMessageInfo.h (C) 2000-2023 */
9/* */
10/* Informations pour les messages 'gather'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_MESSAGEPASSING_GATHERMESSAGEINFO_H
13#define ARCCORE_MESSAGEPASSING_GATHERMESSAGEINFO_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/collections/Array.h"
18#include "arccore/message_passing/MessageRank.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
24{
25/*!
26 * \brief Informations pour un message 'gather'.
27 *
28 * Il faut plutôt utiliser la classe GatherMessageInfo plutôt que cette classe.
29 * Cette classe permet d'utiliser les messages de type 'Gather', 'GatherVariable',
30 * 'AllGather' et 'AllGatherVariable' de manière générique.
31 */
32class ARCCORE_MESSAGEPASSING_EXPORT GatherMessageInfoBase
33{
34 public:
35
36 //! Mode du message
37 enum class Mode
38 {
39 Gather,
40 GatherVariable,
41 GatherVariableNeedComputeInfo,
42 Null
43 };
44
45 public:
46
47 //! Message pout tout le monde et bloquant
49
50 //! Message bloquant ayant pour destination \a rank
52 : m_destination_rank(dest_rank)
53 {}
54
55 //! Message ayant pour destination \a dest_rank et mode bloquant \a blocking_type
57 : m_destination_rank(dest_rank)
58 , m_is_blocking(blocking_type == Blocking)
59 {}
60
61 public:
62
63 void setBlocking(bool is_blocking)
64 {
65 m_is_blocking = is_blocking;
66 }
67 //! Indique si le message est bloquant.
68 bool isBlocking() const { return m_is_blocking; }
69
70 //! Rang de la destination du message
71 MessageRank destinationRank() const { return m_destination_rank; }
72
73 //! Positionne le rang de la destination du message
75 {
76 m_destination_rank = rank;
77 }
78
79 //! Mode du message
80 Mode mode() const { return m_mode; }
81
82 //! Affiche le message
83 void print(std::ostream& o) const;
84
85 friend std::ostream& operator<<(std::ostream& o, const GatherMessageInfoBase& pmessage)
86 {
87 pmessage.print(o);
88 return o;
89 }
90
91 public:
92
93 // Indique si le message est valide (i.e: il a été initialisé avec un message valide)
94 bool isValid() const
95 {
96 if (m_mode == Mode::Null)
97 return false;
98 return true;
99 }
100
101 protected:
102
103 void _setType(Mode t)
104 {
105 m_mode = t;
106 }
107
108 private:
109
110 MessageRank m_destination_rank;
111 bool m_is_blocking = true;
112 Mode m_mode = Mode::Null;
113};
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117/*!
118 * \brief Informations pour un message 'gather' pour le type de données \a DataType.
119 *
120 * Il faut appeler une des méthodes setGather() ou setGatherVariable() avant
121 * de pouvoir envoyer le message correspondant. Les instances passées en argument
122 * ces deux méthodes doivent rester vivantes tant que le message n'est pas terminé.
123 */
124template <typename DataType>
127{
128 public:
129
131
132 public:
133
134 //! Message pout tout le monde et bloquant
135 GatherMessageInfo() = default;
136
137 //! Message bloquant ayant pour destination \a rank
138 explicit GatherMessageInfo(MessageRank dest_rank)
139 : BaseClass(dest_rank)
140 {}
141
142 //! Message ayant pour destination \a dest_rank et mode bloquant \a blocking_type
144 : BaseClass(dest_rank, blocking_type)
145 {}
146
147 public:
148
149 /*!
150 * \brief Message équivalent à MPI_Gather ou MPI_Allgather.
151 *
152 * Tous les rangs doivent positionner une valeur valide pour \a send_buf.
153 * Seul le rang destinataire doit positionner \a receive_buf. \a receive_buf
154 * doit pouvoir pour taille send_buf.size() * nb_rank.
155 */
157 {
158 _setType(Mode::Gather);
159 m_receive_buf = receive_buf;
160 m_send_buffer = send_buf;
161 }
162
163 /*!
164 * \brief Message équivalent à MPI_Gatherv ou MPI_Allgatherv.
165 *
166 * Ce prototype est utilisé lorsqu'on ne connait pas ce que va envoyer
167 * chaque rang. Si on connait cette information il est préférable d'utiliser
168 * la méthode setGatherVariable() contenant les déplacements et la taille de message
169 * de chaque participant.
170 *
171 * L'appel à cette méthode provoque un appel à mpGather() pour déterminer ce que
172 * chaque participant doit envoyer. Pour cette raison elle ne peut pas être utilisée
173 * en mode bloquant.
174 *
175 * Seul le rang destinataire doit positionner \a receive_array. Pour les autres il
176 * est possible d'utiliser \a nullptr.
177 */
179 {
180 _setType(Mode::GatherVariableNeedComputeInfo);
181 m_local_reception_buffer = receive_array;
182 m_send_buffer = send_buf;
183 }
184
185 /*!
186 * \brief Message équivalent à MPI_Gatherv ou MPI_Allgatherv.
187 *
188 * Tous les rangs doivent positionner une valeur valide pour \a send_buf,
189 * \a receive_counts et \a receive_displacements.
190 * Seul le rang destinataire doit positionner \a receive_buf. \a receive_buf
191 * doit pouvoir pour taille send_buf.size() * nb_rank.
192 */
194 Span<const Int32> receive_counts, Span<const Int32> receive_displacements)
195 {
196 _setType(Mode::GatherVariable);
197 m_receive_buf = receive_buf;
198 m_send_buffer = send_buf;
199 m_receive_displacements = receive_displacements;
200 m_receive_counts = receive_counts;
201 }
202
203 /*!
204 * \brief Buffer de réception pour le type T_GatherVariableNeedComputeInfo.
205 *
206 * Peut-être nul pour les rangs qui ne sont pas concernés par la réception.
207 */
208 Array<DataType>* localReceptionBuffer() const { return m_local_reception_buffer; }
209
210 //! Buffer d'envoi. Il est utilisé dans tous les modes.
211 Span<const DataType> sendBuffer() const { return m_send_buffer; }
212
213 //! Buffer de réception. Utilisé en mode Gather et GatherVariable par les rangs qui recoivent
214 Span<DataType> receiveBuffer() const { return m_receive_buf; }
215
216 //! Tableau des déplacements. Utilisé en mode GatherVariable.
217 Span<const Int32> receiveDisplacement() { return m_receive_displacements; }
218
219 //! Tableau des tailles. Utilisé en mode GatherVariable.
220 Span<const Int32> receiveCounts() const { return m_receive_counts; }
221
222 private:
223
224 Array<DataType>* m_local_reception_buffer = nullptr;
225 Span<const DataType> m_send_buffer;
226 Span<DataType> m_receive_buf;
227 Span<const Int32> m_receive_displacements;
228 Span<const Int32> m_receive_counts;
229};
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
234} // End namespace Arccore::MessagePassing
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238
239#endif
Classe de base des vecteurs 1D de données.
Informations pour un message 'gather'.
MessageRank destinationRank() const
Rang de la destination du message.
bool isBlocking() const
Indique si le message est bloquant.
GatherMessageInfoBase()=default
Message pout tout le monde et bloquant.
GatherMessageInfoBase(MessageRank dest_rank, eBlockingType blocking_type)
Message ayant pour destination dest_rank et mode bloquant blocking_type.
void setDestinationRank(MessageRank rank)
Positionne le rang de la destination du message.
GatherMessageInfoBase(MessageRank dest_rank)
Message bloquant ayant pour destination rank.
void print(std::ostream &o) const
Affiche le message.
Informations pour un message 'gather' pour le type de données DataType.
void setGatherVariable(Span< const DataType > send_buf, Array< DataType > *receive_array)
Message équivalent à MPI_Gatherv ou MPI_Allgatherv.
void setGather(Span< const DataType > send_buf, Span< DataType > receive_buf)
Message équivalent à MPI_Gather ou MPI_Allgather.
GatherMessageInfo(MessageRank dest_rank, eBlockingType blocking_type)
Message ayant pour destination dest_rank et mode bloquant blocking_type.
Span< const Int32 > receiveDisplacement()
Tableau des déplacements. Utilisé en mode GatherVariable.
GatherMessageInfo()=default
Message pout tout le monde et bloquant.
GatherMessageInfo(MessageRank dest_rank)
Message bloquant ayant pour destination rank.
Array< DataType > * localReceptionBuffer() const
Buffer de réception pour le type T_GatherVariableNeedComputeInfo.
void setGatherVariable(Span< const DataType > send_buf, Span< DataType > receive_buf, Span< const Int32 > receive_counts, Span< const Int32 > receive_displacements)
Message équivalent à MPI_Gatherv ou MPI_Allgatherv.
Span< DataType > receiveBuffer() const
Buffer de réception. Utilisé en mode Gather et GatherVariable par les rangs qui recoivent.
Span< const DataType > sendBuffer() const
Buffer d'envoi. Il est utilisé dans tous les modes.
Span< const Int32 > receiveCounts() const
Tableau des tailles. Utilisé en mode GatherVariable.
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...
eBlockingType
Type indiquant si un message est bloquant ou non.