OSHMEM_DECLSPEC oshmem_group_t* oshmem_proc_group_create(int pe_start, int pe_stride, size_t pe_size) { int cur_pe, count_pe; int i; oshmem_group_t* group = NULL; oshmem_proc_t** proc_array = NULL; oshmem_proc_t* proc = NULL; group = OBJ_NEW(oshmem_group_t); if (group) { cur_pe = 0; count_pe = 0; OPAL_THREAD_LOCK(&oshmem_proc_lock); /* allocate an array */ proc_array = (oshmem_proc_t**) malloc(pe_size * sizeof(oshmem_proc_t*)); if (NULL == proc_array) { OPAL_THREAD_UNLOCK(&oshmem_proc_lock); return NULL ; } group->my_pe = OSHMEM_PROC_VPID(oshmem_proc_local()); group->is_member = 0; /* now save only the procs that match this jobid */ for (proc = (oshmem_proc_t*) opal_list_get_first(&oshmem_proc_list); proc != (oshmem_proc_t*) opal_list_get_end(&oshmem_proc_list); proc = (oshmem_proc_t*) opal_list_get_next(proc)) { if (count_pe >= (int) pe_size) { break; } else if ((cur_pe >= pe_start) && ((pe_stride == 0) || (((cur_pe - pe_start) % pe_stride) == 0))) { proc_array[count_pe++] = proc; if (oshmem_proc_pe(proc) == group->my_pe) group->is_member = 1; } cur_pe++; } group->proc_array = proc_array; group->proc_count = (int) count_pe; group->ompi_comm = NULL; /* Prepare peers list */ OBJ_CONSTRUCT(&(group->peer_list), opal_list_t); { orte_namelist_t *peer = NULL; for (i = 0; i < group->proc_count; i++) { peer = OBJ_NEW(orte_namelist_t); peer->name.jobid = OSHMEM_PROC_JOBID(group->proc_array[i]); peer->name.vpid = OSHMEM_PROC_VPID(group->proc_array[i]); opal_list_append(&(group->peer_list), &peer->super); } } group->id = opal_pointer_array_add(&oshmem_group_array, group); memset(&group->g_scoll, 0, sizeof(mca_scoll_base_group_scoll_t)); if (OSHMEM_SUCCESS != mca_scoll_base_select(group)) { opal_output(0, "Error: No collective modules are available: group is not created, returning NULL"); oshmem_proc_group_destroy(group); OPAL_THREAD_UNLOCK(&oshmem_proc_lock); return NULL ; } OPAL_THREAD_UNLOCK(&oshmem_proc_lock); } return group; }
oshmem_group_t* oshmem_proc_group_create(int pe_start, int pe_stride, int pe_size) { int cur_pe, count_pe; int i; oshmem_group_t* group = NULL; ompi_proc_t** proc_array = NULL; ompi_proc_t* proc = NULL; assert(oshmem_proc_local()); group = oshmem_group_cache_find(pe_start, pe_stride, pe_size); if (NULL != group) { return group; } group = OBJ_NEW(oshmem_group_t); if (NULL == group) { return NULL; } cur_pe = 0; count_pe = 0; OPAL_THREAD_LOCK(&oshmem_proc_lock); /* allocate an array */ proc_array = (ompi_proc_t**) malloc(pe_size * sizeof(ompi_proc_t*)); if (NULL == proc_array) { OBJ_RELEASE(group); OPAL_THREAD_UNLOCK(&oshmem_proc_lock); return NULL ; } group->my_pe = oshmem_proc_pe(oshmem_proc_local()); group->is_member = 0; for (i = 0 ; i < ompi_comm_size(oshmem_comm_world) ; i++) { proc = oshmem_proc_find(i); if (NULL == proc) { opal_output(0, "Error: Can not find proc object for pe = %d", i); free(proc_array); OBJ_RELEASE(group); OPAL_THREAD_UNLOCK(&oshmem_proc_lock); return NULL; } if (count_pe >= (int) pe_size) { break; } else if ((cur_pe >= pe_start) && ((pe_stride == 0) || (((cur_pe - pe_start) % pe_stride) == 0))) { proc_array[count_pe++] = proc; if (oshmem_proc_pe(proc) == group->my_pe) group->is_member = 1; } cur_pe++; } group->proc_array = proc_array; group->proc_count = (int) count_pe; group->ompi_comm = NULL; /* Prepare peers list */ OBJ_CONSTRUCT(&(group->peer_list), opal_list_t); { orte_namelist_t *peer = NULL; for (i = 0; i < group->proc_count; i++) { peer = OBJ_NEW(orte_namelist_t); peer->name.jobid = OSHMEM_PROC_JOBID(group->proc_array[i]); peer->name.vpid = OSHMEM_PROC_VPID(group->proc_array[i]); opal_list_append(&(group->peer_list), &peer->super); } } group->id = opal_pointer_array_add(&oshmem_group_array, group); memset(&group->g_scoll, 0, sizeof(mca_scoll_base_group_scoll_t)); if (OSHMEM_SUCCESS != mca_scoll_base_select(group)) { opal_output(0, "Error: No collective modules are available: group is not created, returning NULL"); oshmem_proc_group_destroy_internal(group, 0); OPAL_THREAD_UNLOCK(&oshmem_proc_lock); return NULL; } if (OSHMEM_SUCCESS != oshmem_group_cache_insert(group, pe_start, pe_stride, pe_size)) { oshmem_proc_group_destroy_internal(group, 1); OPAL_THREAD_UNLOCK(&oshmem_proc_lock); return NULL; } OPAL_THREAD_UNLOCK(&oshmem_proc_lock); return group; }