int ompi_mtl_portals_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) { ptl_match_bits_t match_bits; ptl_match_bits_t ignore_bits; ompi_mtl_portals_event_t *recv_event = NULL; PTL_SET_RECV_BITS(match_bits, ignore_bits, comm->c_contextid, src, tag); /* first, check the queue of processed unexpected messages */ recv_event = ompi_mtl_portals_search_unex_q(match_bits, ignore_bits, true); if (NULL == recv_event) { /* check for new events */ recv_event = ompi_mtl_portals_search_unex_events(match_bits, ignore_bits, true); } if ( NULL != recv_event ) { /* found it */ *flag = 1; status->MPI_SOURCE = PTL_GET_SOURCE(recv_event->ev.match_bits); status->MPI_TAG = PTL_GET_TAG(recv_event->ev.match_bits); status->_count = recv_event->ev.rlength; status->MPI_ERROR = OMPI_SUCCESS; } else { *flag = 0; } return OMPI_SUCCESS; }
int ompi_mtl_portals_irecv(struct mca_mtl_base_module_t* mtl, struct ompi_communicator_t *comm, int src, int tag, struct ompi_convertor_t *convertor, mca_mtl_request_t *mtl_request) { ptl_match_bits_t match_bits, ignore_bits; ptl_md_t md; ptl_handle_md_t md_h; ptl_handle_me_t me_h; int ret; ptl_process_id_t remote_proc; mca_mtl_base_endpoint_t *endpoint = NULL; ompi_mtl_portals_request_t *ptl_request = (ompi_mtl_portals_request_t*) mtl_request; ompi_mtl_portals_event_t *recv_event = NULL; size_t buflen; ptl_request->convertor = convertor; if (MPI_ANY_SOURCE == src) { remote_proc.nid = PTL_NID_ANY; remote_proc.pid = PTL_PID_ANY; } else { ompi_proc_t* ompi_proc = ompi_comm_peer_lookup( comm, src ); endpoint = (mca_mtl_base_endpoint_t*) ompi_proc->proc_pml; remote_proc = endpoint->ptl_proc; } PTL_SET_RECV_BITS(match_bits, ignore_bits, comm->c_contextid, src, tag); OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_output, "recv bits: 0x%016llx 0x%016llx\n", match_bits, ignore_bits)); /* first, check the queue of processed unexpected messages */ recv_event = ompi_mtl_portals_search_unex_q(match_bits, ignore_bits); if (NULL != recv_event) { /* found it */ ompi_mtl_portals_get_data(recv_event, convertor, ptl_request); OMPI_FREE_LIST_RETURN(&ompi_mtl_portals.event_fl, (ompi_free_list_item_t*)recv_event); goto cleanup; } else { restart_search: /* check unexpected events */ recv_event = ompi_mtl_portals_search_unex_events(match_bits, ignore_bits); if (NULL != recv_event) { /* found it */ ompi_mtl_portals_get_data(recv_event, convertor, ptl_request); OMPI_FREE_LIST_RETURN(&ompi_mtl_portals.event_fl, (ompi_free_list_item_t*)recv_event); goto cleanup; } } /* didn't find it, now post the receive */ ret = ompi_mtl_datatype_recv_buf(convertor, &md.start, &buflen, &ptl_request->free_after); md.length = buflen; /* create ME entry */ ret = PtlMEInsert(ompi_mtl_portals.ptl_match_ins_me_h, remote_proc, match_bits, ignore_bits, PTL_UNLINK, PTL_INS_BEFORE, &me_h); if( ret !=PTL_OK) { return ompi_common_portals_error_ptl_to_ompi(ret); } /* associate a memory descriptor with the Match list Entry */ md.threshold = 0; md.options = PTL_MD_OP_PUT | PTL_MD_TRUNCATE | PTL_MD_EVENT_START_DISABLE; md.user_ptr = ptl_request; md.eq_handle = ompi_mtl_portals.ptl_eq_h; ret=PtlMDAttach(me_h, md, PTL_UNLINK, &md_h); if( ret !=PTL_OK) { return ompi_common_portals_error_ptl_to_ompi(ret); } /* now try to make active */ md.threshold = 1; /* enable the memory descritor, if the ptl_unexpected_recv_eq_h * queue is empty */ ret = PtlMDUpdate(md_h, NULL, &md, ompi_mtl_portals.ptl_unexpected_recv_eq_h); if (ret == PTL_MD_NO_UPDATE) { /* a message has arrived since we searched - look again */ PtlMDUnlink(md_h); if (ptl_request->free_after) { free(md.start); } goto restart_search; } else if( PTL_OK != ret ) { return ompi_common_portals_error_ptl_to_ompi(ret); } ptl_request->event_callback = ompi_mtl_portals_recv_progress; cleanup: return OMPI_SUCCESS; }