39#include <ucp/api/ucp.h>
43#include <unordered_map>
44#include <unordered_set>
93 std::vector<UCPWorker *> workers;
99 Mutex poll_notify_mutex;
107 friend class ::Realm::UCPModule;
135 bool bind_cudamem{
true};
136 std::string gpu_nics;
137 std::string zcopy_thresh_dev;
147 void attach(std::vector<NetworkSegment *> &segments);
148 void detach(std::vector<NetworkSegment *> &segments);
152 void gather(
NodeID root,
const void *val_in,
void *vals_out,
size_t bytes);
153 void allgather(
const char *val_in,
size_t bytes, std::vector<char> &vals_out,
155 void allgatherv(
const char *val_in,
size_t bytes, std::vector<char> &vals_out,
156 std::vector<size_t> &lengths);
162 bool with_congestion,
size_t header_size);
165 const UCPRDMAInfo *rdma_info, ucp_ep_h *ep)
const;
189 struct AmHandlersArgs {
195 std::vector<UCPWorker *> tx_workers;
196 std::vector<UCPWorker *> rx_workers;
199#ifdef REALM_UCX_DYNAMIC_LOAD
200 bool resolve_ucp_api_fnptrs();
204 bool init_ucp_contexts(
const std::unordered_set<Realm::Cuda::GPU *> &gpus);
206 bool init_ucp_contexts();
209 bool create_workers();
210 void destroy_workers();
211 size_t get_num_workers();
212 bool set_am_handlers();
213 bool create_eps(uint8_t priority);
215 bool create_pollers();
216 const UCPContext *get_context_host()
const;
217#if defined(REALM_USE_CUDA)
218 const UCPContext *get_context_device(
int dev_index)
const;
220 const std::vector<UCPWorker *> &get_tx_workers(
const UCPContext *context)
const;
221 const std::vector<UCPWorker *> &get_rx_workers(
const UCPContext *context)
const;
222 UCPWorker *get_rx_worker(
const UCPContext *context, uint8_t priority)
const;
224 bool add_rdma_info(
NetworkSegment *segment,
const UCPContext *context,
226 void add_rdma_info_odr(
NetworkSegment *segment,
const UCPContext *context);
227 bool am_msg_recv_data_ready(UCPInternal *internal, UCPWorker *worker,
228 const UCPMsgHdr *ucp_msg_hdr,
size_t header_size,
229 void *payload,
size_t payload_size,
int payload_mode);
230 static ucs_status_t am_remote_comp_handler(
void *arg,
const void *header,
231 size_t header_size,
void *data,
233 const ucp_am_recv_param_t *param);
234 static void am_send_reply_comp_handler(
void *request, ucs_status_t status,
236 static void am_realm_comp_handler(
NodeID sender,
239 static void am_rndv_recv_data_handler(
void *request, ucs_status_t status,
240 size_t length,
void *user_data);
241 static ucs_status_t am_msg_recv_handler(
void *arg,
const void *header,
242 size_t header_size,
void *payload,
244 const ucp_am_recv_param_t *param);
245 static ucs_status_t am_rdma_msg_recv_handler(
void *arg,
const void *header,
246 size_t header_size,
void *payload,
248 const ucp_am_recv_param_t *param);
250 bool compute_shared_ranks();
251 using WorkersMap = std::unordered_map<const UCPContext *, Workers>;
252 using AttachMap = std::unordered_map<const UCPContext *, std::vector<ucp_mem_h>>;
254#ifdef REALM_UCX_DYNAMIC_LOAD
255 void *libucp{
nullptr};
257 bool initialized_boot{
false};
258 bool initialized_ucp{
false};
261 std::unique_ptr<ucc::UCCComm> ucc_comm{
nullptr};
262 int num_shared_ranks{0};
263 std::vector<NodeID> shared_ranks;
264 std::list<UCPContext> ucp_contexts;
266 std::unordered_map<int, UCPContext *> dev_ctx_map;
269 std::list<UCPPoller> pollers;
270 std::list<AmHandlersArgs> am_handlers_args;
271 AttachMap attach_mem_hs;
272 atomic<uint64_t> total_msg_sent;
273 atomic<uint64_t> total_msg_received;
274 atomic<uint64_t> total_rcomp_sent;
275 atomic<uint64_t> total_rcomp_received;
276 atomic<uint64_t> outstanding_reqs;
282 atomic<uint64_t> total_reqs_acquired;
284 SpinLock rcba_mp_spinlock;
286 size_t zcopy_thresh_host;
292 size_t header_size,
size_t max_payload_size,
293 const void *src_payload_addr,
size_t src_payload_lines,
294 size_t src_payload_line_stride,
const NetworkSegment *_src_segment,
295 const RemoteAddress *_dest_payload_addr,
size_t storage_size);
298 size_t header_size,
size_t max_payload_size,
299 const void *src_payload_addr,
size_t src_payload_lines,
300 size_t src_payload_line_stride,
size_t storage_size);
307 virtual void commit(
size_t act_payload_size);
311 bool set_inline_payload_base();
312 bool commit_with_rma(ucp_ep_h ep);
313 bool commit_unicast(
size_t act_payload_size);
314 bool commit_multicast(
size_t act_payload_size);
315 bool send_fast_path(ucp_ep_h ep,
size_t act_payload_size);
316 bool send_slow_path(ucp_ep_h ep,
size_t act_payload_size, uint32_t flags);
317 Request *make_request(
size_t act_payload_size);
319 static bool send_request(
Request *req,
unsigned am_id);
321 static void am_local_comp_handler(
void *request, ucs_status_t status,
323 static void am_put_comp_handler(
void *request, ucs_status_t status,
325 static void am_put_flush_comp_handler(
void *request, ucs_status_t status,
332 const void *src_payload_addr;
333 size_t src_payload_lines;
334 size_t src_payload_line_stride;
337 UCPRDMAInfo *dest_payload_rdma_info{
nullptr};
338 CompList *local_comp{
nullptr};
339 RemoteComp *remote_comp{
nullptr};
340 bool is_multicast{
false};
341 ucs_memory_type_t memtype;
343 UCPMsgHdr ucp_msg_hdr;
356 UCPRDMAInfo *rdma_info;
357 size_t rdma_info_size;
Definition activemsg.h:221
Definition bytearray.h:53
Definition ib_memory.h:30
uintptr_t CallbackData
Definition activemsg.h:367
Memory me
Definition mem_impl.h:194
size_t size
Definition mem_impl.h:195
MemoryKind kind
Definition mem_impl.h:196
Kind
Definition memory.h:59
Definition mem_impl.h:549
Definition runtime_impl.h:267
Definition ucp_module.h:31
Definition ucp_context.h:152
Definition ucp_internal.h:375
UCPIBMemory(RuntimeImpl *_runtime_impl, Memory me, size_t size, Memory::Kind kind, const ByteArray &rdma_info_ba, UCPInternal *internal)
virtual bool get_remote_addr(off_t offset, RemoteAddress &remote_addr)
Definition ucp_internal.h:104
void allgather(const char *val_in, size_t bytes, std::vector< char > &vals_out, size_t *lengths)
void allgatherv(const char *val_in, size_t bytes, std::vector< char > &vals_out, std::vector< size_t > &lengths)
void detach(std::vector< NetworkSegment * > &segments)
UCPInternal(Realm::UCPModule *_module, Realm::RuntimeImpl *_runtime)
void notify_msg_sent(uint64_t count)
Request * request_get(UCPWorker *worker)
UCPModule *RuntimeImpl * runtime
Definition ucp_internal.h:186
void broadcast(NodeID root, const void *val_in, void *val_out, size_t bytes)
UCPWorker * get_tx_worker(const UCPContext *context, uint8_t priority) const
void get_shared_peers(Realm::NodeSet &shared_peers)
size_t num_eps(const UCPContext &context) const
void * hbuf_get(UCPWorker *worker, size_t size)
void * pbuf_get(UCPWorker *worker, size_t size)
void quiescence_allreduce_sum(const uint64_t *local_counts, uint64_t *total_counts, size_t count)
void hbuf_release(UCPWorker *worker, void *buf)
const UCPContext * get_context(const NetworkSegment *segment) const
void pbuf_release(UCPWorker *worker, void *buf)
size_t recommended_max_payload(const void *data, const NetworkSegment *src_segment, const RemoteAddress *dest_payload_addr, bool with_congestion, size_t header_size)
void request_release(Request *req)
bool init(const Config &config)
void sample_quiescence_state(NetworkModule::QuiescenceState &state)
void attach(std::vector< NetworkSegment * > &segments)
bool get_ucp_ep(const UCPWorker *worker, NodeID target, const UCPRDMAInfo *rdma_info, ucp_ep_h *ep) const
void gather(NodeID root, const void *val_in, void *vals_out, size_t bytes)
Definition ucp_internal.h:289
virtual ~UCPMessageImpl()
virtual void commit(size_t act_payload_size)
UCPMessageImpl(UCPInternal *internal, NodeID target, unsigned short msgid, size_t header_size, size_t max_payload_size, const void *src_payload_addr, size_t src_payload_lines, size_t src_payload_line_stride, const NetworkSegment *_src_segment, const RemoteAddress *_dest_payload_addr, size_t storage_size)
virtual void * add_local_completion(size_t size)
UCPMessageImpl(UCPInternal *internal, const NodeSet &targets, unsigned short msgid, size_t header_size, size_t max_payload_size, const void *src_payload_addr, size_t src_payload_lines, size_t src_payload_line_stride, size_t storage_size)
virtual void * add_remote_completion(size_t size)
Definition ucp_internal.h:82
bool do_work(TimeLimit work_until)
void add_worker(UCPWorker *worker)
Definition ucp_internal.h:347
virtual ~UCPRemoteMemoryCommon()
virtual bool get_remote_addr(off_t offset, RemoteAddress &remote_addr)
UCPRemoteMemoryCommon(const ByteArray &rdma_info_ba)
Definition ucp_internal.h:363
virtual bool get_remote_addr(off_t offset, RemoteAddress &remote_addr)
UCPRemoteMemory(RuntimeImpl *_runtime_impl, Memory me, size_t size, Memory::Kind kind, const ByteArray &rdma_info_ba, UCPInternal *internal)
virtual void get_bytes(off_t offset, void *dst, size_t size)
virtual void put_bytes(off_t offset, const void *src, size_t size)
Definition ucp_context.h:40
PayloadBaseType
Definition ucp_internal.h:57
@ PAYLOAD_BASE_EXTERNAL
Definition ucp_internal.h:60
@ PAYLOAD_BASE_LAST
Definition ucp_internal.h:61
@ PAYLOAD_BASE_INTERNAL
Definition ucp_internal.h:59
@ PAYLOAD_BASE_INLINE
Definition ucp_internal.h:58
Realm::UCP::UCPPoller __attribute__
AmWithRemoteAddrMode
Definition ucp_internal.h:50
@ AM_WITH_REMOTE_ADDR_MODE_PUT
Definition ucp_internal.h:52
@ AM_WITH_REMOTE_ADDR_MODE_AUTO
Definition ucp_internal.h:51
@ AM_WITH_REMOTE_ADDR_MODE_AM
Definition ucp_internal.h:53
Definition activemsg.h:42
int NodeID
Definition nodeset.h:40
Definition ucp_internal.h:108
int rdesc_rel_max
Definition ucp_internal.h:115
bool use_wakeup
Definition ucp_internal.h:120
std::string zcopy_thresh_host
Definition ucp_internal.h:132
size_t outstanding_reqs_limit
Definition ucp_internal.h:129
std::string host_nics
Definition ucp_internal.h:131
std::string ib_seg_size
Definition ucp_internal.h:130
int num_priorities
Definition ucp_internal.h:112
int prog_itr_max
Definition ucp_internal.h:114
size_t pbuf_mp_max_count
Definition ucp_internal.h:125
size_t pbuf_mp_thresh
Definition ucp_internal.h:127
size_t pbuf_mp_max_size
Definition ucp_internal.h:123
bool pbuf_malloc
Definition ucp_internal.h:119
size_t pbuf_mp_max_chunk_size
Definition ucp_internal.h:124
size_t fp_max
Definition ucp_internal.h:122
size_t priority_size_max
Definition ucp_internal.h:121
size_t pbuf_mp_init_count
Definition ucp_internal.h:126
std::string tls_host
Definition ucp_internal.h:133
int prog_boff_max
Definition ucp_internal.h:113
bool bind_hostmem
Definition ucp_internal.h:110
size_t mmp_max_obj_size
Definition ucp_internal.h:128
bool hbuf_malloc
Definition ucp_internal.h:118
bool mpool_leakcheck
Definition ucp_internal.h:116
AmWithRemoteAddrMode am_wra_mode
Definition ucp_internal.h:109
int pollers_max
Definition ucp_internal.h:111
bool crc_check
Definition ucp_internal.h:117
Definition ucp_internal.h:69
char realm_hdr[0]
Definition ucp_internal.h:79
uint32_t crc
Definition ucp_internal.h:70
size_t rdma_payload_size
Definition ucp_internal.h:75
unsigned short msgid
Definition ucp_internal.h:72
RemoteComp * remote_comp
Definition ucp_internal.h:73
NodeID src
Definition ucp_internal.h:71
void * rdma_payload_addr
Definition ucp_internal.h:74
Definition bootstrap.h:32
NodeID src
Definition ucp_internal.h:1
unsigned short msgid
Definition ucp_internal.h:2