Arcane  4.2.3.0
Developer documentation
Loading...
Searching...
No Matches
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/* Implementation of a message queue in shared memory. */
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/core/ISerializer.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/*---------------------------------------------------------------------------*/
102
108class ARCANE_THREAD_EXPORT SharedMemoryMessageRequest
109{
110 public:
111
112 class SortFunctor
113 {
114 public:
115
116 explicit SortFunctor(Int32 nb_thread)
117 : m_nb_thread(nb_thread)
118 {}
119 bool operator()(SharedMemoryMessageRequest* r1, SharedMemoryMessageRequest* r2) const
120 {
121 if (!r1) {
122 if (!r2)
123 return true;
124 else
125 return false;
126 }
127 if (!r2)
128 return true;
129 if (r1->isRecv() && !r2->isRecv())
130 return true;
131 if (!r1->isRecv() && r2->isRecv())
132 return false;
133 Int32 i1 = _getQueueIndex(r1->orig(), r1->dest());
134 Int32 i2 = _getQueueIndex(r2->orig(), r2->dest());
135 if (i1 == i2)
136 return r1->id() < r2->id();
137 return i1 < i2;
138 }
139 Int32 _getQueueIndex(MessageRank thread1, MessageRank thread2) const
140 {
141 if (thread1.isNull())
142 ARCANE_FATAL("Null rank for thread1");
143 if (thread2.isNull())
144 ARCANE_FATAL("Null rank for thread2");
145 // TODO: handle dest()==A_NULL_RANK.
146 return thread1.value() + (thread2.value() * m_nb_thread);
147 }
148 Int32 m_nb_thread;
149 };
150
151 public:
152
153 using SubQueue = SharedMemoryMessageQueue::SubQueue;
154
155 public:
156
158 SharedMemoryMessageRequest(SubQueue* queue, Int64 request_id, MessageRank orig,
160 : m_queue(queue)
161 , m_request_id(request_id)
162 , m_is_recv(true)
163 , m_orig(orig)
164 , m_dest(dest)
165 , m_tag(tag)
166 , m_receive_buffer_info(buf)
167 {
168 }
169
170 SharedMemoryMessageRequest(SubQueue* queue, Int64 request_id, MessageRank orig,
172 : m_queue(queue)
173 , m_request_id(request_id)
174 , m_is_recv(false)
175 , m_orig(orig)
176 , m_dest(dest)
177 , m_tag(tag)
178 , m_send_buffer_info(buf)
179 {
180 }
181
182 public:
183
184 MessageRank orig() const { return m_orig; }
185 MessageRank dest() const { return m_dest; }
186 MessageTag tag() const { return m_tag; }
187 bool isRecv() const { return m_is_recv; }
188 bool isDone() const { return m_is_done; }
189 void setDone(bool v) { m_is_done = v; }
190 SendBufferInfo sendBufferInfo() { return m_send_buffer_info; }
191 ReceiveBufferInfo receiveBufferInfo() { return m_receive_buffer_info; }
192 SharedMemoryMessageQueue::SubQueue* queue() { return m_queue; }
193 const String& queueName() const;
194 void copyFromSender(SharedMemoryMessageRequest* sender);
195 Int64 id() const { return m_request_id; }
196 void destroy();
197 ISerializer* recvSerializer() { return m_receive_buffer_info.serializer(); }
198 const ISerializer* sendSerializer() { return m_send_buffer_info.serializer(); }
199 // In the case where dest()==A_NULL_RANK, sets the original rank once the message is received.
200 void setSource(MessageRank s)
201 {
202 if (isRecv())
203 m_dest = s;
204 }
206 SharedMemoryMessageRequest* matchingSendRequest() { return m_matching_send_request; }
207 void setMatchingSendRequest(SharedMemoryMessageRequest* r) { m_matching_send_request = r; }
208 friend std::ostream& operator<<(std::ostream& o, const SharedMemoryMessageRequest& v);
209
210 private:
211
212 SubQueue* m_queue = nullptr;
213 Int64 m_request_id = -1;
214 bool m_is_recv = false;
215 MessageRank m_orig;
216 MessageRank m_dest;
217 MessageTag m_tag;
218 std::atomic<bool> m_is_done = false;
219 SharedMemoryMessageRequest* m_matching_send_request = nullptr;
220 bool m_is_destroyed = false;
221 SendBufferInfo m_send_buffer_info;
222 ReceiveBufferInfo m_receive_buffer_info;
223};
224
225/*---------------------------------------------------------------------------*/
226/*---------------------------------------------------------------------------*/
227
228} // End namespace Arcane::MessagePassing
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
233#endif
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
File containing declarations concerning the message passing model.
Modifiable view of an array of type T.
Int32 value() const
Rank value.
Definition MessageRank.h:76
bool isNull() const
True if the rank is uninitialized, corresponding to the default rank.
Definition MessageRank.h:82
Information for sending/receiving a point-to-point message.
Message queue between ranks shared by a SharedMemoryParallelMng.
SharedMemoryMessageRequest(SubQueue *queue, Int64 request_id, MessageRank orig, MessageRank dest, MessageTag tag, ReceiveBufferInfo buf)
Create a send request.
SharedMemoryMessageRequest * matchingSendRequest()
Associated request in the case it is a receive resulting from a probe.
SharedMemoryMessageRequest(SubQueue *queue, Int64 request_id, MessageRank orig, MessageRank dest, MessageTag tag, SendBufferInfo buf)
Create a receive request.
1D data vector with value semantics (STL style).
Declarations of types and methods used by message exchange mechanisms.
std::int64_t Int64
Signed integer type of 64 bits.
std::int32_t Int32
Signed integer type of 32 bits.