Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
HybridMessageQueue.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* HybridMessageQueue.h (C) 2000-2024 */
9/* */
10/* File de messages pour une implémentation hybride MPI/Mémoire partagée. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_PARALLEL_THREAD_HYBRIDMESSAGEQUEUE_H
13#define ARCANE_PARALLEL_THREAD_HYBRIDMESSAGEQUEUE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/CheckedConvert.h"
18#include "arcane/utils/TraceAccessor.h"
19#include "arcane/parallel/thread/ISharedMemoryMessageQueue.h"
20#include "arcane/ArcaneTypes.h"
21#include "arcane/Parallel.h"
22#include "arcane/parallel/mpi/ArcaneMpi.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29class MpiParallelMng;
30}
31
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
42{
43 public:
44
45 static FullRankInfo compute(MP::MessageRank rank,Int32 local_nb_rank)
46 {
47 Int32 r = rank.value();
49 fri.m_local_rank.setValue(r % local_nb_rank);
50 fri.m_global_rank.setValue(r);
51 fri.m_mpi_rank.setValue(r / local_nb_rank);
52 return fri;
53 }
54 friend std::ostream& operator<<(std::ostream& o,const FullRankInfo& fri);
55
56 public:
57
60 Int32 localRankValue() const { return m_local_rank.value(); }
63 Int32 globalRankValue() const { return m_global_rank.value(); }
66 Int32 mpiRankValue() const { return m_mpi_rank.value(); }
67
68 private:
69
76};
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
84{
85 public:
86
88 : m_source(s), m_destination(d){}
89
90 public:
91
92 FullRankInfo source() const { return m_source; }
93 FullRankInfo destination() const { return m_destination; }
94 bool isSameMpiRank() const
95 {
96 return m_source.mpiRank()==m_destination.mpiRank();
97 }
98
99 private:
100
101 FullRankInfo m_source;
102 FullRankInfo m_destination;
103};
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
122{
123 public:
125 // NOTE: en théorie on peut calculer dynamiquement cette valeur en prenant
126 // en compte le max valide pour MPI (via MPI_Comm_get_attribute(MPI_TAG_UB))
127 // et le nombre de threads locaux maximun. Cependant, cela rendrait
128 // le code trop dépendant de l'implémentation.
129 // A noter que dans la norme MPI, il est possible de n'avoir que
130 // 2^15 (32767) valeurs pour les tag.
131 static constexpr Int32 MAX_USER_TAG_BIT = 14;
132 static constexpr Int32 MAX_USER_TAG = 1 << MAX_USER_TAG_BIT;
133 public:
135 RankTagBuilder(Int32 nb_rank) : m_nb_rank(nb_rank) {}
136 Int32 nbLocalRank() const { return m_nb_rank; }
137 FullRankInfo rank(MessageRank user_rank) const
138 {
139 return FullRankInfo::compute(user_rank,m_nb_rank);
140 }
141 SourceDestinationFullRankInfo rank(MessageRank rank1,MessageRank rank2) const
142 {
143 auto x1 = FullRankInfo::compute(rank1,m_nb_rank);
144 auto x2 = FullRankInfo::compute(rank2,m_nb_rank);
145 return SourceDestinationFullRankInfo(x1,x2);
146 }
147 MessageTag tagForSend(MessageTag user_tag,FullRankInfo orig,FullRankInfo dest) const
148 {
149 return _tag(user_tag,dest.localRank(),orig.localRank());
150 }
151 MessageTag tagForSend(MessageTag user_tag,SourceDestinationFullRankInfo fri) const
152 {
153 return tagForSend(user_tag,fri.source(),fri.destination());
154 }
155 MessageTag tagForReceive(MessageTag user_tag,FullRankInfo orig,FullRankInfo dest) const
156 {
157 return _tag(user_tag,orig.localRank(),dest.localRank());
158 }
159 MessageTag tagForReceive(MessageTag user_tag,MessageRank orig_local,MessageRank dest_local) const
160 {
161 return _tag(user_tag,orig_local,dest_local);
162 }
163 MessageTag tagForReceive(MessageTag user_tag,SourceDestinationFullRankInfo fri) const
164 {
165 return tagForReceive(user_tag,fri.source(),fri.destination());
166 }
169 {
170 Int32 t = internal_tag.value() >> MAX_USER_TAG_BIT;
171 return t % m_nb_rank;
172 }
173 private:
175 {
176 Int64 utag = user_tag.value();
177 if (utag>MAX_USER_TAG)
178 ARCANE_FATAL("User tag is too big v={0} max={1}",utag,MAX_USER_TAG);
179 Int32 d = dest_local.value();
180 Int32 o = orig_local.value();
181 Int64 new_tag = (o*m_nb_rank + d) << MAX_USER_TAG_BIT;
182 new_tag += utag;
184 }
185 private:
186 Int32 m_nb_rank;
187};
188
189/*---------------------------------------------------------------------------*/
190/*---------------------------------------------------------------------------*/
196: public TraceAccessor
197{
198 public:
199
201 Int32 local_nb_rank);
202
203 public:
204
205 void waitAll(ArrayView<Request> requests);
206 void waitSome(Int32 rank,ArrayView<Request> requests,
208 public:
209
210 Request addReceive(const PointToPointMessageInfo& message,ReceiveBufferInfo buf);
211 Request addSend(const PointToPointMessageInfo& message,SendBufferInfo buf);
212 MessageId probe(const MP::PointToPointMessageInfo& message);
213 MP::MessageSourceInfo legacyProbe(const MP::PointToPointMessageInfo& message);
214 const RankTagBuilder& rankTagBuilder() const { return m_rank_tag_builder; }
215
216 private:
217
218 ISharedMemoryMessageQueue* m_thread_queue;
219 MpiParallelMng* m_mpi_parallel_mng;
220 MpiAdapter* m_mpi_adapter;
221 Int32 m_local_nb_rank;
222 RankTagBuilder m_rank_tag_builder;
223 Int32 m_debug_level = 0;
224 bool m_is_allow_null_rank_for_any_source = true;
225
226 private:
227
228 Request _addReceiveRankTag(const PointToPointMessageInfo& message,ReceiveBufferInfo buf_info);
229 Request _addReceiveMessageId(const PointToPointMessageInfo& message,ReceiveBufferInfo buf_info);
230 void _checkValidRank(MessageRank rank);
231 void _checkValidSource(const PointToPointMessageInfo& message);
232 SourceDestinationFullRankInfo _getFullRankInfo(const PointToPointMessageInfo& message)
233 {
234 return m_rank_tag_builder.rank(message.emiterRank(),message.destinationRank());
235 }
237 _buildSharedMemoryMessage(const PointToPointMessageInfo& message,
240 _buildMPIMessage(const PointToPointMessageInfo& message,
242 Integer _testOrWaitSome(Int32 rank,ArrayView<Request> requests,
244 MessageId _probe(const MP::PointToPointMessageInfo& message, bool use_message_id);
245};
246
247/*---------------------------------------------------------------------------*/
248/*---------------------------------------------------------------------------*/
249
250} // End namespace Arcane::MessagePassing
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254
255#endif
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Informations de correspondances entre les différents rangs d'un communicateur.
MP::MessageRank m_global_rank
Rang global dans le communicateur.
MP::MessageRank globalRank() const
Rang global dans le communicateur.
MP::MessageRank mpiRank() const
Rang MPI du.
MP::MessageRank localRank() const
Rang local dans les threads.
MP::MessageRank m_mpi_rank
Rang MPI associé
MP::MessageRank m_local_rank
Rang local dans les threads.
Interface d'une file de messages avec les threads.
Interface d'une file de messages avec les threads.
Classe pour calculer à partir d'un tag utilisateur un tag contenant les informations de l'envoyeur et...
static constexpr Int32 MAX_USER_TAG_BIT
On autorise 2^14 tags soit 16384.
Int32 getReceiveRankFromTag(MessageTag internal_tag) const
Récupère le rang à partir du tag. Il s'agit de l'opération inverse de _tag()
RankTagBuilder(Int32 nb_rank)
Construit une instance pour nb_rank locaux.
Informations des buffers de réception.
Encapsule les informations source/destination.
Gestionnaire du parallélisme utilisant MPI.
Int32 value() const
Valeur du rang.
Definition MessageRank.h:72
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
MessageRank emiterRank() const
Rang de l'émetteur du message.
MessageRank destinationRank() const
Rang de la destination du message.
Requête d'un message.
Definition Request.h:77
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
Definition Parallel.h:94
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-