request_data.h
1 
5 #pragma once
6 
7 #include <memory>
8 #include <optional>
9 #include <string>
10 #include <variant>
11 #include <vector>
12 
13 #include <ucp/api/ucp.h>
14 
15 #include <ucxx/tag_probe.h>
16 #include <ucxx/typedefs.h>
17 
18 namespace ucxx {
19 
20 class Buffer;
21 
22 namespace data {
23 
30 class AmSend {
31  public:
32  const void* const _buffer{nullptr};
33  const size_t _length{0};
34  const std::vector<ucp_dt_iov_t> _iov{};
35  const size_t _count{0};
37  const uint32_t _flags{UCP_AM_SEND_FLAG_REPLY};
38  const ucp_datatype_t _datatype{ucp_dt_make_contig(1)};
39  const ucs_memory_type_t _memoryType{UCS_MEMORY_TYPE_HOST};
42  const std::optional<AmReceiverCallbackInfo> _receiverCallbackInfo{
43  std::nullopt};
44  const std::vector<std::byte> _userHeader{};
45 
55  explicit AmSend(const decltype(_buffer) buffer,
56  const decltype(_length) length,
57  const AmSendParams& params = AmSendParams{});
58 
67  explicit AmSend(decltype(_iov) iov, const AmSendParams& params = AmSendParams{});
68 
69  AmSend() = delete;
70 };
71 
78 class AmReceive {
79  public:
80  std::shared_ptr<::ucxx::Buffer> _buffer{nullptr};
81  std::vector<std::byte> _userHeader{};
82 
91 };
92 
100  public:
101  const bool _force{false};
109  explicit EndpointClose(const decltype(_force) force);
110 
111  EndpointClose() = delete;
112 };
113 
119 class Flush {
120  public:
126  Flush();
127 };
128 
134 class MemPut {
135  public:
136  const void* const _buffer{nullptr};
137  const size_t _length{0};
138  const uint64_t _remoteAddr{0};
139  const ucp_rkey_h _rkey{};
140 
151  explicit MemPut(const decltype(_buffer) buffer,
152  const decltype(_length) length,
153  const decltype(_remoteAddr) remoteAddr,
154  const decltype(_rkey) rkey);
155 
156  MemPut() = delete;
157 };
158 
165 class MemGet {
166  public:
167  void* _buffer{nullptr};
168  const size_t _length{0};
169  const uint64_t _remoteAddr{0};
170  const ucp_rkey_h _rkey{};
171 
182  explicit MemGet(decltype(_buffer) buffer,
183  const decltype(_length) length,
184  const decltype(_remoteAddr) remoteAddr,
185  const decltype(_rkey) rkey);
186 
187  MemGet() = delete;
188 };
189 
196 class StreamSend {
197  public:
198  const void* const _buffer{nullptr};
199  const size_t _length{0};
200 
209  explicit StreamSend(const decltype(_buffer) buffer, const decltype(_length) length);
210 
211  StreamSend() = delete;
212 };
213 
221  public:
222  void* _buffer{nullptr};
223  const size_t _length{0};
224  size_t _lengthReceived{0};
225 
234  explicit StreamReceive(decltype(_buffer) buffer, const decltype(_length) length);
235 
236  StreamReceive() = delete;
237 };
238 
244 class TagSend {
245  public:
246  const void* const _buffer{nullptr};
247  const size_t _length{0};
248  const ::ucxx::Tag _tag{0};
249 
259  explicit TagSend(const decltype(_buffer) buffer,
260  const decltype(_length) length,
261  const decltype(_tag) tag);
262 
263  TagSend() = delete;
264 };
265 
272 class TagReceive {
273  public:
274  void* _buffer{nullptr};
275  const size_t _length{0};
276  const ::ucxx::Tag _tag{0};
277  const ::ucxx::TagMask _tagMask{0};
278 
289  explicit TagReceive(decltype(_buffer) buffer,
290  const decltype(_length) length,
291  const decltype(_tag) tag,
292  const decltype(_tagMask) tagMask);
293 
294  TagReceive() = delete;
295 };
296 
304  public:
305  void* _buffer{nullptr};
306  const std::shared_ptr<TagProbeInfo> _probeInfo{
307  nullptr};
308 
319  explicit TagReceiveWithHandle(decltype(_buffer) buffer, std::shared_ptr<TagProbeInfo> probeInfo);
320 
321  TagReceiveWithHandle() = delete;
322 };
323 
331  public:
332  const std::vector<const void*> _buffer{};
333  const std::vector<size_t> _length{};
334  const std::vector<int> _isCUDA{};
335  const ::ucxx::Tag _tag{0};
336 
347  explicit TagMultiSend(const decltype(_buffer)& buffer,
348  const decltype(_length)& length,
349  const decltype(_isCUDA)& isCUDA,
350  const decltype(_tag) tag);
351 
352  TagMultiSend() = delete;
353 };
354 
362  public:
363  const ::ucxx::Tag _tag{0};
364  const ::ucxx::TagMask _tagMask{0};
365 
374  explicit TagMultiReceive(const decltype(_tag) tag, const decltype(_tagMask) tagMask);
375 
376  TagMultiReceive() = delete;
377 };
378 
379 using RequestData = std::variant<std::monostate,
380  AmSend,
381  AmReceive,
383  Flush,
384  MemPut,
385  MemGet,
386  StreamSend,
388  TagSend,
389  TagReceive,
391  TagMultiSend,
393 
394 template <class... Ts>
395 struct dispatch : Ts... {
396  using Ts::operator()...;
397 };
398 template <class... Ts>
399 dispatch(Ts...) -> dispatch<Ts...>;
400 
401 template <class T>
402 RequestData getRequestData(T t)
403 {
404  return std::visit([](auto arg) -> RequestData { return arg; }, t);
405 }
406 
407 } // namespace data
408 
409 } // namespace ucxx
Data for an Active Message receive.
Definition: request_data.h:78
AmReceive()
Constructor for Active Message-specific receive data.
std::vector< std::byte > _userHeader
User-defined header bytes from the sender.
Definition: request_data.h:81
std::shared_ptr<::ucxx::Buffer > _buffer
The AM received message buffer.
Definition: request_data.h:80
Data for an Active Message send.
Definition: request_data.h:30
const size_t _count
Definition: request_data.h:35
const size_t _length
Message length in bytes (contiguous datatype only).
Definition: request_data.h:33
const ucs_memory_type_t _memoryType
Memory type used on the operation.
Definition: request_data.h:39
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:32
const std::vector< ucp_dt_iov_t > _iov
Segments for IOV datatype.
Definition: request_data.h:34
AmSend(const decltype(_buffer) buffer, const decltype(_length) length, const AmSendParams ¶ms=AmSendParams{})
Constructor for Active Message-specific send data.
const AmSendMemoryTypePolicy _memoryTypePolicy
Receiver allocation policy.
Definition: request_data.h:40
AmSend(decltype(_iov) iov, const AmSendParams ¶ms=AmSendParams{})
Constructor for Active Message-specific send data using IOV datatype.
const std::vector< std::byte > _userHeader
Opaque user-defined header bytes.
Definition: request_data.h:44
const uint32_t _flags
UCP AM send flags.
Definition: request_data.h:37
const std::optional< AmReceiverCallbackInfo > _receiverCallbackInfo
Owner name and unique identifier of the receiver callback.
Definition: request_data.h:42
const ucp_datatype_t _datatype
UCP datatype.
Definition: request_data.h:38
Data for an endpoint close operation.
Definition: request_data.h:99
EndpointClose(const decltype(_force) force)
Constructor for endpoint close-specific data.
const bool _force
Whether to force endpoint closing.
Definition: request_data.h:101
Data for a flush operation.
Definition: request_data.h:119
Flush()
Constructor for flush-specific data.
Data for a memory receive.
Definition: request_data.h:165
void * _buffer
The raw pointer where received data should be stored.
Definition: request_data.h:167
const uint64_t _remoteAddr
Remote memory address to read from.
Definition: request_data.h:169
const size_t _length
The length of the message.
Definition: request_data.h:168
const ucp_rkey_h _rkey
UCX remote key associated with the remote memory address.
Definition: request_data.h:170
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:134
const uint64_t _remoteAddr
Remote memory address to write to.
Definition: request_data.h:138
const size_t _length
The length of the message.
Definition: request_data.h:137
const ucp_rkey_h _rkey
UCX remote key associated with the remote memory address.
Definition: request_data.h:139
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:136
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:220
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:223
void * _buffer
The raw pointer where received data should be stored.
Definition: request_data.h:222
size_t _lengthReceived
The actual received message length.
Definition: request_data.h:224
Data for a Stream send.
Definition: request_data.h:196
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:198
const size_t _length
The length of the message.
Definition: request_data.h:199
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:361
const ::ucxx::Tag _tag
Tag to match.
Definition: request_data.h:363
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:364
Data for a multi-buffer Tag send.
Definition: request_data.h:330
const std::vector< const void * > _buffer
Raw pointers where data to be sent is stored.
Definition: request_data.h:332
const ::ucxx::Tag _tag
Tag to match.
Definition: request_data.h:335
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:334
const std::vector< size_t > _length
Lengths of messages.
Definition: request_data.h:333
Data for a Tag receive using a message handle.
Definition: request_data.h:303
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:305
const std::shared_ptr< TagProbeInfo > _probeInfo
TagProbeInfo containing message length and handle.
Definition: request_data.h:306
Data for a Tag receive.
Definition: request_data.h:272
const ::ucxx::Tag _tag
Tag to match.
Definition: request_data.h:276
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:274
const size_t _length
The length of the message.
Definition: request_data.h:275
const ::ucxx::TagMask _tagMask
Tag mask to use.
Definition: request_data.h:277
Data for a Tag send.
Definition: request_data.h:244
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:248
const size_t _length
The length of the message.
Definition: request_data.h:247
const void *const _buffer
The raw pointer where data to be sent is stored.
Definition: request_data.h:246
Definition: address.h:15
AmSendMemoryTypePolicy
Policy used to allocate receive buffers for Active Messages.
Definition: typedefs.h:182
@ FallbackToHost
If no allocator exists for memory type, fallback to host memory.
Parameters controlling Active Message send behavior.
Definition: typedefs.h:193
Definition: request_data.h:395