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 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; }