ncclResult_t nccl_net_ofi_irecv_v9()

in src/nccl_ofi_api.cpp [634:683]


ncclResult_t nccl_net_ofi_irecv_v9(void* recvComm, int n, void** data,
				   size_t* sizes, int* tags, void** mhandles, void** request)
{
	if (OFI_UNLIKELY(recvComm == NULL || data == NULL ||
				  sizes == NULL || tags == NULL ||
				  mhandles == NULL || request == NULL)) {
		NCCL_OFI_WARN("Invalid argument: NULL pointer detected");
		return check_return(ncclInvalidArgument);
	}

	if (OFI_UNLIKELY(n <= 0 || n > NCCL_OFI_MAX_RECVS)) {
		NCCL_OFI_WARN("Invalid number of receives: %d (max: %d)", n, NCCL_OFI_MAX_RECVS);
		return check_return(ncclInvalidArgument);
	}

	nccl_net_ofi_recv_comm_t *recv_comm =
		(nccl_net_ofi_recv_comm_t *)recvComm;
	nccl_net_ofi_mr_handle_t **handles = (nccl_net_ofi_mr_handle_t **)mhandles;
	nccl_net_ofi_req_t **base_req = (nccl_net_ofi_req_t **)request;

	if (OFI_UNLIKELY(recv_comm == NULL)) {
		NCCL_OFI_WARN("Invalid communicator object provided");
		return check_return(ncclInternalError);
	}

	if (OFI_UNLIKELY(n > NCCL_OFI_MAX_RECVS)) {
		NCCL_OFI_WARN("Request for group recv size of %d, greater than maximum of %d",
			      n, NCCL_OFI_MAX_RECVS);
		return check_return(ncclInternalError);
	}

	if (OFI_UNLIKELY(handles == NULL)) {
		NCCL_OFI_WARN("Invalid memory handle provided");
		return check_return(ncclInternalError);
	}

	/* can't check the memory handle for validity because the
	 * send/recv protocol will return a NULL handle for a host
	 * buffer when the provider does not require local
	 * registration and the buffer is a host buffer.
	 */

	if (OFI_UNLIKELY(base_req == NULL)) {
		NCCL_OFI_WARN("Invalid request provided");
		return check_return(ncclInternalError);
	}

	int ret = recv_comm->recv(recv_comm, n, data, sizes, tags, handles, base_req);
	return nccl_net_ofi_retval_translate(ret);
}