static int mca_bcol_iboffload_fanin_init( bcol_function_args_t *input_args, mca_bcol_iboffload_module_t *iboffload, struct mca_bcol_iboffload_collreq_t **coll_request) { ompi_free_list_item_t *item = NULL; mca_bcol_iboffload_collfrag_t *coll_fragment = NULL; mca_bcol_iboffload_component_t *cm = &mca_bcol_iboffload_component; IBOFFLOAD_VERBOSE(10, ("Calling for mca_bcol_iboffload_barrier_init")); OMPI_FREE_LIST_WAIT_MT(&cm->collreqs_free, item); if(OPAL_UNLIKELY(NULL == item)) { IBOFFLOAD_VERBOSE(10, ("Failing for coll request free list waiting.\n")); return OMPI_ERR_OUT_OF_RESOURCE; } (*coll_request) = (mca_bcol_iboffload_collreq_t *) item; (*coll_request)->progress_fn = iboffload->fanin_algth; (*coll_request)->completion_cb_fn = NULL; (*coll_request)->order_info = &input_args->order_info; (*coll_request)->module = iboffload; (*coll_request)->ml_buffer_index = input_args->buffer_index; (*coll_request)->buffer_info[SBUF].offset = 0; (*coll_request)->buffer_info[RBUF].offset = 0; (*coll_request)->qp_index = MCA_BCOL_IBOFFLOAD_QP_BARRIER; input_args->bcol_opaque_data = (void *) (*coll_request); /* finish initializing full message descriptor */ (*coll_request)->n_fragments = 1; (*coll_request)->n_frags_sent = 1; (*coll_request)->n_frag_mpi_complete = 0; (*coll_request)->n_frag_net_complete = 0; (*coll_request)->user_handle_freed = false; /* * setup collective work request */ /* get collective frag */ coll_fragment = &(*coll_request)->first_collfrag; mca_bcol_iboffload_collfrag_init(coll_fragment); coll_fragment->alg = FANIN_ALG; coll_fragment->mq_index = COLL_MQ; /* Set mq credits */ coll_fragment->mq_credits = iboffload->alg_task_consump[FANIN_ALG]; /* set pointers for (coll frag) <-> (coll full request) */ MCA_BCOL_IBOFFLOAD_SET_COLL_REQ_LINKS(*coll_request, coll_fragment); return OMPI_SUCCESS; }
static void* get_coll_handle(void) { ompi_request_t *ompi_req; ompi_free_list_item_t *item; OMPI_FREE_LIST_WAIT_MT(&(mca_coll_hcoll_component.requests),item); if (OPAL_UNLIKELY(NULL == item)) { HCOL_ERROR("Wait for free list failed.\n"); return NULL; } ompi_req = (ompi_request_t *)item; OMPI_REQUEST_INIT(ompi_req,false); return (void *)ompi_req; }
static int mca_coll_ml_barrier_launch(mca_coll_ml_module_t *ml_module, ompi_request_t **req) { ompi_free_list_item_t *item; mca_coll_ml_collective_operation_progress_t *coll_op; mca_bcol_base_payload_buffer_desc_t *src_buffer_desc = NULL; /* allocate an ml buffer for signaling purposes */ src_buffer_desc = mca_coll_ml_alloc_buffer(ml_module); while (NULL == src_buffer_desc) { opal_progress(); src_buffer_desc = mca_coll_ml_alloc_buffer(ml_module); } /* Blocking call on fragment allocation (Maybe we want to make it non blocking ?) */ OMPI_FREE_LIST_WAIT_MT(&(ml_module->coll_ml_collective_descriptors), item); coll_op = (mca_coll_ml_collective_operation_progress_t *) item; assert(NULL != coll_op); ML_VERBOSE(10, ("Get coll request %p", coll_op)); MCA_COLL_ML_OP_BASIC_SETUP(coll_op, 0, 0, NULL, NULL, ml_module->coll_ml_barrier_function); coll_op->fragment_data.buffer_desc = src_buffer_desc; coll_op->dag_description.num_tasks_completed = 0; coll_op->variable_fn_params.buffer_index = src_buffer_desc->buffer_index; coll_op->variable_fn_params.sequence_num = OPAL_THREAD_ADD32(&(ml_module->collective_sequence_num), 1); /* Pointer to a coll finalize function */ coll_op->process_fn = NULL; (*req) = &coll_op->full_message.super; OMPI_REQUEST_INIT((*req), false); (*req)->req_status._cancelled = 0; (*req)->req_state = OMPI_REQUEST_ACTIVE; (*req)->req_status.MPI_ERROR = OMPI_SUCCESS; /* Set order info if there is a bcol needs ordering */ MCA_COLL_ML_SET_ORDER_INFO(coll_op, 1); return mca_coll_ml_generic_collectives_launcher(coll_op, mca_coll_ml_barrier_task_setup); }
static int bcol_ptpcoll_barrier_recurs_dbl_extra_new( bcol_function_args_t *input_args, struct coll_ml_function_t *const_args) { /* local variable */ uint64_t sequence_number; int rc, completed, num_reqs = 2, tag, my_extra_partner_comm_rank; ompi_request_t **requests; ompi_free_list_item_t *item; mca_bcol_ptpcoll_collreq_t *collreq; mca_bcol_ptpcoll_module_t *ptp_module = (mca_bcol_ptpcoll_module_t *) const_args->bcol_module; ompi_communicator_t *comm = ptp_module->super.sbgp_partner_module->group_comm; OMPI_FREE_LIST_WAIT_MT(&ptp_module->collreqs_free, item); if (OPAL_UNLIKELY(NULL == item)) { PTPCOLL_ERROR(("Free list waiting failed.")); return OMPI_ERR_OUT_OF_RESOURCE; } collreq = (mca_bcol_ptpcoll_collreq_t *) item; input_args->bcol_opaque_data = (void *) collreq; requests = collreq->requests; /* TAG Calculation */ sequence_number = input_args->sequence_num; /* Keep tag within the limit supportd by the pml */ tag = (PTPCOLL_TAG_OFFSET + sequence_number * PTPCOLL_TAG_FACTOR) & (ptp_module->tag_mask); /* mark this as a collective tag, to avoid conflict with user-level flags */ tag = -tag; /* I will not participate in the exchange - so just "register" as here, * signal the extra rank that I am here */ my_extra_partner_comm_rank = ptp_module->super.sbgp_partner_module->group_list[ptp_module->proxy_extra_index]; rc = MCA_PML_CALL(isend(NULL, 0, MPI_INT, my_extra_partner_comm_rank, tag, MCA_PML_BASE_SEND_STANDARD, comm, &(requests[0]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Send failed.")); return rc; } /* Recv signal that the rest are done - my_extra_partner_comm_rank */ rc = MCA_PML_CALL(irecv(NULL, 0, MPI_INT, my_extra_partner_comm_rank, tag, comm, &(requests[1]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("IRecv failed.")); return rc; } /* Test for completion */ completed = mca_bcol_ptpcoll_test_all_for_match(&num_reqs, requests, &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for all failed.")); return rc; } if (!completed) { return BCOL_FN_STARTED; } OMPI_FREE_LIST_RETURN_MT(&ptp_module->collreqs_free, (ompi_free_list_item_t *) collreq); return BCOL_FN_COMPLETE; }
static int bcol_ptpcoll_barrier_recurs_dbl_new( bcol_function_args_t *input_args, struct coll_ml_function_t *const_args) { /* local variable */ uint64_t sequence_number; mca_bcol_ptpcoll_module_t *ptp_module = (mca_bcol_ptpcoll_module_t *) const_args->bcol_module; ompi_communicator_t *comm = ptp_module->super.sbgp_partner_module->group_comm; int rc, my_extra_partner_comm_rank = 0, exchange, completed, pair_comm_rank, pair_rank, delta, tag, num_reqs = 0, my_rank = ptp_module->super.sbgp_partner_module->my_index, n_exchange = ptp_module->super.sbgp_partner_module->n_levels_pow2; ompi_request_t **requests; ompi_free_list_item_t *item; mca_bcol_ptpcoll_collreq_t *collreq; OMPI_FREE_LIST_WAIT_MT(&ptp_module->collreqs_free, item); if (OPAL_UNLIKELY(NULL == item)) { PTPCOLL_ERROR(("Free list waiting failed.")); return OMPI_ERR_OUT_OF_RESOURCE; } collreq = (mca_bcol_ptpcoll_collreq_t *) item; input_args->bcol_opaque_data = (void *) collreq; assert(PTPCOLL_EXTRA != ptp_module->pow_2type); requests = collreq->requests; /* TAG Calculation */ sequence_number = input_args->sequence_num; /* keep tag within the limit supportd by the pml */ tag = (PTPCOLL_TAG_OFFSET + sequence_number * PTPCOLL_TAG_FACTOR) & (ptp_module->tag_mask); /* mark this as a collective tag, to avoid conflict with user-level flags */ tag = -tag; if (PTPCOLL_PROXY == ptp_module->pow_2type) { /* I will participate in the exchange - wait for signal from extra ** process */ /* * recv from extra rank - my_extra_partner_comm_rank * can use blocking recv, as no other communications * need to take place. */ my_extra_partner_comm_rank = ptp_module->super.sbgp_partner_module->group_list[ptp_module->proxy_extra_index]; collreq->need_toserv_extra = 1; collreq->extra_partner_rank = my_extra_partner_comm_rank; rc = MCA_PML_CALL(irecv(NULL, 0, MPI_INT, my_extra_partner_comm_rank, tag, comm, &(requests[0]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("IRecv failed.")); return rc; } completed = mca_bcol_ptpcoll_test_for_match(&requests[0], &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for irecv failed.")); return rc; } if (!completed) { collreq->tag = tag; collreq->num_reqs = 1; collreq->exchange = 0; return BCOL_FN_STARTED; } } else { collreq->need_toserv_extra = 0; } /* Loop over exchange send/recv pairs */ delta = 1; for (exchange = 0; exchange < n_exchange; ++exchange) { /* rank of exchange partner within the group */ pair_rank = my_rank ^ delta; /* rank within the communicator */ pair_comm_rank = ptp_module->super.sbgp_partner_module->group_list[pair_rank]; /* send to partner - we will wait for completion, as send * completion is at the MPI level, and will not * incur network level completion costs */ rc = MCA_PML_CALL(isend(NULL, 0, MPI_INT, pair_comm_rank, tag, MCA_PML_BASE_SEND_STANDARD, comm, &(requests[0]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("ISend failed.")); return rc; } ++num_reqs; /* recive from partner */ rc = MCA_PML_CALL(irecv(NULL, 0, MPI_INT, pair_comm_rank, tag, comm, &(requests[1]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("IRecv failed.")); return rc; } ++num_reqs; PTPCOLL_VERBOSE(5, ("exchange - %d, pair_rank - %d, pair_comm_rank - %d", exchange, pair_rank, pair_comm_rank)); /* test for completion */ completed = mca_bcol_ptpcoll_test_all_for_match(&num_reqs, requests, &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for all failed.")); return rc; } if (!completed) { collreq->tag = tag; collreq->num_reqs = num_reqs; collreq->exchange = exchange + 1; assert(collreq->exchange >= 0); return BCOL_FN_STARTED; } delta <<= 1; /* delta *= 2 */ } if (PTPCOLL_PROXY == ptp_module->pow_2type) { /* send - let the extra rank know that we are done */ rc = MCA_PML_CALL(isend(NULL, 0, MPI_INT, my_extra_partner_comm_rank, tag, MCA_PML_BASE_SEND_STANDARD, comm, &(requests[0]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("ISend failed.")); return rc; } completed = mca_bcol_ptpcoll_test_for_match(&requests[0], &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for isend failed.")); return rc; } if (!completed) { collreq->tag = tag; collreq->num_reqs = 1; collreq->need_toserv_extra = 0; collreq->exchange = n_exchange; return BCOL_FN_STARTED; } } OMPI_FREE_LIST_RETURN_MT(&ptp_module->collreqs_free, (ompi_free_list_item_t *) collreq); return BCOL_FN_COMPLETE; }
static int bcol_ptpcoll_barrier_recurs_knomial_extra_new( bcol_function_args_t *input_args, struct coll_ml_function_t *const_args) { /* local variable */ uint64_t sequence_number; int rc, tag, pair_comm_rank, completed, num_reqs = 2; mca_bcol_ptpcoll_module_t *ptpcoll_module = (mca_bcol_ptpcoll_module_t *) const_args->bcol_module; netpatterns_k_exchange_node_t *my_exchange_node = &ptpcoll_module->knomial_exchange_tree; ompi_communicator_t *comm = ptpcoll_module->super.sbgp_partner_module->group_comm; int *extra_sources_array = my_exchange_node->rank_extra_sources_array; ompi_request_t **requests; ompi_free_list_item_t *item; mca_bcol_ptpcoll_collreq_t *collreq; OMPI_FREE_LIST_WAIT_MT(&ptpcoll_module->collreqs_free, item); if (OPAL_UNLIKELY(NULL == item)) { PTPCOLL_ERROR(("Free list waiting failed.")); return OMPI_ERR_OUT_OF_RESOURCE; } collreq = (mca_bcol_ptpcoll_collreq_t *) item; input_args->bcol_opaque_data = (void *) collreq; requests = collreq->requests; /* TAG Calculation */ sequence_number = input_args->sequence_num; /* Keep tag within the limit supportd by the pml */ tag = (PTPCOLL_TAG_OFFSET + sequence_number * PTPCOLL_TAG_FACTOR) & (ptpcoll_module->tag_mask); /* Mark this as a collective tag, to avoid conflict with user-level flags */ tag = -tag; pair_comm_rank = ptpcoll_module->super.sbgp_partner_module->group_list[extra_sources_array[0]]; rc = MCA_PML_CALL(isend( NULL, 0, MPI_INT, pair_comm_rank, tag, MCA_PML_BASE_SEND_STANDARD, comm, &(requests[0]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("ISend failed.")); return rc; } rc = MCA_PML_CALL(irecv( NULL, 0, MPI_INT, pair_comm_rank, tag, comm, &(requests[1]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("IRecv failed.")); return rc; } /* Test for completion */ completed = mca_bcol_ptpcoll_test_all_for_match(&num_reqs, requests, &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for all failed.")); return rc; } if (!completed) { return BCOL_FN_STARTED; } OMPI_FREE_LIST_RETURN_MT(&ptpcoll_module->collreqs_free, (ompi_free_list_item_t *) collreq); return BCOL_FN_COMPLETE; }
static int bcol_ptpcoll_barrier_recurs_knomial_new( bcol_function_args_t *input_args, struct coll_ml_function_t *const_args) { /* local variable */ uint64_t sequence_number; mca_bcol_ptpcoll_module_t *ptpcoll_module = (mca_bcol_ptpcoll_module_t *) const_args->bcol_module; netpatterns_k_exchange_node_t *my_exchange_node = &ptpcoll_module->knomial_exchange_tree; int rc, k, pair_comm_rank, exchange, completed, tree_order = my_exchange_node->tree_order, tag, n_extra_sources = my_exchange_node->n_extra_sources, n_exchange = my_exchange_node->n_exchanges, num_reqs; ompi_communicator_t *comm = ptpcoll_module->super.sbgp_partner_module->group_comm; int *extra_sources_array = NULL, **rank_exchanges = my_exchange_node->rank_exchanges; ompi_request_t **requests; ompi_free_list_item_t *item; mca_bcol_ptpcoll_collreq_t *collreq; OMPI_FREE_LIST_WAIT_MT(&ptpcoll_module->collreqs_free, item); if (OPAL_UNLIKELY(NULL == item)) { PTPCOLL_ERROR(("Free list waiting failed.")); return OMPI_ERR_OUT_OF_RESOURCE; } collreq = (mca_bcol_ptpcoll_collreq_t *) item; input_args->bcol_opaque_data = (void *) collreq; requests = collreq->requests; /* TAG Calculation */ sequence_number = input_args->sequence_num; /* Keep tag within the limit supportd by the pml */ tag = (PTPCOLL_TAG_OFFSET + sequence_number * PTPCOLL_TAG_FACTOR) & (ptpcoll_module->tag_mask); /* Mark this as a collective tag, to avoid conflict with user-level flags */ tag = -tag; if (0 < n_extra_sources) { /* EXCHANGE_NODE case */ collreq->need_toserv_extra = 1; extra_sources_array = my_exchange_node->rank_extra_sources_array; /* I will participate in the exchange (of the algorithm) - * wait for signal from extra process */ for (k = 0; k < n_extra_sources; ++k) { pair_comm_rank = ptpcoll_module->super.sbgp_partner_module->group_list[extra_sources_array[k]]; rc = MCA_PML_CALL(irecv( NULL, 0, MPI_INT, pair_comm_rank, tag, comm, &(requests[k]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("IRecv failed.")); return rc; } } num_reqs = n_extra_sources; /* Test for completion */ completed = mca_bcol_ptpcoll_test_all_for_match(&num_reqs, requests, &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for all failed.")); return rc; } if (!completed) { collreq->tag = tag; collreq->num_reqs = num_reqs; collreq->exchange = 0; return BCOL_FN_STARTED; } } else { collreq->need_toserv_extra = 0; } /* loop over exchange send/recv pairs */ for (exchange = 0; exchange < n_exchange; ++exchange) { for (k = 0; k < tree_order - 1; ++k) { /* rank of exchange partner within the group */ pair_comm_rank = ptpcoll_module->super.sbgp_partner_module->group_list[rank_exchanges[exchange][k]]; assert(2 * ptpcoll_module->k_nomial_radix > (k * 2 + 1)); /* send to partner - we will wait for completion, as send * completion is at the MPI level, and will not * incur network level completion costs */ rc = MCA_PML_CALL(isend( NULL, 0, MPI_INT, pair_comm_rank, tag, MCA_PML_BASE_SEND_STANDARD, comm, &(requests[k * 2 + 1]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("ISend failed.")); return rc; } PTPCOLL_VERBOSE(10, ("Ex %d, K %d send to %d[%d]", exchange, k, pair_comm_rank, rank_exchanges[exchange][k])); /* recive from partner */ rc = MCA_PML_CALL(irecv( NULL, 0, MPI_INT, pair_comm_rank, tag, comm, &(requests[k * 2]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("IRecv failed.")); return rc; } PTPCOLL_VERBOSE(10, ("Ex %d, K %d irecv from %d[%d]", exchange, k, pair_comm_rank, rank_exchanges[exchange][k])); } num_reqs = 2 * (tree_order - 1); /* Test for completion */ completed = mca_bcol_ptpcoll_test_all_for_match(&num_reqs, requests, &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for all failed.")); return rc; } if (!completed) { collreq->tag = tag; collreq->num_reqs = num_reqs; collreq->exchange = exchange + 1; return BCOL_FN_STARTED; } } /* If non power of 2, may need to send message to "extra" proc */ if (0 < n_extra_sources) { /* EXCHANGE_NODE case */ for (k = 0; k < n_extra_sources; ++k) { pair_comm_rank = ptpcoll_module->super.sbgp_partner_module->group_list[extra_sources_array[k]]; rc = MCA_PML_CALL(isend( NULL, 0, MPI_INT, pair_comm_rank, tag, MCA_PML_BASE_SEND_STANDARD, comm, &(requests[k]))); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("ISend failed.")); return rc; } } num_reqs = n_extra_sources; /* Test for completion */ completed = mca_bcol_ptpcoll_test_all_for_match(&num_reqs, requests, &rc); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { PTPCOLL_ERROR(("Test for all failed.")); return rc; } if (!completed) { collreq->tag = tag; collreq->num_reqs = num_reqs; collreq->exchange = n_exchange; collreq->need_toserv_extra = 0; return BCOL_FN_STARTED; } } OMPI_FREE_LIST_RETURN_MT(&ptpcoll_module->collreqs_free, (ompi_free_list_item_t *) collreq); return BCOL_FN_COMPLETE; }
static int mca_bcol_iboffload_bcast_init( bcol_function_args_t *fn_arguments, mca_bcol_iboffload_module_t *iboffload_module, mca_bcol_iboffload_collreq_t **coll_request, bool if_bcol_last, int mq_credits, collective_message_progress_function progress_fn) { ompi_free_list_item_t *item; mca_bcol_iboffload_collfrag_t *coll_fragment; mca_bcol_iboffload_component_t *cm = &mca_bcol_iboffload_component; int my_group_index = iboffload_module->super.sbgp_partner_module->my_index; OMPI_FREE_LIST_WAIT_MT(&cm->collreqs_free, item); if (OPAL_UNLIKELY(NULL == item)) { IBOFFLOAD_ERROR(("Wait for free list failed.\n")); return OMPI_ERR_OUT_OF_RESOURCE; } /* setup call request */ (*coll_request) = (mca_bcol_iboffload_collreq_t *) item; (*coll_request)->n_fragments = 0; (*coll_request)->n_frags_sent = 0; (*coll_request)->n_frag_mpi_complete = 0; (*coll_request)->n_frag_net_complete = 0; (*coll_request)->if_bcol_last = if_bcol_last; (*coll_request)->ml_buffer_index = fn_arguments->buffer_index; (*coll_request)->completion_cb_fn = NULL; (*coll_request)->buffer_info[SBUF].buf = (void *) ( (unsigned char *)fn_arguments->sbuf + fn_arguments->sbuf_offset); (*coll_request)->buffer_info[SBUF].offset = fn_arguments->sbuf_offset; (*coll_request)->buffer_info[RBUF].offset = fn_arguments->rbuf_offset; (*coll_request)->dtype = fn_arguments->dtype; (*coll_request)->count = fn_arguments->count; (*coll_request)->module = iboffload_module; /* TODO Pasha: we need it for pending quque. Set it later. */ (*coll_request)->progress_fn = progress_fn; /* TODO Pasha: fix it later */ (*coll_request)->qp_index = MCA_BCOL_IBOFFLOAD_QP_REGULAR; (*coll_request)->order_info = &fn_arguments->order_info; coll_fragment = &((*coll_request)->first_collfrag); mca_bcol_iboffload_collfrag_init(coll_fragment); /** Vasily ????? */ /* mq_credits = (*coll_request)->total_tasks_num; */ coll_fragment->mq_credits = mq_credits; coll_fragment->mq_index = COLL_MQ; /* Pasha: just set it to zero */ coll_fragment->last_wait_num = 0; coll_fragment->alg = -2; /* used only for debug */ /* if (my_rank == algthm_ptr->root) { coll_fragment->last_wait_num = 0; } else { coll_fragment->last_wait_num = algth_lst->last_wait_num; } */ /* Pasha: we have nothing to unpack */ coll_fragment->unpack_size = 0; /* coll_fragment->unpack_size = pack_len; */ /* coll_fragment->alg = RECURSIVE_DOUBLING_TREE_BCAST; */ /* set pointers for (coll frag) <-> (coll full request) */ (*coll_request)->user_handle_freed = false; fn_arguments->bcol_opaque_data = (void *) (*coll_request); if (true == fn_arguments->root_flag) { (*coll_request)->root = my_group_index; } else { (*coll_request)->root = fn_arguments->root_route->rank; } MCA_BCOL_IBOFFLOAD_SET_COLL_REQ_LINKS((*coll_request), coll_fragment); return OMPI_SUCCESS; }