int mca_pml_ob1_isend(const void *buf, size_t count, ompi_datatype_t * datatype, int dst, int tag, mca_pml_base_send_mode_t sendmode, ompi_communicator_t * comm, ompi_request_t ** request) { mca_pml_ob1_comm_proc_t *ob1_proc = mca_pml_ob1_peer_lookup (comm, dst); mca_pml_ob1_send_request_t *sendreq = NULL; ompi_proc_t *dst_proc = ob1_proc->ompi_proc; mca_bml_base_endpoint_t* endpoint = mca_bml_base_get_endpoint (dst_proc); int16_t seqn; int rc; seqn = (uint16_t) OPAL_THREAD_ADD32(&ob1_proc->send_sequence, 1); if (MCA_PML_BASE_SEND_SYNCHRONOUS != sendmode) { rc = mca_pml_ob1_send_inline (buf, count, datatype, dst, tag, seqn, dst_proc, endpoint, comm); if (OPAL_LIKELY(0 <= rc)) { /* NTH: it is legal to return ompi_request_empty since the only valid * field in a send completion status is whether or not the send was * cancelled (which it can't be at this point anyway). */ *request = &ompi_request_empty; return OMPI_SUCCESS; } } MCA_PML_OB1_SEND_REQUEST_ALLOC(comm, dst, sendreq); if (NULL == sendreq) return OMPI_ERR_OUT_OF_RESOURCE; MCA_PML_OB1_SEND_REQUEST_INIT(sendreq, buf, count, datatype, dst, tag, comm, sendmode, false); PERUSE_TRACE_COMM_EVENT (PERUSE_COMM_REQ_ACTIVATE, &(sendreq)->req_send.req_base, PERUSE_SEND); MCA_PML_OB1_SEND_REQUEST_START_W_SEQ(sendreq, endpoint, seqn, rc); *request = (ompi_request_t *) sendreq; return rc; }
int mca_pml_ob1_send(const void *buf, size_t count, ompi_datatype_t * datatype, int dst, int tag, mca_pml_base_send_mode_t sendmode, ompi_communicator_t * comm) { mca_pml_ob1_comm_proc_t *ob1_proc = mca_pml_ob1_peer_lookup (comm, dst); ompi_proc_t *dst_proc = ob1_proc->ompi_proc; mca_bml_base_endpoint_t* endpoint = mca_bml_base_get_endpoint (dst_proc); mca_pml_ob1_send_request_t *sendreq = NULL; int16_t seqn; int rc; if (OPAL_UNLIKELY(NULL == endpoint)) { return OMPI_ERR_UNREACH; } if (OPAL_UNLIKELY(MCA_PML_BASE_SEND_BUFFERED == sendmode)) { /* large buffered sends *need* a real request so use isend instead */ ompi_request_t *brequest; rc = mca_pml_ob1_isend (buf, count, datatype, dst, tag, sendmode, comm, &brequest); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { return rc; } ompi_request_wait_completion (brequest); ompi_request_free (&brequest); return OMPI_SUCCESS; } seqn = (uint16_t) OPAL_THREAD_ADD32(&ob1_proc->send_sequence, 1); /** * The immediate send will not have a request, so they are * intracable from the point of view of any debugger attached to * the parallel application. */ if (MCA_PML_BASE_SEND_SYNCHRONOUS != sendmode) { rc = mca_pml_ob1_send_inline (buf, count, datatype, dst, tag, seqn, dst_proc, endpoint, comm); if (OPAL_LIKELY(0 <= rc)) { return OMPI_SUCCESS; } } if (OPAL_LIKELY(!ompi_mpi_thread_multiple)) { sendreq = mca_pml_ob1_sendreq; mca_pml_ob1_sendreq = NULL; } if( OPAL_UNLIKELY(NULL == sendreq) ) { MCA_PML_OB1_SEND_REQUEST_ALLOC(comm, dst, sendreq); if (NULL == sendreq) return OMPI_ERR_TEMP_OUT_OF_RESOURCE; } sendreq->req_send.req_base.req_proc = dst_proc; sendreq->rdma_frag = NULL; MCA_PML_OB1_SEND_REQUEST_INIT(sendreq, buf, count, datatype, dst, tag, comm, sendmode, false); PERUSE_TRACE_COMM_EVENT (PERUSE_COMM_REQ_ACTIVATE, &sendreq->req_send.req_base, PERUSE_SEND); MCA_PML_OB1_SEND_REQUEST_START_W_SEQ(sendreq, endpoint, seqn, rc); if (OPAL_LIKELY(rc == OMPI_SUCCESS)) { ompi_request_wait_completion(&sendreq->req_send.req_base.req_ompi); rc = sendreq->req_send.req_base.req_ompi.req_status.MPI_ERROR; } if (OPAL_UNLIKELY(ompi_mpi_thread_multiple || NULL != mca_pml_ob1_sendreq)) { MCA_PML_OB1_SEND_REQUEST_RETURN(sendreq); } else { mca_pml_ob1_send_request_fini (sendreq); mca_pml_ob1_sendreq = sendreq; } return rc; }
int mca_pml_ob1_send(void *buf, size_t count, ompi_datatype_t * datatype, int dst, int tag, mca_pml_base_send_mode_t sendmode, ompi_communicator_t * comm) { mca_pml_ob1_comm_t* ob1_comm = comm->c_pml_comm; ompi_proc_t *dst_proc = ompi_comm_peer_lookup (comm, dst); mca_bml_base_endpoint_t* endpoint = (mca_bml_base_endpoint_t*) dst_proc->proc_endpoints[OMPI_PROC_ENDPOINT_TAG_BML]; mca_pml_ob1_send_request_t *sendreq = alloca(mca_pml_base_send_requests.fl_frag_size); int16_t seqn; int rc; if (OPAL_UNLIKELY(MCA_PML_BASE_SEND_BUFFERED == sendmode)) { /* large buffered sends *need* a real request so use isend instead */ ompi_request_t *brequest; rc = mca_pml_ob1_isend (buf, count, datatype, dst, tag, sendmode, comm, &brequest); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { return rc; } /* free the request and return. don't care if it completes now */ ompi_request_free (&brequest); return OMPI_SUCCESS; } if (OPAL_UNLIKELY(NULL == endpoint)) { return OMPI_ERR_UNREACH; } seqn = (uint16_t) OPAL_THREAD_ADD32(&ob1_comm->procs[dst].send_sequence, 1); if (MCA_PML_BASE_SEND_SYNCHRONOUS != sendmode) { rc = mca_pml_ob1_send_inline (buf, count, datatype, dst, tag, seqn, dst_proc, endpoint, comm); if (OPAL_LIKELY(0 <= rc)) { return OMPI_SUCCESS; } } OBJ_CONSTRUCT(sendreq, mca_pml_ob1_send_request_t); sendreq->req_send.req_base.req_proc = dst_proc; sendreq->src_des = NULL; MCA_PML_OB1_SEND_REQUEST_INIT(sendreq, buf, count, datatype, dst, tag, comm, sendmode, false); PERUSE_TRACE_COMM_EVENT (PERUSE_COMM_REQ_ACTIVATE, &sendreq->req_send.req_base, PERUSE_SEND); MCA_PML_OB1_SEND_REQUEST_START_W_SEQ(sendreq, endpoint, seqn, rc); if (rc != OMPI_SUCCESS) { return rc; } ompi_request_wait_completion(&sendreq->req_send.req_base.req_ompi); rc = sendreq->req_send.req_base.req_ompi.req_status.MPI_ERROR; MCA_PML_BASE_SEND_REQUEST_FINI(&sendreq->req_send); OBJ_DESTRUCT(sendreq); return rc; }
int mca_pml_ob1_send(void *buf, size_t count, ompi_datatype_t * datatype, int dst, int tag, mca_pml_base_send_mode_t sendmode, ompi_communicator_t * comm) { mca_pml_ob1_comm_t* ob1_comm = comm->c_pml_comm; ompi_proc_t *dst_proc = ompi_comm_peer_lookup (comm, dst); mca_bml_base_endpoint_t* endpoint = (mca_bml_base_endpoint_t*) dst_proc->proc_endpoints[OMPI_PROC_ENDPOINT_TAG_BML]; mca_pml_ob1_send_request_t *sendreq = NULL; int16_t seqn; int rc; if (OPAL_UNLIKELY(MCA_PML_BASE_SEND_BUFFERED == sendmode)) { /* large buffered sends *need* a real request so use isend instead */ ompi_request_t *brequest; rc = mca_pml_ob1_isend (buf, count, datatype, dst, tag, sendmode, comm, &brequest); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { return rc; } /* free the request and return. don't care if it completes now */ ompi_request_free (&brequest); return OMPI_SUCCESS; } if (OPAL_UNLIKELY(NULL == endpoint)) { return OMPI_ERR_UNREACH; } seqn = (uint16_t) OPAL_THREAD_ADD32(&ob1_comm->procs[dst].send_sequence, 1); /** * The immediate send will not have a request, so they are * intracable from the point of view of any debugger attached to * the parallel application. */ if (MCA_PML_BASE_SEND_SYNCHRONOUS != sendmode) { rc = mca_pml_ob1_send_inline (buf, count, datatype, dst, tag, seqn, dst_proc, endpoint, comm); if (OPAL_LIKELY(0 <= rc)) { return OMPI_SUCCESS; } } #if !OMPI_ENABLE_THREAD_MULTIPLE sendreq = mca_pml_ob1_sendreq; if( OPAL_UNLIKELY(NULL == sendreq) ) #endif /* !OMPI_ENABLE_THREAD_MULTIPLE */ { MCA_PML_OB1_SEND_REQUEST_ALLOC(comm, dst, sendreq); if (NULL == sendreq) return OMPI_ERR_TEMP_OUT_OF_RESOURCE; #if !OMPI_ENABLE_THREAD_MULTIPLE mca_pml_ob1_sendreq = sendreq; #endif /* !OMPI_ENABLE_THREAD_MULTIPLE */ } sendreq->req_send.req_base.req_proc = dst_proc; sendreq->rdma_frag = NULL; MCA_PML_OB1_SEND_REQUEST_INIT(sendreq, buf, count, datatype, dst, tag, comm, sendmode, false); PERUSE_TRACE_COMM_EVENT (PERUSE_COMM_REQ_ACTIVATE, &sendreq->req_send.req_base, PERUSE_SEND); MCA_PML_OB1_SEND_REQUEST_START_W_SEQ(sendreq, endpoint, seqn, rc); if (OPAL_LIKELY(rc == OMPI_SUCCESS)) { ompi_request_wait_completion(&sendreq->req_send.req_base.req_ompi); rc = sendreq->req_send.req_base.req_ompi.req_status.MPI_ERROR; } #if OMPI_ENABLE_THREAD_MULTIPLE MCA_PML_OB1_SEND_REQUEST_RETURN(sendreq); #else mca_pml_ob1_send_request_fini (sendreq); #endif return rc; }