static UCS_F_ALWAYS_INLINE void ucp_tag_recv_request_init(ucp_request_t *req, ucp_worker_h worker, void* buffer, size_t count, ucp_datatype_t datatype, uint16_t req_flags) { ucp_dt_generic_t *dt_gen; req->flags = UCP_REQUEST_FLAG_EXPECTED | UCP_REQUEST_FLAG_RECV | req_flags; req->recv.state.offset = 0; req->recv.worker = worker; switch (datatype & UCP_DATATYPE_CLASS_MASK) { case UCP_DATATYPE_IOV: req->recv.state.dt.iov.iov_offset = 0; req->recv.state.dt.iov.iovcnt_offset = 0; req->recv.state.dt.iov.iovcnt = count; req->recv.state.dt.iov.memh = UCT_MEM_HANDLE_NULL; break; case UCP_DATATYPE_GENERIC: dt_gen = ucp_dt_generic(datatype); req->recv.state.dt.generic.state = UCS_PROFILE_NAMED_CALL("dt_start", dt_gen->ops.start_unpack, dt_gen->context, buffer, count); ucs_debug("req %p buffer %p count %zu dt_gen state=%p", req, buffer, count, req->recv.state.dt.generic.state); break; default: break; } if (ucs_log_enabled(UCS_LOG_LEVEL_TRACE_REQ)) { req->recv.info.sender_tag = 0; } }
static ucs_status_t ucp_tag_send_start_req(ucp_ep_h ep, const void *buffer, size_t count, ucp_datatype_t datatype, ucp_tag_t tag, ucp_request_t *req) { size_t rndv_thresh = ep->worker->context->config.rndv_thresh; ucp_dt_generic_t *dt_gen; void *state; req->send.ep = ep; req->send.buffer = buffer; req->send.count = count; req->send.datatype = datatype; req->send.state.offset = 0; req->send.tag = tag; switch (datatype & UCP_DATATYPE_CLASS_MASK) { case UCP_DATATYPE_CONTIG: /* TODO check for zero-copy */ req->send.length = ucp_contig_dt_length(datatype, count); if (req->send.length <= rndv_thresh) { req->send.uct.func = ucp_tag_progress_eager_contig; return UCS_OK; } break; case UCP_DATATYPE_GENERIC: dt_gen = ucp_dt_generic(datatype); state = dt_gen->ops.start_pack(dt_gen->context, buffer, count); req->send.state.dt.generic.state = state; req->send.length = dt_gen->ops.packed_size(state); if (req->send.length <= rndv_thresh) { req->send.uct.func = ucp_tag_progress_eager_generic; return UCS_OK; } break; default: return UCS_ERR_INVALID_PARAM; } return ucp_tag_send_start_rndv(req); }
static void ucp_tag_req_start_generic(ucp_request_t *req, size_t count, size_t rndv_thresh, const ucp_proto_t *progress) { ucp_ep_config_t *config = ucp_ep_config(req->send.ep); ucp_dt_generic_t *dt_gen; size_t length; void *state; dt_gen = ucp_dt_generic(req->send.datatype); state = dt_gen->ops.start_pack(dt_gen->context, req->send.buffer, count); req->send.state.dt.generic.state = state; req->send.length = length = dt_gen->ops.packed_size(state); if (length <= config->max_am_bcopy - progress->only_hdr_size) { req->send.uct.func = progress->bcopy_single; } else { req->send.uct.func = progress->bcopy_multi; } }