int ompi_osc_pt2pt_module_post(ompi_group_t *group, int assert, ompi_win_t *win) { int i; ompi_osc_pt2pt_module_t *module = P2P_MODULE(win); OBJ_RETAIN(group); ompi_group_increment_proc_count(group); OPAL_THREAD_LOCK(&(module->p2p_lock)); assert(NULL == module->p2p_pw_group); module->p2p_pw_group = group; /* Set our mode to expose w/ post */ ompi_win_remove_mode(win, OMPI_WIN_FENCE); ompi_win_append_mode(win, OMPI_WIN_EXPOSE_EPOCH | OMPI_WIN_POSTED); /* list how many complete counters we're still waiting on */ module->p2p_num_complete_msgs += ompi_group_size(module->p2p_pw_group); OPAL_THREAD_UNLOCK(&(module->p2p_lock)); /* send a hello counter to everyone in group */ for (i = 0 ; i < ompi_group_size(module->p2p_pw_group) ; ++i) { ompi_osc_pt2pt_control_send(module, ompi_group_peer_lookup(group, i), OMPI_OSC_PT2PT_HDR_POST, 1, 0); } return OMPI_SUCCESS; }
int ompi_group_incl_bmap(ompi_group_t* group, int n, const int *ranks, ompi_group_t **new_group) { /* local variables */ int my_group_rank,i,bit_set; 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; } new_group_pointer = ompi_group_allocate_bmap(group->grp_proc_count, n); if( NULL == new_group_pointer ) { return MPI_ERR_GROUP; } /* Initialize the bit array to zeros */ for (i=0 ; i<new_group_pointer->sparse_data.grp_bitmap.grp_bitmap_array_len ; i++) { new_group_pointer-> sparse_data.grp_bitmap.grp_bitmap_array[i] = 0; } /* set the bits */ for (i=0 ; i<n ; i++) { bit_set = ranks[i] % BSIZE; new_group_pointer-> sparse_data.grp_bitmap.grp_bitmap_array[(int)(ranks[i]/BSIZE)] |= (1 << bit_set); } new_group_pointer -> grp_parent_group_ptr = group_pointer; OBJ_RETAIN(new_group_pointer -> grp_parent_group_ptr); ompi_group_increment_proc_count(new_group_pointer -> grp_parent_group_ptr); ompi_group_increment_proc_count(new_group_pointer); my_group_rank=group_pointer->grp_my_rank; ompi_group_translate_ranks (group_pointer,1,&my_group_rank, new_group_pointer,&new_group_pointer->grp_my_rank); *new_group = (MPI_Group)new_group_pointer; return OMPI_SUCCESS; }
int ompi_win_group(ompi_win_t *win, ompi_group_t **group) { OBJ_RETAIN(win->w_group); ompi_group_increment_proc_count(win->w_group); *group = win->w_group; return OMPI_SUCCESS; }
int ompi_group_incl_strided(ompi_group_t* group, int n, int *ranks, ompi_group_t **new_group) { /* local variables */ int my_group_rank,stride; 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; } stride = check_stride(ranks,n); new_group_pointer = ompi_group_allocate_strided(); if( NULL == new_group_pointer ) { return MPI_ERR_GROUP; } new_group_pointer -> grp_parent_group_ptr = group_pointer; OBJ_RETAIN(new_group_pointer -> grp_parent_group_ptr); ompi_group_increment_proc_count(new_group_pointer -> grp_parent_group_ptr); new_group_pointer -> sparse_data.grp_strided.grp_strided_stride = stride; new_group_pointer -> sparse_data.grp_strided.grp_strided_offset = ranks[0]; new_group_pointer -> sparse_data.grp_strided.grp_strided_last_element = ranks[n-1]; new_group_pointer -> grp_proc_count = n; ompi_group_increment_proc_count(new_group_pointer); my_group_rank = group_pointer->grp_my_rank; ompi_group_translate_ranks (new_group_pointer->grp_parent_group_ptr,1,&my_group_rank, new_group_pointer,&new_group_pointer->grp_my_rank); *new_group = (MPI_Group)new_group_pointer; return OMPI_SUCCESS; }
int ompi_group_incl_plist(ompi_group_t* group, int n, const int *ranks, ompi_group_t **new_group) { /* local variables */ int proc,my_group_rank; ompi_group_t *group_pointer, *new_group_pointer; ompi_proc_t *my_proc_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 (proc = 0; proc < n; proc++) { new_group_pointer->grp_proc_pointers[proc] = ompi_group_peer_lookup(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) { my_proc_pointer=ompi_group_peer_lookup (group_pointer,my_group_rank); ompi_set_group_rank(new_group_pointer,my_proc_pointer); } else { new_group_pointer->grp_my_rank = MPI_UNDEFINED; } *new_group = (MPI_Group)new_group_pointer; return OMPI_SUCCESS; }
static ompi_win_t * alloc_window(struct ompi_communicator_t *comm) { ompi_win_t *win; ompi_group_t *group; /* create the object */ win = OBJ_NEW(ompi_win_t); if (NULL == win) return NULL; /* setup data that is independent of osc component */ group = comm->c_local_group; OBJ_RETAIN(group); ompi_group_increment_proc_count(group); win->w_group = group; return win; }
ompi_group_t *ompi_group_allocate_plist_w_procs (ompi_proc_t **procs, int group_size) { /* local variables */ ompi_group_t * new_group = NULL; assert (group_size >= 0); /* create new group group element */ new_group = OBJ_NEW(ompi_group_t); if (NULL == new_group) { return NULL; } if (0 > new_group->grp_f_to_c_index) { OBJ_RELEASE (new_group); return NULL; } /* * Allocate array of (ompi_proc_t *)'s, one for each * process in the group. */ new_group->grp_proc_pointers = procs; /* set the group size */ new_group->grp_proc_count = group_size; /* initialize our rank to MPI_UNDEFINED */ new_group->grp_my_rank = MPI_UNDEFINED; OMPI_GROUP_SET_DENSE(new_group); ompi_group_increment_proc_count (new_group); return new_group; }
int ompi_win_create(void *base, size_t size, int disp_unit, ompi_communicator_t *comm, ompi_info_t *info, ompi_win_t** newwin) { ompi_win_t *win; ompi_group_t *group; int ret; /* create the object */ win = OBJ_NEW(ompi_win_t); if (NULL == win) return OMPI_ERR_TEMP_OUT_OF_RESOURCE; /* setup data that is independent of osc component */ group = comm->c_local_group; OBJ_RETAIN(group); ompi_group_increment_proc_count(group); win->w_group = group; win->w_baseptr = base; win->w_size = size; win->w_disp_unit = disp_unit; /* Fill in required attributes */ ret = ompi_attr_set_c(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_BASE, win->w_baseptr, true, true); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_SIZE, win->w_size, true, true); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win, &win->w_keyhash, MPI_WIN_DISP_UNIT, win->w_disp_unit, true, true); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } /* create backend onesided module for this window */ ret = ompi_osc_base_select(win, (ompi_info_t*) info, comm); if (OMPI_SUCCESS != ret) { OBJ_RELEASE(win); return ret; } /* fill in Fortran index */ win->w_f_to_c_index = ompi_pointer_array_add(&ompi_mpi_windows, win); if (-1 == win->w_f_to_c_index) { ompi_win_free(win); return OMPI_ERR_OUT_OF_RESOURCE; } *newwin = win; return OMPI_SUCCESS; }
int ompi_osc_pt2pt_module_start(ompi_group_t *group, int assert, ompi_win_t *win) { int i, ret = OMPI_SUCCESS; ompi_osc_pt2pt_module_t *module = P2P_MODULE(win); OBJ_RETAIN(group); ompi_group_increment_proc_count(group); OPAL_THREAD_LOCK(&(module->p2p_lock)); if (NULL != module->p2p_sc_group) { OPAL_THREAD_UNLOCK(&module->p2p_lock); ret = MPI_ERR_RMA_SYNC; goto cleanup; } module->p2p_sc_group = group; /* possible we've already received a couple in messages, so add however many we're going to wait for */ module->p2p_num_post_msgs += ompi_group_size(module->p2p_sc_group); OPAL_THREAD_UNLOCK(&(module->p2p_lock)); memset(module->p2p_sc_remote_active_ranks, 0, sizeof(bool) * ompi_comm_size(module->p2p_comm)); /* for each process in the specified group, find it's rank in our communicator, store those indexes, and set the true / false in the active ranks table */ for (i = 0 ; i < ompi_group_size(group) ; i++) { int comm_rank = -1, j; /* find the rank in the communicator associated with this windows */ for (j = 0 ; j < ompi_comm_size(module->p2p_comm) ; ++j) { if (ompi_group_peer_lookup(module->p2p_sc_group, i) == ompi_comm_peer_lookup(module->p2p_comm, j)) { comm_rank = j; break; } } if (comm_rank == -1) { ret = MPI_ERR_RMA_SYNC; goto cleanup; } module->p2p_sc_remote_active_ranks[comm_rank] = true; module->p2p_sc_remote_ranks[i] = comm_rank; } /* Set our mode to access w/ start */ ompi_win_remove_mode(win, OMPI_WIN_FENCE); ompi_win_append_mode(win, OMPI_WIN_ACCESS_EPOCH | OMPI_WIN_STARTED); return OMPI_SUCCESS; cleanup: ompi_group_decrement_proc_count(group); OBJ_RELEASE(group); return ret; }
/* * Group Union has to use the dense format since we don't support * two parent groups in the group structure and maintain functions */ int ompi_group_union (ompi_group_t* group1, ompi_group_t* group2, ompi_group_t **new_group) { /* local variables */ int new_group_size, proc1, proc2, found_in_group; int my_group_rank, cnt; ompi_group_t *group1_pointer, *group2_pointer, *new_group_pointer; ompi_proc_t *proc1_pointer, *proc2_pointer, *my_proc_pointer = NULL; group1_pointer = (ompi_group_t *) group1; group2_pointer = (ompi_group_t *) group2; /* * form union */ /* get new group size */ new_group_size = group1_pointer->grp_proc_count; /* check group2 elements to see if they need to be included in the list */ for (proc2 = 0; proc2 < group2_pointer->grp_proc_count; proc2++) { proc2_pointer = ompi_group_peer_lookup(group2_pointer,proc2); /* check to see if this proc2 is alread in the group */ found_in_group = 0; for (proc1 = 0; proc1 < group1_pointer->grp_proc_count; proc1++) { proc1_pointer = ompi_group_peer_lookup(group1_pointer,proc1); if (proc1_pointer == proc2_pointer) { /* proc2 is in group1 - don't double count */ found_in_group = 1; break; } } /* end proc1 loop */ if (found_in_group) { continue; } new_group_size++; } /* end proc loop */ if ( 0 == new_group_size ) { *new_group = MPI_GROUP_EMPTY; OBJ_RETAIN(MPI_GROUP_EMPTY); return MPI_SUCCESS; } /* get new group struct */ new_group_pointer = ompi_group_allocate(new_group_size); if (NULL == new_group_pointer) { return MPI_ERR_GROUP; } /* fill in the new group list */ /* put group1 elements in the list */ for (proc1 = 0; proc1 < group1_pointer->grp_proc_count; proc1++) { new_group_pointer->grp_proc_pointers[proc1] = ompi_group_peer_lookup(group1_pointer,proc1); } cnt = group1_pointer->grp_proc_count; /* check group2 elements to see if they need to be included in the list */ for (proc2 = 0; proc2 < group2_pointer->grp_proc_count; proc2++) { proc2_pointer = ompi_group_peer_lookup(group2_pointer,proc2); /* check to see if this proc2 is alread in the group */ found_in_group = 0; for (proc1 = 0; proc1 < group1_pointer->grp_proc_count; proc1++) { proc1_pointer = ompi_group_peer_lookup(group1_pointer,proc1); if (proc1_pointer == proc2_pointer) { /* proc2 is in group1 - don't double count */ found_in_group = 1; break; } } /* end proc1 loop */ if (found_in_group) { continue; } new_group_pointer->grp_proc_pointers[cnt] = ompi_group_peer_lookup(group2_pointer,proc2); cnt++; } /* end proc loop */ /* increment proc reference counters */ ompi_group_increment_proc_count(new_group_pointer); /* find my rank */ my_group_rank = group1_pointer->grp_my_rank; if (MPI_UNDEFINED == my_group_rank) { my_group_rank = group2_pointer->grp_my_rank; if ( MPI_UNDEFINED != my_group_rank) { my_proc_pointer = ompi_group_peer_lookup(group2_pointer,my_group_rank); } } else { my_proc_pointer = ompi_group_peer_lookup(group1_pointer,my_group_rank); } if ( MPI_UNDEFINED == my_group_rank ) { new_group_pointer->grp_my_rank = MPI_UNDEFINED; } else { ompi_set_group_rank(new_group_pointer, my_proc_pointer); } *new_group = (MPI_Group) new_group_pointer; return OMPI_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, proc1, proc2, found_in_group2, cnt; int my_group_rank; ompi_group_t *group1_pointer, *group2_pointer, *new_group_pointer; ompi_proc_t *proc1_pointer, *proc2_pointer, *my_proc_pointer = NULL; group1_pointer=(ompi_group_t *)group1; group2_pointer=(ompi_group_t *)group2; /* * form union */ /* get new group size */ new_group_size=0; /* loop over group1 members */ for( proc1=0; proc1 < group1_pointer->grp_proc_count; proc1++ ) { proc1_pointer = ompi_group_peer_lookup(group1_pointer,proc1); /* check to see if this proc is in group2 */ found_in_group2=0; for( proc2=0 ; proc2 < group2_pointer->grp_proc_count ; proc2++ ) { proc2_pointer = ompi_group_peer_lookup(group2_pointer,proc2); if( proc1_pointer == proc2_pointer ) { found_in_group2=true; break; } } /* end proc1 loop */ if(found_in_group2) { continue; } new_group_size++; } /* end proc loop */ if ( 0 == new_group_size ) { *new_group = MPI_GROUP_EMPTY; OBJ_RETAIN(MPI_GROUP_EMPTY); return MPI_SUCCESS; } /* allocate a new ompi_group_t structure */ new_group_pointer=ompi_group_allocate(new_group_size); if( NULL == new_group_pointer ) { return MPI_ERR_GROUP; } /* fill in group list */ cnt=0; /* loop over group1 members */ for( proc1=0; proc1 < group1_pointer->grp_proc_count; proc1++ ) { proc1_pointer = ompi_group_peer_lookup(group1_pointer,proc1); /* check to see if this proc is in group2 */ found_in_group2=0; for( proc2=0 ; proc2 < group2_pointer->grp_proc_count ; proc2++ ) { proc2_pointer = ompi_group_peer_lookup(group2_pointer,proc2); if( proc1_pointer == proc2_pointer ) { found_in_group2=true; break; } } /* end proc1 loop */ if(found_in_group2) { continue; } new_group_pointer->grp_proc_pointers[cnt] = ompi_group_peer_lookup(group1_pointer,proc1); cnt++; } /* end proc loop */ /* increment proc reference counters */ ompi_group_increment_proc_count(new_group_pointer); /* find my rank */ my_group_rank=group1_pointer->grp_my_rank; if ( MPI_UNDEFINED != my_group_rank ) { my_proc_pointer = ompi_group_peer_lookup(group1_pointer,my_group_rank); } else { my_group_rank=group2_pointer->grp_my_rank; if ( MPI_UNDEFINED != my_group_rank ) { my_proc_pointer = ompi_group_peer_lookup(group2_pointer,my_group_rank); } } if ( MPI_UNDEFINED == my_group_rank ) { new_group_pointer->grp_my_rank = MPI_UNDEFINED; } else { ompi_set_group_rank(new_group_pointer,my_proc_pointer); } *new_group = (MPI_Group)new_group_pointer; return OMPI_SUCCESS; }
/* * Initialize comm world/self/null/parent. */ int ompi_comm_init(void) { ompi_group_t *group; size_t size; /* Setup communicator array */ OBJ_CONSTRUCT(&ompi_mpi_communicators, opal_pointer_array_t); if( OPAL_SUCCESS != opal_pointer_array_init(&ompi_mpi_communicators, 0, OMPI_FORTRAN_HANDLE_MAX, 64) ) { return OMPI_ERROR; } /* Setup MPI_COMM_WORLD */ OBJ_CONSTRUCT(&ompi_mpi_comm_world, ompi_communicator_t); group = OBJ_NEW(ompi_group_t); group->grp_proc_pointers = ompi_proc_world(&size); group->grp_proc_count = (int)size; OMPI_GROUP_SET_INTRINSIC (group); OMPI_GROUP_SET_DENSE (group); ompi_set_group_rank(group, ompi_proc_local()); ompi_group_increment_proc_count (group); ompi_mpi_comm_world.comm.c_contextid = 0; ompi_mpi_comm_world.comm.c_id_start_index = 4; ompi_mpi_comm_world.comm.c_id_available = 4; ompi_mpi_comm_world.comm.c_f_to_c_index = 0; ompi_mpi_comm_world.comm.c_my_rank = group->grp_my_rank; ompi_mpi_comm_world.comm.c_local_group = group; ompi_mpi_comm_world.comm.c_remote_group = group; OBJ_RETAIN(ompi_mpi_comm_world.comm.c_remote_group); ompi_mpi_comm_world.comm.c_cube_dim = opal_cube_dim((int)size); ompi_mpi_comm_world.comm.error_handler = &ompi_mpi_errors_are_fatal.eh; OBJ_RETAIN( &ompi_mpi_errors_are_fatal.eh ); OMPI_COMM_SET_PML_ADDED(&ompi_mpi_comm_world.comm); opal_pointer_array_set_item (&ompi_mpi_communicators, 0, &ompi_mpi_comm_world); MEMCHECKER (memset (ompi_mpi_comm_world.comm.c_name, 0, MPI_MAX_OBJECT_NAME)); strncpy (ompi_mpi_comm_world.comm.c_name, "MPI_COMM_WORLD", strlen("MPI_COMM_WORLD")+1 ); ompi_mpi_comm_world.comm.c_flags |= OMPI_COMM_NAMEISSET; ompi_mpi_comm_world.comm.c_flags |= OMPI_COMM_INTRINSIC; /* We have to create a hash (although it is legal to leave this filed NULL -- the attribute accessor functions will intepret this as "there are no attributes cached on this object") because MPI_COMM_WORLD has some predefined attributes. */ ompi_attr_hash_init(&ompi_mpi_comm_world.comm.c_keyhash); /* Setup MPI_COMM_SELF */ OBJ_CONSTRUCT(&ompi_mpi_comm_self, ompi_communicator_t); group = OBJ_NEW(ompi_group_t); group->grp_proc_pointers = ompi_proc_self(&size); group->grp_my_rank = 0; group->grp_proc_count = (int)size; OMPI_GROUP_SET_INTRINSIC (group); OMPI_GROUP_SET_DENSE (group); ompi_mpi_comm_self.comm.c_contextid = 1; ompi_mpi_comm_self.comm.c_f_to_c_index = 1; ompi_mpi_comm_self.comm.c_id_start_index = 20; ompi_mpi_comm_self.comm.c_id_available = 20; ompi_mpi_comm_self.comm.c_my_rank = group->grp_my_rank; ompi_mpi_comm_self.comm.c_local_group = group; ompi_mpi_comm_self.comm.c_remote_group = group; OBJ_RETAIN(ompi_mpi_comm_self.comm.c_remote_group); ompi_mpi_comm_self.comm.error_handler = &ompi_mpi_errors_are_fatal.eh; OBJ_RETAIN( &ompi_mpi_errors_are_fatal.eh ); OMPI_COMM_SET_PML_ADDED(&ompi_mpi_comm_self.comm); opal_pointer_array_set_item (&ompi_mpi_communicators, 1, &ompi_mpi_comm_self); MEMCHECKER (memset (ompi_mpi_comm_self.comm.c_name, 0, MPI_MAX_OBJECT_NAME)); strncpy(ompi_mpi_comm_self.comm.c_name,"MPI_COMM_SELF",strlen("MPI_COMM_SELF")+1); ompi_mpi_comm_self.comm.c_flags |= OMPI_COMM_NAMEISSET; ompi_mpi_comm_self.comm.c_flags |= OMPI_COMM_INTRINSIC; /* We can set MPI_COMM_SELF's keyhash to NULL because it has no predefined attributes. If a user defines an attribute on MPI_COMM_SELF, the keyhash will automatically be created. */ ompi_mpi_comm_self.comm.c_keyhash = NULL; /* Setup MPI_COMM_NULL */ OBJ_CONSTRUCT(&ompi_mpi_comm_null, ompi_communicator_t); ompi_mpi_comm_null.comm.c_local_group = &ompi_mpi_group_null.group; ompi_mpi_comm_null.comm.c_remote_group = &ompi_mpi_group_null.group; OBJ_RETAIN(&ompi_mpi_group_null.group); OBJ_RETAIN(&ompi_mpi_group_null.group); ompi_mpi_comm_null.comm.c_contextid = 2; ompi_mpi_comm_null.comm.c_f_to_c_index = 2; ompi_mpi_comm_null.comm.c_my_rank = MPI_PROC_NULL; ompi_mpi_comm_null.comm.error_handler = &ompi_mpi_errors_are_fatal.eh; OBJ_RETAIN( &ompi_mpi_errors_are_fatal.eh ); opal_pointer_array_set_item (&ompi_mpi_communicators, 2, &ompi_mpi_comm_null); MEMCHECKER (memset (ompi_mpi_comm_null.comm.c_name, 0, MPI_MAX_OBJECT_NAME)); strncpy(ompi_mpi_comm_null.comm.c_name,"MPI_COMM_NULL",strlen("MPI_COMM_NULL")+1); ompi_mpi_comm_null.comm.c_flags |= OMPI_COMM_NAMEISSET; ompi_mpi_comm_null.comm.c_flags |= OMPI_COMM_INTRINSIC; /* Initialize the parent communicator to MPI_COMM_NULL */ ompi_mpi_comm_parent = &ompi_mpi_comm_null.comm; OBJ_RETAIN(&ompi_mpi_comm_null); OBJ_RETAIN(&ompi_mpi_group_null.group); OBJ_RETAIN(&ompi_mpi_errors_are_fatal.eh); /* initialize the comm_reg stuff for multi-threaded comm_cid allocation */ ompi_comm_reg_init(); return OMPI_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; }
int ompi_group_incl_spor(ompi_group_t* group, int n, int *ranks, ompi_group_t **new_group) { /* local variables */ int my_group_rank,l,i,j,proc_count; 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; } l=0; j=0; proc_count = 0; for(i=0 ; i<n ; i++){ if(ranks[i] == ranks[i-1]+1) { if(l==0) l++; } else l++; } new_group_pointer = ompi_group_allocate_sporadic(l); if( NULL == new_group_pointer ) { return MPI_ERR_GROUP; } new_group_pointer -> sparse_data.grp_sporadic.grp_sporadic_list[j].rank_first = ranks[0]; new_group_pointer -> sparse_data.grp_sporadic.grp_sporadic_list[j].length = 1; for(i=1 ; i<n ; i++){ if(ranks[i] == ranks[i-1]+1) { new_group_pointer -> sparse_data.grp_sporadic.grp_sporadic_list[j].length ++; } else { j++; new_group_pointer -> sparse_data.grp_sporadic.grp_sporadic_list[j].rank_first = ranks[i]; new_group_pointer -> sparse_data.grp_sporadic.grp_sporadic_list[j].length = 1; } } new_group_pointer->sparse_data.grp_sporadic.grp_sporadic_list_len = j+1; new_group_pointer -> grp_parent_group_ptr = group_pointer; OBJ_RETAIN(new_group_pointer -> grp_parent_group_ptr); ompi_group_increment_proc_count(new_group_pointer -> grp_parent_group_ptr); for(i=0 ; i<new_group_pointer->sparse_data.grp_sporadic.grp_sporadic_list_len ; i++) { proc_count = proc_count + new_group_pointer -> sparse_data.grp_sporadic.grp_sporadic_list[i].length; } new_group_pointer->grp_proc_count = proc_count; ompi_group_increment_proc_count(new_group_pointer); my_group_rank=group_pointer->grp_my_rank; ompi_group_translate_ranks (group_pointer,1,&my_group_rank, new_group_pointer,&new_group_pointer->grp_my_rank); *new_group = (MPI_Group)new_group_pointer; return OMPI_SUCCESS; }