static size_t ucp_tag_rndv_pack_rkey(ucp_request_t *sreq, ucp_rndv_rts_hdr_t *rndv_rts_hdr) { ucp_ep_h ep = sreq->send.ep; size_t packed_rkey = 0; ucs_status_t status; ucs_assert(UCP_DT_IS_CONTIG(sreq->send.datatype)); /* Check if the sender needs to register the send buffer - * is its datatype contiguous and does the receive side need it */ if ((ucp_ep_is_rndv_lane_present(ep)) && (ucp_ep_rndv_md_flags(ep) & UCT_MD_FLAG_NEED_RKEY)) { status = ucp_request_send_buffer_reg(sreq, ucp_ep_get_rndv_get_lane(ep)); ucs_assert_always(status == UCS_OK); /* if the send buffer was registered, send the rkey */ UCS_PROFILE_CALL(uct_md_mkey_pack, ucp_ep_md(ep, ucp_ep_get_rndv_get_lane(ep)), sreq->send.state.dt.contig.memh, rndv_rts_hdr + 1); rndv_rts_hdr->flags |= UCP_RNDV_RTS_FLAG_PACKED_RKEY; packed_rkey = ucp_ep_md_attr(ep, ucp_ep_get_rndv_get_lane(ep))->rkey_packed_size; } return packed_rkey; }
static ucs_status_t ucp_tag_req_start_contig(ucp_request_t *req, size_t count, ssize_t max_short, size_t zcopy_thresh, size_t rndv_thresh, const ucp_proto_t *proto) { ucp_ep_config_t *config = ucp_ep_config(req->send.ep); size_t only_hdr_size = proto->only_hdr_size; ucs_status_t status; size_t max_zcopy; ssize_t length; length = ucp_contig_dt_length(req->send.datatype, count); req->send.length = length; if (length <= max_short) { /* short */ req->send.uct.func = proto->contig_short; } else if (length >= rndv_thresh) { /* rendezvous */ status = ucp_tag_send_start_rndv(req); if (status != UCS_OK) { return status; } } else if (length < zcopy_thresh) { /* bcopy */ if (req->send.length <= config->max_am_bcopy - only_hdr_size) { req->send.uct.func = proto->bcopy_single; } else { req->send.uct.func = proto->bcopy_multi; } } else { /* eager zcopy */ status = ucp_request_send_buffer_reg(req, ucp_ep_get_am_lane(req->send.ep)); if (status != UCS_OK) { return status; } req->send.uct_comp.func = proto->contig_zcopy_completion; max_zcopy = config->max_am_zcopy; if (req->send.length <= max_zcopy - only_hdr_size) { req->send.uct_comp.count = 1; req->send.uct.func = proto->contig_zcopy_single; } else { /* calculate number of zcopy fragments */ req->send.uct_comp.count = 1 + (length + proto->first_hdr_size - proto->mid_hdr_size - 1) / (max_zcopy - proto->mid_hdr_size); req->send.uct.func = proto->contig_zcopy_multi; } } return UCS_OK; }