Arcane  v3.15.3.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
141
142 //! Message ayant pour destination \a dest_rank et mode bloquant \a blocking_type
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 */
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
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.
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.
Référence à une instance.
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.