static int ompi_group_dense_overlap (ompi_group_t *group1, ompi_group_t *group2, opal_bitmap_t *bitmap) { ompi_proc_t *proc1_pointer, *proc2_pointer; int rc, overlap_count; overlap_count = 0; for (int proc1 = 0 ; proc1 < group1->grp_proc_count ; ++proc1) { proc1_pointer = ompi_group_get_proc_ptr_raw (group1, proc1); /* check to see if this proc is in group2 */ for (int proc2 = 0 ; proc2 < group2->grp_proc_count ; ++proc2) { proc2_pointer = ompi_group_get_proc_ptr_raw (group2, proc2); if( proc1_pointer == proc2_pointer ) { rc = opal_bitmap_set_bit (bitmap, proc2); if (OPAL_SUCCESS != rc) { return rc; } ++overlap_count; break; } } /* end proc1 loop */ } /* end proc loop */ return overlap_count; }
int ompi_group_incl_plist(ompi_group_t* group, int n, const int *ranks, ompi_group_t **new_group) { /* local variables */ int my_group_rank; ompi_group_t *group_pointer, *new_group_pointer; group_pointer = (ompi_group_t *)group; if ( 0 == n ) { *new_group = MPI_GROUP_EMPTY; OBJ_RETAIN(MPI_GROUP_EMPTY); return OMPI_SUCCESS; } /* get new group struct */ new_group_pointer=ompi_group_allocate(n); if( NULL == new_group_pointer ) { return MPI_ERR_GROUP; } /* put group elements in the list */ for (int proc = 0; proc < n; proc++) { new_group_pointer->grp_proc_pointers[proc] = ompi_group_get_proc_ptr_raw (group_pointer, ranks[proc]); } /* end proc loop */ /* increment proc reference counters */ ompi_group_increment_proc_count(new_group_pointer); /* find my rank */ my_group_rank=group_pointer->grp_my_rank; if (MPI_UNDEFINED != my_group_rank) { ompi_set_group_rank(new_group_pointer, ompi_proc_local_proc); } else { new_group_pointer->grp_my_rank = MPI_UNDEFINED; } *new_group = (MPI_Group)new_group_pointer; return OMPI_SUCCESS; }
bool ompi_group_have_remote_peers (ompi_group_t *group) { for (int i = 0 ; i < group->grp_proc_count ; ++i) { ompi_proc_t *proc = NULL; #if OMPI_GROUP_SPARSE proc = ompi_group_peer_lookup (group, i); #else proc = ompi_group_get_proc_ptr_raw (group, i); if (ompi_proc_is_sentinel (proc)) { /* the proc must be stored in the group or cached in the proc * hash table if the process resides in the local node * (see ompi_proc_complete_init) */ return true; } #endif if (!OPAL_PROC_ON_LOCAL_NODE(proc->super.proc_flags)) { return true; } } return false; }
int ompi_group_translate_ranks ( ompi_group_t *group1, int n_ranks, const int *ranks1, ompi_group_t *group2, int *ranks2) { if ( MPI_GROUP_EMPTY == group1 || MPI_GROUP_EMPTY == group2 ) { for (int proc = 0; proc < n_ranks ; ++proc) { ranks2[proc] = MPI_UNDEFINED; } return MPI_SUCCESS; } #if OMPI_GROUP_SPARSE /* * If we are translating from a parent to a child that uses the sparse format * or vice versa, we use the translate ranks function corresponding to the * format used. Generally, all these functions require less time than the * original method that loops over the processes of both groups till we * find a match. */ if( group1->grp_parent_group_ptr == group2 ) { /* from child to parent */ if(OMPI_GROUP_IS_SPORADIC(group1)) { return ompi_group_translate_ranks_sporadic_reverse (group1,n_ranks,ranks1,group2,ranks2); } else if(OMPI_GROUP_IS_STRIDED(group1)) { return ompi_group_translate_ranks_strided_reverse (group1,n_ranks,ranks1,group2,ranks2); } else if(OMPI_GROUP_IS_BITMAP(group1)) { return ompi_group_translate_ranks_bmap_reverse (group1,n_ranks,ranks1,group2,ranks2); } /* unknown sparse group type */ assert (0); } if( group2->grp_parent_group_ptr == group1 ) { /* from parent to child*/ if(OMPI_GROUP_IS_SPORADIC(group2)) { return ompi_group_translate_ranks_sporadic (group1,n_ranks,ranks1,group2,ranks2); } else if(OMPI_GROUP_IS_STRIDED(group2)) { return ompi_group_translate_ranks_strided (group1,n_ranks,ranks1,group2,ranks2); } else if(OMPI_GROUP_IS_BITMAP(group2)) { return ompi_group_translate_ranks_bmap (group1,n_ranks,ranks1,group2,ranks2); } /* unknown sparse group type */ assert (0); } #endif /* loop over all ranks */ for (int proc = 0; proc < n_ranks; ++proc) { struct ompi_proc_t *proc1_pointer, *proc2_pointer; int rank = ranks1[proc]; if ( MPI_PROC_NULL == rank) { ranks2[proc] = MPI_PROC_NULL; continue; } proc1_pointer = ompi_group_get_proc_ptr_raw (group1, rank); /* initialize to no "match" */ ranks2[proc] = MPI_UNDEFINED; for (int proc2 = 0; proc2 < group2->grp_proc_count; ++proc2) { proc2_pointer = ompi_group_get_proc_ptr_raw (group2, proc2); if ( proc1_pointer == proc2_pointer) { ranks2[proc] = proc2; break; } } /* end proc2 loop */ } /* end proc loop */ return MPI_SUCCESS; }
/* * Group Difference has to use the dense format since we don't support * two parent groups in the group structure and maintain functions */ int ompi_group_difference(ompi_group_t* group1, ompi_group_t* group2, ompi_group_t **new_group) { /* local varibles */ int new_group_size, overlap_count, rc; ompi_group_t *new_group_pointer; ompi_proc_t *proc1_pointer; opal_bitmap_t bitmap; /* * form union */ /* get new group size */ OBJ_CONSTRUCT(&bitmap, opal_bitmap_t); rc = opal_bitmap_init (&bitmap, 32); if (OPAL_SUCCESS != rc) { return rc; } /* check group2 elements to see if they need to be included in the list */ overlap_count = ompi_group_dense_overlap (group2, group1, &bitmap); if (0 > overlap_count) { OBJ_DESTRUCT(&bitmap); return overlap_count; } new_group_size = group1->grp_proc_count - overlap_count; if ( 0 == new_group_size ) { *new_group = MPI_GROUP_EMPTY; OBJ_RETAIN(MPI_GROUP_EMPTY); OBJ_DESTRUCT(&bitmap); return MPI_SUCCESS; } /* allocate a new ompi_group_t structure */ new_group_pointer = ompi_group_allocate(new_group_size); if( NULL == new_group_pointer ) { OBJ_DESTRUCT(&bitmap); return MPI_ERR_GROUP; } /* fill in group list */ /* loop over group1 members */ for (int proc1 = 0, cnt = 0 ; proc1 < group1->grp_proc_count ; ++proc1) { if (opal_bitmap_is_set_bit (&bitmap, proc1)) { continue; } proc1_pointer = ompi_group_get_proc_ptr_raw (group1, proc1); new_group_pointer->grp_proc_pointers[cnt++] = proc1_pointer; } /* end proc loop */ OBJ_DESTRUCT(&bitmap); /* increment proc reference counters */ ompi_group_increment_proc_count(new_group_pointer); /* find my rank */ if (MPI_UNDEFINED == group1->grp_my_rank || MPI_UNDEFINED != group2->grp_my_rank) { new_group_pointer->grp_my_rank = MPI_UNDEFINED; } else { ompi_set_group_rank(new_group_pointer, ompi_proc_local_proc); } *new_group = (MPI_Group)new_group_pointer; return OMPI_SUCCESS; }