int ompi_coll_base_alltoall_intra_pairwise(const void *sbuf, int scount, struct ompi_datatype_t *sdtype, void* rbuf, int rcount, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int line = -1, err = 0, rank, size, step, sendto, recvfrom; void * tmpsend, *tmprecv; ptrdiff_t lb, sext, rext; if (MPI_IN_PLACE == sbuf) { return mca_coll_base_alltoall_intra_basic_inplace (rbuf, rcount, rdtype, comm, module); } size = ompi_comm_size(comm); rank = ompi_comm_rank(comm); OPAL_OUTPUT((ompi_coll_base_framework.framework_output, "coll:base:alltoall_intra_pairwise rank %d", rank)); err = ompi_datatype_get_extent (sdtype, &lb, &sext); if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } err = ompi_datatype_get_extent (rdtype, &lb, &rext); if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } /* Perform pairwise exchange - starting from 1 so the local copy is last */ for (step = 1; step < size + 1; step++) { /* Determine sender and receiver for this step. */ sendto = (rank + step) % size; recvfrom = (rank + size - step) % size; /* Determine sending and receiving locations */ tmpsend = (char*)sbuf + (ptrdiff_t)sendto * sext * (ptrdiff_t)scount; tmprecv = (char*)rbuf + (ptrdiff_t)recvfrom * rext * (ptrdiff_t)rcount; /* send and receive */ err = ompi_coll_base_sendrecv( tmpsend, scount, sdtype, sendto, MCA_COLL_BASE_TAG_ALLTOALL, tmprecv, rcount, rdtype, recvfrom, MCA_COLL_BASE_TAG_ALLTOALL, comm, MPI_STATUS_IGNORE, rank); if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } } return MPI_SUCCESS; err_hndl: OPAL_OUTPUT((ompi_coll_base_framework.framework_output, "%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, rank)); return err; }
/* * function - Retrieves graph topology information associated with a * communicator * * @param comm - communicator for group with graph structure (handle) * @param nodes - number of nodes in graph (integer) * @param nedges - number of edges in graph (integer) * * @retval MPI_SUCCESS * @retval MPI_ERR_TOPOLOGY * @retval MPI_ERR_COMM * @retval MPI_ERR_ARG */ int mca_topo_base_graphdims_get (ompi_communicator_t* comm, int *nodes, int *nedges) { mca_topo_base_comm_graph_2_2_0_t* graph = comm->c_topo->mtc.graph; *nodes = ompi_comm_size(comm); *nedges = graph->index[*nodes -1]; return MPI_SUCCESS; }
/** * We have delayed the initialization until the first send so that we know that * the MPI_COMM_WORLD (which is the only communicator we are interested on at * this point) is correctly initialized. */ static void initialize_monitoring( void ) { nbprocs = ompi_comm_size((ompi_communicator_t*)&ompi_mpi_comm_world); sent_data = (uint64_t*)calloc(nbprocs, sizeof(uint64_t)); messages_count = (uint64_t*)calloc(nbprocs, sizeof(uint64_t)); filtered_sent_data = (uint64_t*)calloc(nbprocs, sizeof(uint64_t)); filtered_messages_count = (uint64_t*)calloc(nbprocs, sizeof(uint64_t)); init_done = 1; }
/* All we want to do in this function is determine if the number of * jobids in the local and/or remote group is > 1. This tells us to * set the disconnect flag. We don't actually care what the true * number -is-, only that it is > 1 */ void ompi_dpm_base_mark_dyncomm (ompi_communicator_t *comm) { int i; int size, rsize; bool found=false; ompi_jobid_t thisjobid; ompi_group_t *grp=NULL; ompi_proc_t *proc = NULL; /* special case for MPI_COMM_NULL */ if ( comm == MPI_COMM_NULL ) { return; } size = ompi_comm_size (comm); rsize = ompi_comm_remote_size(comm); /* loop over all processes in local group and check for * a different jobid */ grp = comm->c_local_group; proc = ompi_group_peer_lookup(grp,0); thisjobid = ((ompi_process_name_t*)&proc->super.proc_name)->jobid; for (i=1; i< size; i++) { proc = ompi_group_peer_lookup(grp,i); if (thisjobid != ((ompi_process_name_t*)&proc->super.proc_name)->jobid) { /* at least one is different */ found = true; goto complete; } } /* if inter-comm, loop over all processes in remote_group * and see if any are different from thisjobid */ grp = comm->c_remote_group; for (i=0; i< rsize; i++) { proc = ompi_group_peer_lookup(grp,i); if (thisjobid != ((ompi_process_name_t*)&proc->super.proc_name)->jobid) { /* at least one is different */ found = true; break; } } complete: /* if a different jobid was found, set the disconnect flag*/ if (found) { ompi_comm_num_dyncomm++; OMPI_COMM_SET_DYNAMIC(comm); } return; }
int ompi_coll_base_barrier_intra_basic_linear(struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int i, err, rank, size, line; ompi_request_t** requests = NULL; rank = ompi_comm_rank(comm); size = ompi_comm_size(comm); /* All non-root send & receive zero-length message. */ if (rank > 0) { err = MCA_PML_CALL(send (NULL, 0, MPI_BYTE, 0, MCA_COLL_BASE_TAG_BARRIER, MCA_PML_BASE_SEND_STANDARD, comm)); if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } err = MCA_PML_CALL(recv (NULL, 0, MPI_BYTE, 0, MCA_COLL_BASE_TAG_BARRIER, comm, MPI_STATUS_IGNORE)); if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } /* The root collects and broadcasts the messages. */ else { requests = coll_base_comm_get_reqs(module->base_data, size); if( NULL == requests ) { err = OMPI_ERR_OUT_OF_RESOURCE; line = __LINE__; goto err_hndl; } for (i = 1; i < size; ++i) { err = MCA_PML_CALL(irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE, MCA_COLL_BASE_TAG_BARRIER, comm, &(requests[i]))); if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } err = ompi_request_wait_all( size-1, requests+1, MPI_STATUSES_IGNORE ); if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } requests = NULL; /* we're done the requests array is clean */ for (i = 1; i < size; ++i) { err = MCA_PML_CALL(send(NULL, 0, MPI_BYTE, i, MCA_COLL_BASE_TAG_BARRIER, MCA_PML_BASE_SEND_STANDARD, comm)); if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } } /* All done */ return MPI_SUCCESS; err_hndl: OPAL_OUTPUT( (ompi_coll_base_framework.framework_output,"%s:%4d\tError occurred %d, rank %2d", __FILE__, line, err, rank) ); if( NULL != requests ) ompi_coll_base_free_reqs(requests, size); return err; }
int ompi_coll_base_alltoallv_intra_pairwise(const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t *sdtype, void* rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int line = -1, err = 0, rank, size, step = 0, sendto, recvfrom; void *psnd, *prcv; ptrdiff_t sext, rext; if (MPI_IN_PLACE == sbuf) { return mca_coll_base_alltoallv_intra_basic_inplace (rbuf, rcounts, rdisps, rdtype, comm, module); } size = ompi_comm_size(comm); rank = ompi_comm_rank(comm); OPAL_OUTPUT((ompi_coll_base_framework.framework_output, "coll:base:alltoallv_intra_pairwise rank %d", rank)); ompi_datatype_type_extent(sdtype, &sext); ompi_datatype_type_extent(rdtype, &rext); /* Perform pairwise exchange starting from 1 since local exhange is done */ for (step = 0; step < size; step++) { /* Determine sender and receiver for this step. */ sendto = (rank + step) % size; recvfrom = (rank + size - step) % size; /* Determine sending and receiving locations */ psnd = (char*)sbuf + (ptrdiff_t)sdisps[sendto] * sext; prcv = (char*)rbuf + (ptrdiff_t)rdisps[recvfrom] * rext; /* send and receive */ err = ompi_coll_base_sendrecv( psnd, scounts[sendto], sdtype, sendto, MCA_COLL_BASE_TAG_ALLTOALLV, prcv, rcounts[recvfrom], rdtype, recvfrom, MCA_COLL_BASE_TAG_ALLTOALLV, comm, MPI_STATUS_IGNORE, rank); if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } } return MPI_SUCCESS; err_hndl: OPAL_OUTPUT((ompi_coll_base_framework.framework_output, "%s:%4d\tError occurred %d, rank %2d at step %d", __FILE__, line, err, rank, step)); (void)line; // silence compiler warning return err; }
ompi_dpm_base_disconnect_obj *ompi_dpm_base_disconnect_init ( ompi_communicator_t *comm) { ompi_dpm_base_disconnect_obj *obj=NULL; int ret; int i; obj = (ompi_dpm_base_disconnect_obj *) calloc(1,sizeof(ompi_dpm_base_disconnect_obj)); if ( NULL == obj ) { printf("Could not allocate disconnect object\n"); return NULL; } if ( OMPI_COMM_IS_INTER(comm) ) { obj->size = ompi_comm_remote_size (comm); } else { obj->size = ompi_comm_size (comm); } obj->comm = comm; obj->reqs = (ompi_request_t **) malloc(2*obj->size*sizeof(ompi_request_t *)); if ( NULL == obj->reqs ) { printf("Could not allocate request array for disconnect object\n"); free (obj); return NULL; } /* initiate all isend_irecvs. We use a dummy buffer stored on the object, since we are sending zero size messages anyway. */ for ( i=0; i < obj->size; i++ ) { ret = MCA_PML_CALL(irecv (&(obj->buf), 0, MPI_INT, i, OMPI_COMM_BARRIER_TAG, comm, &(obj->reqs[2*i]))); if ( OMPI_SUCCESS != ret ) { printf("dpm_base_disconnect_init: error %d in irecv to process %d\n", ret, i); free (obj->reqs); free (obj); return NULL; } ret = MCA_PML_CALL(isend (&(obj->buf), 0, MPI_INT, i, OMPI_COMM_BARRIER_TAG, MCA_PML_BASE_SEND_SYNCHRONOUS, comm, &(obj->reqs[2*i+1]))); if ( OMPI_SUCCESS != ret ) { printf("dpm_base_disconnect_init: error %d in isend to process %d\n", ret, i); free (obj->reqs); free (obj); return NULL; } } /* return handle */ return obj; }
/* * Another recursive doubling type algorithm, but in this case * we go up the tree and back down the tree. */ int ompi_coll_tuned_barrier_intra_tree(struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int rank, size, depth, err, jump, partner; rank = ompi_comm_rank(comm); size = ompi_comm_size(comm); OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_barrier_intra_tree %d", rank)); /* Find the nearest power of 2 of the communicator size. */ depth = opal_next_poweroftwo_inclusive(size); for (jump=1; jump<depth; jump<<=1) { partner = rank ^ jump; if (!(partner & (jump-1)) && partner < size) { if (partner > rank) { err = MCA_PML_CALL(recv (NULL, 0, MPI_BYTE, partner, MCA_COLL_BASE_TAG_BARRIER, comm, MPI_STATUS_IGNORE)); if (MPI_SUCCESS != err) return err; } else if (partner < rank) { err = MCA_PML_CALL(send (NULL, 0, MPI_BYTE, partner, MCA_COLL_BASE_TAG_BARRIER, MCA_PML_BASE_SEND_STANDARD, comm)); if (MPI_SUCCESS != err) return err; } } } depth >>= 1; for (jump = depth; jump>0; jump>>=1) { partner = rank ^ jump; if (!(partner & (jump-1)) && partner < size) { if (partner > rank) { err = MCA_PML_CALL(send (NULL, 0, MPI_BYTE, partner, MCA_COLL_BASE_TAG_BARRIER, MCA_PML_BASE_SEND_STANDARD, comm)); if (MPI_SUCCESS != err) return err; } else if (partner < rank) { err = MCA_PML_CALL(recv (NULL, 0, MPI_BYTE, partner, MCA_COLL_BASE_TAG_BARRIER, comm, MPI_STATUS_IGNORE)); if (MPI_SUCCESS != err) return err; } } } return MPI_SUCCESS; }
int ompi_coll_tuned_allgatherv_intra_dec_dynamic(const void *sbuf, int scount, struct ompi_datatype_t *sdtype, void* rbuf, const int *rcounts, const int *rdispls, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module; OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_allgatherv_intra_dec_dynamic")); if (tuned_module->com_rules[ALLGATHERV]) { /* We have file based rules: - calculate message size and other necessary information */ int comsize, i; int alg, faninout, segsize, ignoreme; size_t dsize, total_size; comsize = ompi_comm_size(comm); ompi_datatype_type_size (sdtype, &dsize); total_size = 0; for (i = 0; i < comsize; i++) { total_size += dsize * rcounts[i]; } alg = ompi_coll_tuned_get_target_method_params (tuned_module->com_rules[ALLGATHERV], total_size, &faninout, &segsize, &ignoreme); if (alg) { /* we have found a valid choice from the file based rules for this message size */ return ompi_coll_tuned_allgatherv_intra_do_this (sbuf, scount, sdtype, rbuf, rcounts, rdispls, rdtype, comm, module, alg, faninout, segsize); } } /* We do not have file based rules */ if (tuned_module->user_forced[ALLGATHERV].algorithm) { /* User-forced algorithm */ return ompi_coll_tuned_allgatherv_intra_do_this(sbuf, scount, sdtype, rbuf, rcounts, rdispls, rdtype, comm, module, tuned_module->user_forced[ALLGATHERV].algorithm, tuned_module->user_forced[ALLGATHERV].tree_fanout, tuned_module->user_forced[ALLGATHERV].segsize); } /* Use default decision */ return ompi_coll_tuned_allgatherv_intra_dec_fixed (sbuf, scount, sdtype, rbuf, rcounts, rdispls, rdtype, comm, module); }
/* * Invoked when there's a new communicator that has been created. * Look at the communicator and decide which set of functions and * priority we want to return. */ mca_coll_base_module_t * portals4_comm_query(struct ompi_communicator_t *comm, int *priority) { mca_coll_portals4_module_t *portals4_module; ptl_process_t *proc; /* For now, we don't support intercommunicators and we probably never should handle the single proc case, since there's the self module... */ if (OMPI_COMM_IS_INTER(comm) || ompi_comm_size(comm) < 2) { return NULL; } /* Make sure someone is populating the proc table, since we're not in a really good position to do so */ proc = ompi_proc_local()->proc_endpoints[OMPI_PROC_ENDPOINT_TAG_PORTALS4]; if (NULL == proc) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: Proc table not previously populated", __FILE__, __LINE__); return NULL; } /* check for logical addressing mode in the MTL */ if (0 == proc->phys.pid) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: proc->phys.pid==0, so mtl-portals4 is using logical addressing which coll-portals4 doesn't support. Disqualifying myself.", __FILE__, __LINE__); return NULL; } portals4_module = OBJ_NEW(mca_coll_portals4_module_t); if (NULL == portals4_module) return NULL; *priority = mca_coll_portals4_priority; portals4_module->coll_count = 0; portals4_module->super.coll_module_enable = portals4_module_enable; portals4_module->super.ft_event = NULL; portals4_module->super.coll_barrier = ompi_coll_portals4_barrier_intra; portals4_module->super.coll_ibarrier = ompi_coll_portals4_ibarrier_intra; portals4_module->super.coll_bcast = ompi_coll_portals4_bcast_intra; portals4_module->super.coll_ibcast = ompi_coll_portals4_ibcast_intra; portals4_module->super.coll_allreduce = ompi_coll_portals4_allreduce_intra; portals4_module->super.coll_iallreduce = ompi_coll_portals4_iallreduce_intra; portals4_module->super.coll_reduce = ompi_coll_portals4_reduce_intra; portals4_module->super.coll_ireduce = ompi_coll_portals4_ireduce_intra; return &(portals4_module->super); }
int mca_coll_ml_check_if_bcol_is_used(const char *bcol_name, const mca_coll_ml_module_t *ml_module, int topo_index) { int i, rc, hier, *ranks_in_comm, is_used = 0, comm_size = ompi_comm_size(ml_module->comm); int n_hier, tp , max_tp; const mca_coll_ml_topology_t *topo_info; ranks_in_comm = (int *) malloc(comm_size * sizeof(int)); if (OPAL_UNLIKELY(NULL == ranks_in_comm)) { ML_ERROR(("Memory allocation failed.")); ompi_mpi_abort(&ompi_mpi_comm_world.comm, MPI_ERR_NO_MEM, true); } for (i = 0; i < comm_size; ++i) { ranks_in_comm[i] = i; } if (COLL_ML_TOPO_MAX == topo_index) { tp = 0; max_tp = COLL_ML_TOPO_MAX; } else { tp = topo_index; max_tp = topo_index + 1; } for (; tp < max_tp; tp++) { topo_info = &ml_module->topo_list[tp]; n_hier = topo_info->n_levels; for (hier = 0; hier < n_hier; ++hier) { hierarchy_pairs *pair = &topo_info->component_pairs[hier]; mca_bcol_base_component_t *b_cm = pair->bcol_component; if(0 == strcmp(bcol_name, b_cm->bcol_version.mca_component_name)) { is_used = 1; break; } } } rc = comm_allreduce_pml(&is_used, &is_used, 1, MPI_INT, ompi_comm_rank(ml_module->comm), MPI_MAX, comm_size, ranks_in_comm, ml_module->comm); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { ML_ERROR(("comm_allreduce_pml failed.")); ompi_mpi_abort(&ompi_mpi_comm_world.comm, MPI_ERR_OP, true); } free(ranks_in_comm); return is_used; }
/* * Invoked when there's a new communicator that has been created. * Look at the communicator and decide which set of functions and * priority we want to return. */ mca_coll_base_module_t * mca_coll_sm_comm_query(struct ompi_communicator_t *comm, int *priority) { mca_coll_sm_module_t *sm_module; /* If we're intercomm, or if there's only one process in the communicator, or if not all the processes in the communicator are not on this node, then we don't want to run */ if (OMPI_COMM_IS_INTER(comm) || 1 == ompi_comm_size(comm) || ompi_group_have_remote_peers (comm->c_local_group)) { opal_output_verbose(10, ompi_coll_base_framework.framework_output, "coll:sm:comm_query (%d/%s): intercomm, comm is too small, or not all peers local; disqualifying myself", comm->c_contextid, comm->c_name); return NULL; } /* Get the priority level attached to this module. If priority is less * than or equal to 0, then the module is unavailable. */ *priority = mca_coll_sm_component.sm_priority; if (mca_coll_sm_component.sm_priority <= 0) { opal_output_verbose(10, ompi_coll_base_framework.framework_output, "coll:sm:comm_query (%d/%s): priority too low; disqualifying myself", comm->c_contextid, comm->c_name); return NULL; } sm_module = OBJ_NEW(mca_coll_sm_module_t); if (NULL == sm_module) { return NULL; } /* All is good -- return a module */ sm_module->super.coll_module_enable = sm_module_enable; sm_module->super.ft_event = mca_coll_sm_ft_event; sm_module->super.coll_allgather = NULL; sm_module->super.coll_allgatherv = NULL; sm_module->super.coll_allreduce = mca_coll_sm_allreduce_intra; sm_module->super.coll_alltoall = NULL; sm_module->super.coll_alltoallv = NULL; sm_module->super.coll_alltoallw = NULL; sm_module->super.coll_barrier = mca_coll_sm_barrier_intra; sm_module->super.coll_bcast = mca_coll_sm_bcast_intra; sm_module->super.coll_exscan = NULL; sm_module->super.coll_gather = NULL; sm_module->super.coll_gatherv = NULL; sm_module->super.coll_reduce = mca_coll_sm_reduce_intra; sm_module->super.coll_reduce_scatter = NULL; sm_module->super.coll_scan = NULL; sm_module->super.coll_scatter = NULL; sm_module->super.coll_scatterv = NULL; opal_output_verbose(10, ompi_coll_base_framework.framework_output, "coll:sm:comm_query (%d/%s): pick me! pick me!", comm->c_contextid, comm->c_name); return &(sm_module->super); }
int ompi_init_preconnect_mpi(void) { int comm_size = ompi_comm_size(MPI_COMM_WORLD); int comm_rank = ompi_comm_rank(MPI_COMM_WORLD); int param, next, prev, i, ret = OMPI_SUCCESS; struct ompi_request_t * requests[2]; char inbuf[1], outbuf[1]; const bool *value; param = mca_base_var_find("ompi", "mpi", NULL, "preconnect_mpi"); if (0 > param) return OMPI_SUCCESS; ret = mca_base_var_get_value(param, &value, NULL, NULL); if (OMPI_SUCCESS != ret || 0 == value[0]) { return OMPI_SUCCESS; } inbuf[0] = outbuf[0] = '\0'; /* Each iteration, every process sends to its neighbor i hops to the right and receives from its neighbor i hops to the left. Because send_complete is used, there will only ever be one outstanding send and one outstanding receive in the network at a time for any given process. This limits any "flooding" effect that can occur with other connection algorithms. While the flooding algorithms may be a more efficient use of resources, they can overwhelm the out-of-band connection system used to wire up some networks, leading to poor performance and hangs. */ for (i = 1 ; i <= comm_size / 2 ; ++i) { next = (comm_rank + i) % comm_size; prev = (comm_rank - i + comm_size) % comm_size; ret = MCA_PML_CALL(isend(outbuf, 1, MPI_CHAR, next, 1, MCA_PML_BASE_SEND_COMPLETE, MPI_COMM_WORLD, &requests[1])); if (OMPI_SUCCESS != ret) return ret; ret = MCA_PML_CALL(irecv(inbuf, 1, MPI_CHAR, prev, 1, MPI_COMM_WORLD, &requests[0])); if(OMPI_SUCCESS != ret) return ret; ret = ompi_request_wait_all(2, requests, MPI_STATUSES_IGNORE); if (OMPI_SUCCESS != ret) return ret; } return ret; }
/* * gather_intra * * Function: - basic gather operation * Accepts: - same arguments as MPI_Gather() * Returns: - MPI_SUCCESS or error code */ int ompi_coll_base_gather_intra_basic_linear(const void *sbuf, int scount, struct ompi_datatype_t *sdtype, void *rbuf, int rcount, struct ompi_datatype_t *rdtype, int root, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int i, err, rank, size; char *ptmp; MPI_Aint incr, extent, lb; size = ompi_comm_size(comm); rank = ompi_comm_rank(comm); /* Everyone but root sends data and returns. */ OPAL_OUTPUT((ompi_coll_base_framework.framework_output, "ompi_coll_base_gather_intra_basic_linear rank %d", rank)); if (rank != root) { return MCA_PML_CALL(send(sbuf, scount, sdtype, root, MCA_COLL_BASE_TAG_GATHER, MCA_PML_BASE_SEND_STANDARD, comm)); } /* I am the root, loop receiving the data. */ ompi_datatype_get_extent(rdtype, &lb, &extent); incr = extent * (ptrdiff_t)rcount; for (i = 0, ptmp = (char *) rbuf; i < size; ++i, ptmp += incr) { if (i == rank) { if (MPI_IN_PLACE != sbuf) { err = ompi_datatype_sndrcv((void *)sbuf, scount, sdtype, ptmp, rcount, rdtype); } else { err = MPI_SUCCESS; } } else { err = MCA_PML_CALL(recv(ptmp, rcount, rdtype, i, MCA_COLL_BASE_TAG_GATHER, comm, MPI_STATUS_IGNORE)); } if (MPI_SUCCESS != err) { return err; } } /* All done */ return MPI_SUCCESS; }
/* * Invoked when there's a new communicator that has been created. * Look at the communicator and decide which set of functions and * priority we want to return. */ mca_coll_base_module_t * mca_coll_inter_comm_query(struct ompi_communicator_t *comm, int *priority) { int size, rsize; mca_coll_inter_module_t *inter_module; /* This module only works for inter-communicators */ if (!OMPI_COMM_IS_INTER(comm)) { return NULL; } /* Get the priority level attached to this module. If priority is less * than or equal to 0, then the module is unavailable. */ *priority = mca_coll_inter_priority_param; if (0 >= mca_coll_inter_priority_param) { return NULL; } size = ompi_comm_size(comm); rsize = ompi_comm_remote_size(comm); if ( size < mca_coll_inter_crossover && rsize < mca_coll_inter_crossover) { return NULL; } inter_module = OBJ_NEW(mca_coll_inter_module_t); if (NULL == inter_module) { return NULL; } inter_module->super.coll_module_enable = mca_coll_inter_module_enable; inter_module->super.ft_event = NULL; inter_module->super.coll_allgather = mca_coll_inter_allgather_inter; inter_module->super.coll_allgatherv = mca_coll_inter_allgatherv_inter; inter_module->super.coll_allreduce = mca_coll_inter_allreduce_inter; inter_module->super.coll_alltoall = NULL; inter_module->super.coll_alltoallv = NULL; inter_module->super.coll_alltoallw = NULL; inter_module->super.coll_barrier = NULL; inter_module->super.coll_bcast = mca_coll_inter_bcast_inter; inter_module->super.coll_exscan = NULL; inter_module->super.coll_gather = mca_coll_inter_gather_inter; inter_module->super.coll_gatherv = mca_coll_inter_gatherv_inter; inter_module->super.coll_reduce = mca_coll_inter_reduce_inter; inter_module->super.coll_reduce_scatter = NULL; inter_module->super.coll_scan = NULL; inter_module->super.coll_scatter = mca_coll_inter_scatter_inter; inter_module->super.coll_scatterv = mca_coll_inter_scatterv_inter; return &(inter_module->super); }
/* * Invoked when there's a new communicator that has been created. * Look at the communicator and decide which set of functions and * priority we want to return. */ mca_coll_base_module_t * mca_coll_fca_comm_query(struct ompi_communicator_t *comm, int *priority) { mca_coll_base_module_t *module; int size = ompi_comm_size(comm); int local_peers = 0; mca_coll_fca_module_t *fca_module; *priority = 0; module = NULL; if (!mca_coll_fca_component.fca_enable) goto exit; if (size < mca_coll_fca_component.fca_np) goto exit; if (!ompi_group_have_remote_peers(comm->c_local_group) || OMPI_COMM_IS_INTER(comm)) goto exit; fca_module = OBJ_NEW(mca_coll_fca_module_t); if (!fca_module) goto exit; fca_module->super.coll_module_enable = mca_coll_fca_module_enable; fca_module->super.ft_event = mca_coll_fca_ft_event; fca_module->super.coll_allgather = mca_coll_fca_component.fca_enable_allgather? mca_coll_fca_allgather : NULL; fca_module->super.coll_allgatherv = mca_coll_fca_component.fca_enable_allgatherv? mca_coll_fca_allgatherv : NULL; fca_module->super.coll_allreduce = mca_coll_fca_component.fca_enable_allreduce? mca_coll_fca_allreduce : NULL; fca_module->super.coll_alltoall = mca_coll_fca_component.fca_enable_alltoall? mca_coll_fca_alltoall : NULL; fca_module->super.coll_alltoallv = mca_coll_fca_component.fca_enable_alltoallv? mca_coll_fca_alltoallv : NULL; fca_module->super.coll_alltoallw = mca_coll_fca_component.fca_enable_alltoallw? mca_coll_fca_alltoallw : NULL; fca_module->super.coll_barrier = mca_coll_fca_component.fca_enable_barrier? mca_coll_fca_barrier : NULL; fca_module->super.coll_bcast = mca_coll_fca_component.fca_enable_bcast? mca_coll_fca_bcast : NULL; fca_module->super.coll_exscan = NULL; fca_module->super.coll_gather = mca_coll_fca_component.fca_enable_gather? mca_coll_fca_gather : NULL; fca_module->super.coll_gatherv = mca_coll_fca_component.fca_enable_gatherv? mca_coll_fca_gatherv : NULL; fca_module->super.coll_reduce = mca_coll_fca_component.fca_enable_reduce? mca_coll_fca_reduce : NULL; fca_module->super.coll_reduce_scatter = mca_coll_fca_component.fca_enable_reduce_scatter? mca_coll_fca_reduce_scatter : NULL; fca_module->super.coll_scan = NULL; fca_module->super.coll_scatter = NULL; fca_module->super.coll_scatterv = NULL; *priority = mca_coll_fca_component.fca_priority; module = &fca_module->super; exit: FCA_VERBOSE(4, "Query FCA module for comm %p size %d rank %d local_peers=%d: priority=%d %s", (void *)comm, size, ompi_comm_rank(comm), local_peers, *priority, module ? "enabled" : "disabled"); return module; }
/** * Fills local rank information in fca_module. */ static int __get_local_ranks(mca_coll_fca_module_t *fca_module) { ompi_communicator_t *comm = fca_module->comm; ompi_proc_t* proc; int i, rank; /* Count the local ranks */ fca_module->num_local_procs = 0; for (rank = 0; rank < ompi_comm_size(comm); ++rank) { proc = __local_rank_lookup(comm, rank); if (OPAL_PROC_ON_LOCAL_NODE(proc->super.proc_flags)) { if (rank == fca_module->rank) { fca_module->local_proc_idx = fca_module->num_local_procs; } ++fca_module->num_local_procs; } } /* Make a list of local ranks */ fca_module->local_ranks = calloc(fca_module->num_local_procs, sizeof *fca_module->local_ranks); if (!fca_module->local_ranks) { FCA_ERROR("Failed to allocate memory for %d local ranks", fca_module->num_local_procs); return OMPI_ERROR; } i = 0; for (rank = 0; rank < ompi_comm_size(comm); ++rank) { proc = __local_rank_lookup(comm, rank); if (OPAL_PROC_ON_LOCAL_NODE(proc->super.proc_flags)) { fca_module->local_ranks[i++] = rank; } } FCA_MODULE_VERBOSE(fca_module, 3, "i am %d/%d", fca_module->local_proc_idx, fca_module->num_local_procs); return OMPI_SUCCESS; }
/* * reduce_scatter_intra_dec * * Function: - seletects reduce_scatter algorithm to use * Accepts: - same arguments as MPI_Reduce_scatter() * Returns: - MPI_SUCCESS or error code (passed from * the reduce scatter implementation) * Note: If we detect zero valued counts in the rcounts array, we * fall back to the nonoverlapping algorithm because the other * algorithms do not currently handle it. */ int ompi_coll_tuned_reduce_scatter_intra_dec_fixed( void *sbuf, void *rbuf, int *rcounts, struct ompi_datatype_t *dtype, struct ompi_op_t *op, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int comm_size, i, pow2; size_t total_message_size, dsize; const double a = 0.0012; const double b = 8.0; const size_t small_message_size = 12 * 1024; const size_t large_message_size = 256 * 1024; bool zerocounts = false; OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_reduce_scatter_intra_dec_fixed")); comm_size = ompi_comm_size(comm); /* We need data size for decision function */ ompi_ddt_type_size(dtype, &dsize); total_message_size = 0; for (i = 0; i < comm_size; i++) { total_message_size += rcounts[i]; if (0 == rcounts[i]) { zerocounts = true; } } if( !ompi_op_is_commute(op) || (zerocounts)) { return ompi_coll_tuned_reduce_scatter_intra_nonoverlapping (sbuf, rbuf, rcounts, dtype, op, comm, module); } total_message_size *= dsize; /* compute the nearest power of 2 */ for (pow2 = 1; pow2 < comm_size; pow2 <<= 1); if ((total_message_size <= small_message_size) || ((total_message_size <= large_message_size) && (pow2 == comm_size)) || (comm_size >= a * total_message_size + b)) { return ompi_coll_tuned_reduce_scatter_intra_basic_recursivehalving(sbuf, rbuf, rcounts, dtype, op, comm, module); } return ompi_coll_tuned_reduce_scatter_intra_ring(sbuf, rbuf, rcounts, dtype, op, comm, module); }
/* * reduce_scatter_block * * Function: - reduce then scatter * Accepts: - same as MPI_Reduce_scatter_block() * Returns: - MPI_SUCCESS or error code * * Algorithm: * reduce and scatter (needs to be cleaned * up at some point) */ int mca_coll_cuda_reduce_scatter_block(const void *sbuf, void *rbuf, int rcount, struct ompi_datatype_t *dtype, struct ompi_op_t *op, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { mca_coll_cuda_module_t *s = (mca_coll_cuda_module_t*) module; ptrdiff_t gap; char *rbuf1 = NULL, *sbuf1 = NULL, *rbuf2 = NULL; const char *sbuf2; size_t sbufsize, rbufsize; int rc; rbufsize = opal_datatype_span(&dtype->super, rcount, &gap); sbufsize = rbufsize * ompi_comm_size(comm); if ((MPI_IN_PLACE != sbuf) && (opal_cuda_check_bufs((char *)sbuf, NULL))) { sbuf1 = (char*)malloc(sbufsize); if (NULL == sbuf1) { return OMPI_ERR_OUT_OF_RESOURCE; } opal_cuda_memcpy_sync(sbuf1, sbuf, sbufsize); sbuf2 = sbuf; /* save away original buffer */ sbuf = sbuf1 - gap; } if (opal_cuda_check_bufs(rbuf, NULL)) { rbuf1 = (char*)malloc(rbufsize); if (NULL == rbuf1) { if (NULL != sbuf1) free(sbuf1); return OMPI_ERR_OUT_OF_RESOURCE; } opal_cuda_memcpy_sync(rbuf1, rbuf, rbufsize); rbuf2 = rbuf; /* save away original buffer */ rbuf = rbuf1 - gap; } rc = s->c_coll.coll_reduce_scatter_block(sbuf, rbuf, rcount, dtype, op, comm, s->c_coll.coll_reduce_scatter_block_module); if (NULL != sbuf1) { free(sbuf1); } if (NULL != rbuf1) { rbuf = rbuf2; opal_cuda_memcpy_sync(rbuf, rbuf1, rbufsize); free(rbuf1); } return rc; }
int ompi_coll_tuned_allgatherv_intra_dec_fixed(void *sbuf, int scount, struct ompi_datatype_t *sdtype, void* rbuf, int *rcounts, int *rdispls, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int i; int communicator_size; size_t dsize, total_dsize; communicator_size = ompi_comm_size(comm); /* Special case for 2 processes */ if (communicator_size == 2) { return ompi_coll_tuned_allgatherv_intra_two_procs (sbuf, scount, sdtype, rbuf, rcounts, rdispls, rdtype, comm, module); } /* Determine complete data size */ ompi_ddt_type_size(sdtype, &dsize); total_dsize = 0; for (i = 0; i < communicator_size; i++) { total_dsize += dsize * rcounts[i]; } OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_allgatherv_intra_dec_fixed" " rank %d com_size %d msg_length %lu", ompi_comm_rank(comm), communicator_size, (unsigned long)total_dsize)); /* Decision based on allgather decision. */ if (total_dsize < 50000) { return ompi_coll_tuned_allgatherv_intra_bruck(sbuf, scount, sdtype, rbuf, rcounts, rdispls, rdtype, comm, module); } else { if (communicator_size % 2) { return ompi_coll_tuned_allgatherv_intra_ring(sbuf, scount, sdtype, rbuf, rcounts, rdispls, rdtype, comm, module); } else { return ompi_coll_tuned_allgatherv_intra_neighborexchange(sbuf, scount, sdtype, rbuf, rcounts, rdispls, rdtype, comm, module); } } }
static inline void mca_common_monitoring_coll_cache(mca_monitoring_coll_data_t*data) { int world_rank; if( NULL == data->comm_name && 0 < strlen(data->p_comm->c_name) ) { data->comm_name = strdup(data->p_comm->c_name); } else { mca_common_monitoring_coll_check_name(data); } if( -1 == data->world_rank ) { /* Get current process world_rank */ mca_common_monitoring_get_world_rank(ompi_comm_rank(data->p_comm), data->p_comm, &data->world_rank); } /* Only list procs if the hashtable is already initialized, ie if the previous call worked */ if( (-1 != data->world_rank) && (NULL == data->procs || 0 == strlen(data->procs)) ) { int i, pos = 0, size, world_size = -1, max_length; char*tmp_procs; size = ompi_comm_size(data->p_comm); world_size = ompi_comm_size((ompi_communicator_t*)&ompi_mpi_comm_world) - 1; assert( 0 < size ); /* Allocate enough space for list (add 1 to keep the final '\0' if already exact size) */ max_length = snprintf(NULL, 0, "%d,", world_size - 1) + 1; tmp_procs = malloc((1 + max_length * size) * sizeof(char)); if( NULL == tmp_procs ) { OPAL_MONITORING_PRINT_ERR("Cannot allocate memory for caching proc list."); } else { tmp_procs[0] = '\0'; /* Build procs list */ for(i = 0; i < size; ++i) { mca_common_monitoring_get_world_rank(i, data->p_comm, &world_rank); pos += sprintf(&tmp_procs[pos], "%d,", world_rank); } tmp_procs[pos - 1] = '\0'; /* Remove final coma */ data->procs = realloc(tmp_procs, pos * sizeof(char)); /* Adjust to size required */ } } }
int ompi_coll_tuned_allgather_intra_dec_dynamic(void *sbuf, int scount, struct ompi_datatype_t *sdtype, void* rbuf, int rcount, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module; mca_coll_tuned_comm_t *data = tuned_module->tuned_data; OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_allgather_intra_dec_dynamic")); if (data->com_rules[ALLGATHER]) { /* We have file based rules: - calculate message size and other necessary information */ int comsize; int alg, faninout, segsize, ignoreme; size_t dsize; ompi_datatype_type_size (sdtype, &dsize); comsize = ompi_comm_size(comm); dsize *= (ptrdiff_t)comsize * (ptrdiff_t)scount; alg = ompi_coll_tuned_get_target_method_params (data->com_rules[ALLGATHER], dsize, &faninout, &segsize, &ignoreme); if (alg) { /* we have found a valid choice from the file based rules for this message size */ return ompi_coll_tuned_allgather_intra_do_this (sbuf, scount, sdtype, rbuf, rcount, rdtype, comm, module, alg, faninout, segsize); } } /* We do not have file based rules */ if (data->user_forced[ALLGATHER].algorithm) { /* User-forced algorithm */ return ompi_coll_tuned_allgather_intra_do_forced (sbuf, scount, sdtype, rbuf, rcount, rdtype, comm, module); } /* Use default decision */ return ompi_coll_tuned_allgather_intra_dec_fixed (sbuf, scount, sdtype, rbuf, rcount, rdtype, comm, module); }
int ompi_osc_ucx_lock(int lock_type, int target, int assert, struct ompi_win_t *win) { ompi_osc_ucx_module_t *module = (ompi_osc_ucx_module_t *)win->w_osc_module; ompi_osc_ucx_lock_t *lock = NULL; ompi_osc_ucx_epoch_t original_epoch = module->epoch_type.access; int ret = OMPI_SUCCESS; if (module->lock_count == 0) { if (module->epoch_type.access != NONE_EPOCH && module->epoch_type.access != FENCE_EPOCH) { return OMPI_ERR_RMA_SYNC; } } else { ompi_osc_ucx_lock_t *item = NULL; assert(module->epoch_type.access == PASSIVE_EPOCH); opal_hash_table_get_value_uint32(&module->outstanding_locks, (uint32_t) target, (void **) &item); if (item != NULL) { return OMPI_ERR_RMA_SYNC; } } module->epoch_type.access = PASSIVE_EPOCH; module->lock_count++; assert(module->lock_count <= ompi_comm_size(module->comm)); lock = OBJ_NEW(ompi_osc_ucx_lock_t); lock->target_rank = target; if ((assert & MPI_MODE_NOCHECK) == 0) { lock->is_nocheck = false; if (lock_type == MPI_LOCK_EXCLUSIVE) { ret = start_exclusive(module, target); lock->type = LOCK_EXCLUSIVE; } else { ret = start_shared(module, target); lock->type = LOCK_SHARED; } } else { lock->is_nocheck = true; } if (ret == OMPI_SUCCESS) { opal_hash_table_set_value_uint32(&module->outstanding_locks, (uint32_t)target, (void *)lock); } else { OBJ_RELEASE(lock); module->epoch_type.access = original_epoch; } return ret; }
int ompi_coll_tuned_gather_intra_dec_dynamic(const void *sbuf, int scount, struct ompi_datatype_t *sdtype, void* rbuf, int rcount, struct ompi_datatype_t *rdtype, int root, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module; OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_gather_intra_dec_dynamic")); /** * check to see if we have some filebased rules. */ if (tuned_module->com_rules[GATHER]) { int comsize, alg, faninout, segsize, max_requests; size_t dsize; comsize = ompi_comm_size(comm); ompi_datatype_type_size (sdtype, &dsize); dsize *= comsize; alg = ompi_coll_tuned_get_target_method_params (tuned_module->com_rules[GATHER], dsize, &faninout, &segsize, &max_requests); if (alg) { /* we have found a valid choice from the file based rules for this message size */ return ompi_coll_tuned_gather_intra_do_this (sbuf, scount, sdtype, rbuf, rcount, rdtype, root, comm, module, alg, faninout, segsize); } /* found a method */ } /*end if any com rules to check */ if (tuned_module->user_forced[GATHER].algorithm) { return ompi_coll_tuned_gather_intra_do_this(sbuf, scount, sdtype, rbuf, rcount, rdtype, root, comm, module, tuned_module->user_forced[GATHER].algorithm, tuned_module->user_forced[GATHER].tree_fanout, tuned_module->user_forced[GATHER].segsize); } return ompi_coll_tuned_gather_intra_dec_fixed (sbuf, scount, sdtype, rbuf, rcount, rdtype, root, comm, module); }
int ompi_osc_sm_unlock_all(struct ompi_win_t *win) { ompi_osc_sm_module_t *module = (ompi_osc_sm_module_t*) win->w_osc_module; int ret, i, comm_size; comm_size = ompi_comm_size(module->comm); for (i = 0 ; i < comm_size ; ++i) { ret = ompi_osc_sm_unlock(i, win); if (OMPI_SUCCESS != ret) return ret; } return OMPI_SUCCESS; }
int ompi_coll_tuned_alltoall_intra_pairwise(void *sbuf, int scount, struct ompi_datatype_t *sdtype, void* rbuf, int rcount, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm) { int line = -1, err = 0; int rank, size, step; int sendto, recvfrom; void * tmpsend, *tmprecv; ptrdiff_t lb, sext, rext; size = ompi_comm_size(comm); rank = ompi_comm_rank(comm); OPAL_OUTPUT((ompi_coll_tuned_stream,"coll:tuned:alltoall_intra_pairwise rank %d", rank)); err = ompi_ddt_get_extent (sdtype, &lb, &sext); if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } err = ompi_ddt_get_extent (rdtype, &lb, &rext); if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } /* Perform pairwise exchange - starting from 1 so the local copy is last */ for (step = 1; step < size+1; step++) { /* who do we talk to in this step? */ sendto = (rank+step)%size; recvfrom = (rank+size-step)%size; /* where from are we sending and where from are we receiving actual data ? */ tmpsend = (char*)sbuf+sendto*sext*scount; tmprecv = (char*)rbuf+recvfrom*rext*rcount; /* send and receive */ err = ompi_coll_tuned_sendrecv( tmpsend, scount, sdtype, sendto, MCA_COLL_BASE_TAG_ALLTOALL, tmprecv, rcount, rdtype, recvfrom, MCA_COLL_BASE_TAG_ALLTOALL, comm, MPI_STATUS_IGNORE, rank); if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } } return MPI_SUCCESS; err_hndl: OPAL_OUTPUT((ompi_coll_tuned_stream,"%s:%4d\tError occurred %d, rank %2d", __FILE__,line,err,rank)); return err; }
int ompi_osc_sm_lock_all(int assert, struct ompi_win_t *win) { ompi_osc_sm_module_t *module = (ompi_osc_sm_module_t*) win->w_osc_module; int ret, i, comm_size; comm_size = ompi_comm_size(module->comm); for (i = 0 ; i < comm_size ; ++i) { ret = ompi_osc_sm_lock(MPI_LOCK_SHARED, i, assert, win); if (OMPI_SUCCESS != ret) return ret; } return OMPI_SUCCESS; }
int mca_pml_monitoring_get_messages_size (const struct mca_base_pvar_t *pvar, void *value, void *obj_handle) { ompi_communicator_t *comm = (ompi_communicator_t *) obj_handle; int comm_size = ompi_comm_size (comm); uint64_t *values = (uint64_t*) value; int i; if(comm != &ompi_mpi_comm_world.comm || NULL == sent_data) return OMPI_ERROR; for (i = 0 ; i < comm_size ; ++i) { values[i] = sent_data[i]; } return OMPI_SUCCESS; }
int MPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) { int i, size, err; MEMCHECKER( ptrdiff_t ext; size = ompi_comm_size(comm); ompi_ddt_type_extent(recvtype, &ext); memchecker_comm(comm); if(OMPI_COMM_IS_INTRA(comm)) { if(ompi_comm_rank(comm) == root) { memchecker_datatype(sendtype); /* check whether root's send buffer is defined. */ for (i = 0; i < size; i++) { memchecker_call(&opal_memchecker_base_isdefined, (char *)(sendbuf)+displs[i]*ext, sendcounts[i], sendtype); } if(MPI_IN_PLACE != recvbuf) { memchecker_datatype(recvtype); /* check whether receive buffer is addressable. */ memchecker_call(&opal_memchecker_base_isaddressable, recvbuf, recvcount, recvtype); } } else { memchecker_datatype(recvtype); /* check whether receive buffer is addressable. */ memchecker_call(&opal_memchecker_base_isaddressable, recvbuf, recvcount, recvtype); } } else { if(MPI_ROOT == root) { memchecker_datatype(sendtype); /* check whether root's send buffer is defined. */ for (i = 0; i < size; i++) { memchecker_call(&opal_memchecker_base_isdefined, (char *)(sendbuf)+displs[i]*ext, sendcounts[i], sendtype); } } else if (MPI_PROC_NULL != root) { /* check whether receive buffer is addressable. */ memchecker_call(&opal_memchecker_base_isaddressable, recvbuf, recvcount, recvtype); } } );
int ompi_coll_tuned_alltoall_intra_dec_dynamic(const void *sbuf, int scount, struct ompi_datatype_t *sdtype, void* rbuf, int rcount, struct ompi_datatype_t *rdtype, struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module; OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_alltoall_intra_dec_dynamic")); /* check to see if we have some filebased rules */ if (tuned_module->com_rules[ALLTOALL]) { /* we do, so calc the message size or what ever we need and use this for the evaluation */ int comsize; int alg, faninout, segsize, max_requests; size_t dsize; ompi_datatype_type_size (sdtype, &dsize); comsize = ompi_comm_size(comm); dsize *= (ptrdiff_t)comsize * (ptrdiff_t)scount; alg = ompi_coll_tuned_get_target_method_params (tuned_module->com_rules[ALLTOALL], dsize, &faninout, &segsize, &max_requests); if (alg) { /* we have found a valid choice from the file based rules for this message size */ return ompi_coll_tuned_alltoall_intra_do_this (sbuf, scount, sdtype, rbuf, rcount, rdtype, comm, module, alg, faninout, segsize, max_requests); } /* found a method */ } /*end if any com rules to check */ if (tuned_module->user_forced[ALLTOALL].algorithm) { return ompi_coll_tuned_alltoall_intra_do_this(sbuf, scount, sdtype, rbuf, rcount, rdtype, comm, module, tuned_module->user_forced[ALLTOALL].algorithm, tuned_module->user_forced[ALLTOALL].tree_fanout, tuned_module->user_forced[ALLTOALL].segsize, tuned_module->user_forced[ALLTOALL].max_requests); } return ompi_coll_tuned_alltoall_intra_dec_fixed (sbuf, scount, sdtype, rbuf, rcount, rdtype, comm, module); }