request_data.h
1 
5 #pragma once
6 
7 #include <memory>
8 #include <optional>
9 #include <variant>
10 #include <vector>
11 
12 #include <ucp/api/ucp.h>
13 
14 #include <ucxx/tag_probe.h>
15 #include <ucxx/typedefs.h>
16 
17 namespace ucxx {
18 
19 class Buffer;
20 
21 namespace data {
22 
29 class AmSend {
30  public:
31  const void* const _buffer{nullptr};
32  const size_t _length{0};
33  const ucs_memory_type_t _memoryType{UCS_MEMORY_TYPE_HOST};
34  const std::optional<AmReceiverCallbackInfo> _receiverCallbackInfo{
35  std::nullopt};
36 
48  explicit AmSend(const decltype(_buffer) buffer,
49  const decltype(_length) length,
50  const decltype(_memoryType) memoryType = UCS_MEMORY_TYPE_HOST,
51  const decltype(_receiverCallbackInfo) receiverCallbackInfo = std::nullopt);
52 
53  AmSend() = delete;
54 };
55 
62 class AmReceive {
63  public:
64  std::shared_ptr<::ucxx::Buffer> _buffer{nullptr};
65 
74 };
75 
83  public:
84  const bool _force{false};
92  explicit EndpointClose(const decltype(_force) force);
93 
94  EndpointClose() = delete;
95 };
96 
102 class Flush {
103  public:
109  Flush();
110 };
111 
117 class MemPut {
118  public:
119  const void* const _buffer{nullptr};
120  const size_t _length{0};
121  const uint64_t _remoteAddr{0};
122  const ucp_rkey_h _rkey{};
123 
134  explicit MemPut(const decltype(_buffer) buffer,
135  const decltype(_length) length,
136  const decltype(_remoteAddr) remoteAddr,
137  const decltype(_rkey) rkey);
138 
139  MemPut() = delete;
140 };
141 
148 class MemGet {
149  public:
150  void* _buffer{nullptr};
151  const size_t _length{0};
152  const uint64_t _remoteAddr{0};
153  const ucp_rkey_h _rkey{};
154 
165  explicit MemGet(decltype(_buffer) buffer,
166  const decltype(_length) length,
167  const decltype(_remoteAddr) remoteAddr,
168  const decltype(_rkey) rkey);
169 
170  MemGet() = delete;
171 };
172 
179 class StreamSend {
180  public:
181  const void* const _buffer{nullptr};
182  const size_t _length{0};
183 
192  explicit StreamSend(const decltype(_buffer) buffer, const decltype(_length) length);
193 
194  StreamSend() = delete;
195 };
196 
204  public:
205  void* _buffer{nullptr};
206  const size_t _length{0};
207  size_t _lengthReceived{0};
208 
217  explicit StreamReceive(decltype(_buffer) buffer, const decltype(_length) length);
218 
219  StreamReceive() = delete;
220 };
221 
227 class TagSend {
228  public:
229  const void* const _buffer{nullptr};
230  const size_t _length{0};
231  const ::ucxx::Tag _tag{0};
232 
242  explicit TagSend(const decltype(_buffer) buffer,
243  const decltype(_length) length,
244  const decltype(_tag) tag);
245 
246  TagSend() = delete;
247 };
248 
255 class TagReceive {
256  public:
257  void* _buffer{nullptr};
258  const size_t _length{0};
259  const ::ucxx::Tag _tag{0};
260  const ::ucxx::TagMask _tagMask{0};
261 
272  explicit TagReceive(decltype(_buffer) buffer,
273  const decltype(_length) length,
274  const decltype(_tag) tag,
275  const decltype(_tagMask) tagMask);
276 
277  TagReceive() = delete;
278 };
279 
287  public:
288  void* _buffer{nullptr};
289  const std::shared_ptr<TagProbeInfo> _probeInfo{
290  nullptr};
291 
302  explicit TagReceiveWithHandle(decltype(_buffer) buffer, std::shared_ptr<TagProbeInfo> probeInfo);
303 
304  TagReceiveWithHandle() = delete;
305 };
306 
314  public:
315  const std::vector<const void*> _buffer{};
316  const std::vector<size_t> _length{};
317  const std::vector<int> _isCUDA{};
318  const ::ucxx::Tag _tag{0};
319 
330  explicit TagMultiSend(const decltype(_buffer)& buffer,
331  const decltype(_length)& length,
332  const decltype(_isCUDA)& isCUDA,
333  const decltype(_tag) tag);
334 
335  TagMultiSend() = delete;
336 };
337 
345  public:
346  const ::ucxx::Tag _tag{0};
347  const ::ucxx::TagMask _tagMask{0};
348 
357  explicit TagMultiReceive(const decltype(_tag) tag, const decltype(_tagMask) tagMask);
358 
359  TagMultiReceive() = delete;
360 };
361 
362 using RequestData = std::variant<std::monostate,
363  AmSend,
364  AmReceive,
366  Flush,
367  MemPut,
368  MemGet,
369  StreamSend,
371  TagSend,
372  TagReceive,
374  TagMultiSend,
376 
377 template <class... Ts>
378 struct dispatch : Ts... {
379  using Ts::operator()...;
380 };
381 template <class... Ts>
382 dispatch(Ts...) -> dispatch<Ts...>;
383 
384 template <class T>
385 RequestData getRequestData(T t)
386 {
387  return std::visit([](auto arg) -> RequestData { return arg; }, t);
388 }
389 
390 } // namespace data
391 
392 } // namespace ucxx
Data for an Active Message receive.
Definition: request_data.h:62
AmReceive()
Constructor for Active Message-specific receive data.
std::shared_ptr<::ucxx::Buffer > _buffer
The AM received message buffer.
Definition: request_data.h:64
Data for an Active Message send.
Definition: request_data.h:29
const size_t _length
The length of the message.
Definition: request_data.h:32
const ucs_memory_type_t _memoryType
Memory type used on the operation.
Definition: request_data.h:33
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:31
AmSend(const decltype(_buffer) buffer, const decltype(_length) length, const decltype(_memoryType) memoryType=UCS_MEMORY_TYPE_HOST, const decltype(_receiverCallbackInfo) receiverCallbackInfo=std::nullopt)
Constructor for Active Message-specific send data.
const std::optional< AmReceiverCallbackInfo > _receiverCallbackInfo
Owner name and unique identifier of the receiver callback.
Definition: request_data.h:34
Data for an endpoint close operation.
Definition: request_data.h:82
EndpointClose(const decltype(_force) force)
Constructor for endpoint close-specific data.
const bool _force
Whether to force endpoint closing.
Definition: request_data.h:84
Data for a flush operation.
Definition: request_data.h:102
Flush()
Constructor for flush-specific data.
Data for a memory receive.
Definition: request_data.h:148
void * _buffer
The raw pointer where received data should be stored.
Definition: request_data.h:150
const uint64_t _remoteAddr
Remote memory address to read from.
Definition: request_data.h:152
const size_t _length
The length of the message.
Definition: request_data.h:151
const ucp_rkey_h _rkey
UCX remote key associated with the remote memory address.
Definition: request_data.h:153
MemGet(decltype(_buffer) buffer, const decltype(_length) length, const decltype(_remoteAddr) remoteAddr, const decltype(_rkey) rkey)
Constructor for memory-specific data.
Data for a memory send.
Definition: request_data.h:117
const uint64_t _remoteAddr
Remote memory address to write to.
Definition: request_data.h:121
const size_t _length
The length of the message.
Definition: request_data.h:120
const ucp_rkey_h _rkey
UCX remote key associated with the remote memory address.
Definition: request_data.h:122
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:119
MemPut(const decltype(_buffer) buffer, const decltype(_length) length, const decltype(_remoteAddr) remoteAddr, const decltype(_rkey) rkey)
Constructor for memory-specific data.
Data for an Stream receive.
Definition: request_data.h:203
StreamReceive(decltype(_buffer) buffer, const decltype(_length) length)
Constructor for stream-specific data.
const size_t _length
The expected messaged length.
Definition: request_data.h:206
void * _buffer
The raw pointer where received data should be stored.
Definition: request_data.h:205
size_t _lengthReceived
The actual received message length.
Definition: request_data.h:207
Data for a Stream send.
Definition: request_data.h:179
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:181
const size_t _length
The length of the message.
Definition: request_data.h:182
StreamSend(const decltype(_buffer) buffer, const decltype(_length) length)
Constructor for stream-specific data.
Data for a multi-buffer Tag receive.
Definition: request_data.h:344
const ::ucxx::Tag _tag
Tag to match.
Definition: request_data.h:346
TagMultiReceive(const decltype(_tag) tag, const decltype(_tagMask) tagMask)
Constructor for receive multi-buffer tag-specific data.
const ::ucxx::TagMask _tagMask
Tag mask to use.
Definition: request_data.h:347
Data for a multi-buffer Tag send.
Definition: request_data.h:313
const std::vector< const void * > _buffer
Raw pointers where data to be sent is stored.
Definition: request_data.h:315
const ::ucxx::Tag _tag
Tag to match.
Definition: request_data.h:318
TagMultiSend(const decltype(_buffer)&buffer, const decltype(_length)&length, const decltype(_isCUDA)&isCUDA, const decltype(_tag) tag)
Constructor for send multi-buffer tag-specific data.
const std::vector< int > _isCUDA
Flags indicating whether the buffer is CUDA or not.
Definition: request_data.h:317
const std::vector< size_t > _length
Lengths of messages.
Definition: request_data.h:316
Data for a Tag receive using a message handle.
Definition: request_data.h:286
TagReceiveWithHandle(decltype(_buffer) buffer, std::shared_ptr< TagProbeInfo > probeInfo)
Constructor for tag receive with handle-specific data.
void * _buffer
The raw pointer where received data should be stored.
Definition: request_data.h:288
const std::shared_ptr< TagProbeInfo > _probeInfo
TagProbeInfo containing message length and handle.
Definition: request_data.h:289
Data for a Tag receive.
Definition: request_data.h:255
const ::ucxx::Tag _tag
Tag to match.
Definition: request_data.h:259
TagReceive(decltype(_buffer) buffer, const decltype(_length) length, const decltype(_tag) tag, const decltype(_tagMask) tagMask)
Constructor for tag-specific data.
void * _buffer
The raw pointer where received data should be stored.
Definition: request_data.h:257
const size_t _length
The length of the message.
Definition: request_data.h:258
const ::ucxx::TagMask _tagMask
Tag mask to use.
Definition: request_data.h:260
Data for a Tag send.
Definition: request_data.h:227
TagSend(const decltype(_buffer) buffer, const decltype(_length) length, const decltype(_tag) tag)
Constructor for tag-specific data.
const ::ucxx::Tag _tag
Tag to match.
Definition: request_data.h:231
const size_t _length
The length of the message.
Definition: request_data.h:230
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:229
Definition: address.h:15
Definition: request_data.h:378