int mca_pml_yalla_isend(void *buf, size_t count, ompi_datatype_t *datatype, int dst, int tag, mca_pml_base_send_mode_t mode, struct ompi_communicator_t* comm, struct ompi_request_t **request) { mca_pml_yalla_send_request_t *sreq; mxm_error_t error; int rc; sreq = MCA_PML_YALLA_SREQ_INIT(buf, count, datatype, dst, tag, mode, comm, OMPI_REQUEST_ACTIVE); sreq->super.ompi.req_persistent = false; sreq->super.flags = 0; PML_YALLA_VERBOSE(8, "send request *%p=%p to %d mode %d tag %d dtype %s count %zu", (void *)request, (void *)sreq, dst, mode, tag, datatype->name, count); if (mode == MCA_PML_BASE_SEND_BUFFERED) { rc = mca_pml_yalla_bsend(&sreq->mxm); OPAL_THREAD_LOCK(&ompi_request_lock); sreq->super.ompi.req_status.MPI_ERROR = rc; ompi_request_complete(&sreq->super.ompi, true); OPAL_THREAD_UNLOCK(&ompi_request_lock); *request = &sreq->super.ompi; return rc; } error = mxm_req_send(&sreq->mxm); if (MXM_OK != error) { return OMPI_ERROR; } *request = &sreq->super.ompi; return OMPI_SUCCESS; }
int mca_pml_yalla_send(void *buf, size_t count, ompi_datatype_t *datatype, int dst, int tag, mca_pml_base_send_mode_t mode, struct ompi_communicator_t* comm) { mxm_send_req_t sreq; mxm_error_t error; PML_YALLA_INIT_MXM_SEND_REQ(&sreq, buf, count, datatype, dst, tag, mode, comm, send); PML_YALLA_INIT_BLOCKING_MXM_SEND_REQ(&sreq); PML_YALLA_VERBOSE(8, "send to %d tag %d dtype %s count %zu", dst, tag, datatype->name, count); if (mode == MCA_PML_BASE_SEND_BUFFERED) { return mca_pml_yalla_bsend(&sreq); } error = mxm_req_send(&sreq); if (MXM_OK != error) { return OMPI_ERROR; } PML_YALLA_WAIT_MXM_REQ(&sreq.base); if (MXM_OK != sreq.base.error) { return OMPI_ERROR; } PML_YALLA_FREE_BLOCKING_MXM_REQ(&sreq.base); return OMPI_SUCCESS; }
int mca_pml_yalla_start(size_t count, ompi_request_t** requests) { mca_pml_yalla_base_request_t *req; mxm_error_t error; size_t i; int rc; for (i = 0; i < count; ++i) { req = (mca_pml_yalla_base_request_t *)requests[i]; if ((req == NULL) || (OMPI_REQUEST_PML != req->ompi.req_type)) { /* Skip irrelevant requests */ continue; } PML_YALLA_ASSERT(req->ompi.req_state != OMPI_REQUEST_INVALID); PML_YALLA_RESET_OMPI_REQ(&req->ompi, OMPI_REQUEST_ACTIVE); if (req->flags & MCA_PML_YALLA_REQUEST_FLAG_SEND) { mca_pml_yalla_send_request_t *sreq; sreq = (mca_pml_yalla_send_request_t *)req; PML_YALLA_RESET_PML_REQ(req, PML_YALLA_MXM_REQBASE(sreq)); if (req->flags & MCA_PML_YALLA_REQUEST_FLAG_BSEND) { PML_YALLA_VERBOSE(8, "start bsend request %p", (void *)sreq); rc = mca_pml_yalla_bsend(&sreq->mxm); sreq->super.ompi.req_status.MPI_ERROR = rc; ompi_request_complete(&sreq->super.ompi, true); if (OMPI_SUCCESS != rc) { return rc; } } else { PML_YALLA_VERBOSE(8, "start send request %p", (void *)sreq); error = mxm_req_send(&sreq->mxm); if (MXM_OK != error) { return OMPI_ERROR; } } } else { mca_pml_yalla_recv_request_t *rreq; rreq = (mca_pml_yalla_recv_request_t *)req; PML_YALLA_RESET_PML_REQ(req, PML_YALLA_MXM_REQBASE(rreq)); PML_YALLA_VERBOSE(8, "start recv request %p", (void *)req); error = mxm_req_recv(&rreq->mxm); if (MXM_OK != error) { return OMPI_ERROR; } } } return OMPI_SUCCESS; }