Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SharedMemoryMessageQueue.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* SharedMemoryMessageQueue.h (C) 2000-2024 */
9/* */
10/* Implémentation d'une file de messages en mémoire partagée. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_PARALLEL_THREAD_SHAREDMEMORYMESSAGEQUEUE_H
13#define ARCANE_PARALLEL_THREAD_SHAREDMEMORYMESSAGEQUEUE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/TraceAccessor.h"
18#include "arcane/utils/Array.h"
19
20#include "arcane/parallel/thread/ISharedMemoryMessageQueue.h"
21
22#include "arcane/ISerializer.h"
23#include "arcane/Parallel.h"
24
25#include <algorithm>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
47class ARCANE_THREAD_EXPORT SharedMemoryMessageQueue
49{
50 public:
51
52 class SubQueue;
53
54 public:
55
56 SharedMemoryMessageQueue()
57 : m_atomic_request_id(0)
58 {}
59 ~SharedMemoryMessageQueue() override;
60
61 public:
62
63 void init(Int32 nb_thread) override;
64 void waitAll(Int32 caller_rank, ArrayView<Request> requests) override;
65 void waitSome(Int32 rank, ArrayView<Request> requests, ArrayView<bool> requests_done,
66 bool is_non_blocking) override;
67 void setTraceMng(Int32 rank, ITraceMng* tm) override;
68
69 public:
70
71 Request addReceive(const PointToPointMessageInfo& message,ReceiveBufferInfo buf) override;
72 Request addSend(const PointToPointMessageInfo& message,SendBufferInfo buf) override;
73
74 public:
75
76 MessageId probe(const PointToPointMessageInfo& message) override;
77 MessageSourceInfo legacyProbe(const PointToPointMessageInfo& message) override;
78
79 private:
80
81 Int32 m_nb_thread = 0;
82 UniqueArray<SubQueue*> m_sub_queues;
83 std::atomic<Int64> m_atomic_request_id;
84
85 private:
86
87 SubQueue* _getSubQueue(MessageRank rank)
88 {
89 return m_sub_queues[rank.value()];
90 }
91 Int64 _getNextRequestId()
92 {
93 return m_atomic_request_id.fetch_add(1);
94 }
96 SubQueue* _getSourceSubQueue(const MP::PointToPointMessageInfo& message);
97 SubQueue* _getDestinationSubQueue(const MP::PointToPointMessageInfo& message);
98};
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
107class ARCANE_THREAD_EXPORT SharedMemoryMessageRequest
108{
109 public:
110 class SortFunctor
111 {
112 public:
113 explicit SortFunctor(Int32 nb_thread) : m_nb_thread(nb_thread){}
114 bool operator()(SharedMemoryMessageRequest* r1,SharedMemoryMessageRequest* r2) const
115 {
116 if (!r1){
117 if (!r2)
118 return true;
119 else
120 return false;
121 }
122 if (!r2)
123 return true;
124 if (r1->isRecv() && !r2->isRecv())
125 return true;
126 if (!r1->isRecv() && r2->isRecv())
127 return false;
128 Int32 i1 = _getQueueIndex(r1->orig(),r1->dest());
129 Int32 i2 = _getQueueIndex(r2->orig(),r2->dest());
130 if (i1==i2)
131 return r1->id() < r2->id();
132 return i1 < i2;
133 }
134 Int32 _getQueueIndex(MessageRank thread1,MessageRank thread2) const
135 {
136 if (thread1.isNull())
137 ARCANE_FATAL("Null rank for thread1");
138 if (thread2.isNull())
139 ARCANE_FATAL("Null rank for thread2");
140 // TODO: gérer dest()==A_NULL_RANK.
141 return thread1.value() + (thread2.value() * m_nb_thread);
142 }
143 Int32 m_nb_thread;
144 };
145 public:
146 using SubQueue = SharedMemoryMessageQueue::SubQueue;
147 public:
149 SharedMemoryMessageRequest(SubQueue* queue,Int64 request_id,MessageRank orig,
151 : m_queue(queue), m_request_id(request_id), m_is_recv(true)
152 , m_orig(orig), m_dest(dest), m_tag(tag), m_receive_buffer_info(buf)
153 {
154 }
155
156 SharedMemoryMessageRequest(SubQueue* queue,Int64 request_id,MessageRank orig,
158 : m_queue(queue), m_request_id(request_id), m_is_recv(false)
159 , m_orig(orig), m_dest(dest), m_tag(tag), m_send_buffer_info(buf)
160 {
161 }
162 public:
163
164 MessageRank orig() const { return m_orig; }
165 MessageRank dest() const { return m_dest; }
166 MessageTag tag() const { return m_tag; }
167 bool isRecv() const { return m_is_recv; }
168 bool isDone() const { return m_is_done; }
169 void setDone(bool v) { m_is_done = v; }
170 SendBufferInfo sendBufferInfo() { return m_send_buffer_info; }
171 ReceiveBufferInfo receiveBufferInfo() { return m_receive_buffer_info; }
172 SharedMemoryMessageQueue::SubQueue* queue() { return m_queue; }
173 const String& queueName() const;
174 void copyFromSender(SharedMemoryMessageRequest* sender);
175 Int64 id() const { return m_request_id; }
176 void destroy();
177 ISerializer* recvSerializer() { return m_receive_buffer_info.serializer(); }
178 const ISerializer* sendSerializer() { return m_send_buffer_info.serializer(); }
179 // Dans le cas ou dest()==A_NULL_RANK, positionne une fois le message recu le rang d'origine.
180 void setSource(MessageRank s)
181 {
182 if (isRecv())
183 m_dest = s;
184 }
186 SharedMemoryMessageRequest* matchingSendRequest() { return m_matching_send_request; }
187 void setMatchingSendRequest(SharedMemoryMessageRequest* r) { m_matching_send_request = r; }
188 friend std::ostream& operator<<(std::ostream& o, const SharedMemoryMessageRequest& v);
189
190 private:
191
192 SubQueue* m_queue = nullptr;
193 Int64 m_request_id = -1;
194 bool m_is_recv = false;
195 MessageRank m_orig;
196 MessageRank m_dest;
197 MessageTag m_tag;
198 std::atomic<bool> m_is_done = false;
199 SharedMemoryMessageRequest* m_matching_send_request = nullptr;
200 bool m_is_destroyed = false;
201 SendBufferInfo m_send_buffer_info;
202 ReceiveBufferInfo m_receive_buffer_info;
203};
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
208} // End namespace Arcane::MessagePassing
209
210/*---------------------------------------------------------------------------*/
211/*---------------------------------------------------------------------------*/
212
213#endif
214
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue modifiable d'un tableau d'un type T.
Interface du gestionnaire de traces.
Interface d'une file de messages avec les threads.
Int32 value() const
Valeur du rang.
Definition MessageRank.h:72
bool isNull() const
Vrai si rang non initialisé correspondant au rang par défaut.
Definition MessageRank.h:78
Informations pour envoyer/recevoir un message point à point.
Informations des buffers de réception.
Requête d'un message.
Definition Request.h:77
File pour les messages d'un rang en mémoire partagée.
File de messages entre les rangs partagés par un SharedMemoryParallelMng.
SharedMemoryMessageRequest(SubQueue *queue, Int64 request_id, MessageRank orig, MessageRank dest, MessageTag tag, ReceiveBufferInfo buf)
Créé une requête d'envoie.
SharedMemoryMessageRequest * matchingSendRequest()
Requête associée dans le cas où c'est un receive issu d'un probe.
SharedMemoryMessageRequest(SubQueue *queue, Int64 request_id, MessageRank orig, MessageRank dest, MessageTag tag, SendBufferInfo buf)
Créé une requête de réception.
Gestionnaire du parallélisme utilisant les threads.
Vecteur 1D de données avec sémantique par valeur (style STL).
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.