int ompi_mtl_mx_iprobe(struct mca_mtl_base_module_t* mtl, struct ompi_communicator_t *comm, int src, int tag, int *flag, struct ompi_status_public_t *status) { uint32_t result; mx_return_t ret; mx_status_t mx_status; uint64_t match_bits; uint64_t mask_bits; MX_SET_RECV_BITS(match_bits, mask_bits, comm->c_contextid, src, tag); ret = mx_iprobe(ompi_mtl_mx.mx_endpoint, match_bits, mask_bits, &mx_status, &result); if (MX_SUCCESS != ret) { opal_output(ompi_mtl_base_output, "Error in mx_iprobe (error %s)\n", mx_strerror(ret)); return OMPI_ERROR; } if (result) { if(MPI_STATUS_IGNORE != status) { MX_GET_SRC(mx_status.match_info, status->MPI_SOURCE); MX_GET_TAG(mx_status.match_info, status->MPI_TAG); status->_ucount = mx_status.msg_length; } *flag = 1; } else { *flag = 0; } return OMPI_SUCCESS; }
int ompi_mtl_mx_progress( void ) { mx_return_t mx_return; mx_request_t mx_request; mx_status_t mx_status; uint32_t result; mca_mtl_mx_request_t* mtl_mx_request; int completed = 0; while(1){ mx_return = mx_ipeek(ompi_mtl_mx.mx_endpoint, &mx_request, &result); if( OPAL_UNLIKELY(mx_return != MX_SUCCESS) ) { opal_output(ompi_mtl_base_framework.framework_output, "Error in mx_ipeek (error %s)\n", mx_strerror(mx_return)); } if(result) { completed++; mx_return = mx_test(ompi_mtl_mx.mx_endpoint, &mx_request, &mx_status, &result); if( OPAL_UNLIKELY(mx_return != MX_SUCCESS) ) { opal_output(ompi_mtl_base_framework.framework_output, "Error in mx_test (error %s)\n", mx_strerror(mx_return)); abort(); } if( OPAL_UNLIKELY(0 == result) ) { opal_output(ompi_mtl_base_framework.framework_output, "Error in ompi_mtl_mx_progress, mx_ipeek returned a request, mx_test on the request resulted failure.\n"); abort(); } mtl_mx_request = (mca_mtl_mx_request_t*) mx_status.context; if(OMPI_MTL_MX_ISEND == mtl_mx_request->type) { if(mtl_mx_request->free_after) { free(mtl_mx_request->mx_segment[0].segment_ptr); } } else { assert( OMPI_MTL_MX_IRECV == mtl_mx_request->type ); ompi_mtl_datatype_unpack(mtl_mx_request->convertor, mtl_mx_request->mx_segment[0].segment_ptr, mx_status.xfer_length); /* set the status */ MX_GET_SRC(mx_status.match_info, mtl_mx_request->super.ompi_req->req_status.MPI_SOURCE); MX_GET_TAG(mx_status.match_info, mtl_mx_request->super.ompi_req->req_status.MPI_TAG); mtl_mx_request->super.ompi_req->req_status._ucount = mx_status.xfer_length; } /* suppose everything went just fine ... */ mtl_mx_request->super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS; if( OPAL_UNLIKELY(MX_STATUS_SUCCESS != mx_status.code) ) { if( MX_STATUS_TRUNCATED == mx_status.code ) { mtl_mx_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE; } else { mtl_mx_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_INTERN; } return completed; } mtl_mx_request->super.completion_callback(&mtl_mx_request->super); return completed; } else { return completed; } } }