int oshmem_proc_group_init(void) { int rc; rc = oshmem_group_cache_init(); if (OSHMEM_SUCCESS != rc) { return rc; } /* Setup communicator array */ OBJ_CONSTRUCT(&oshmem_group_array, opal_pointer_array_t); rc = opal_pointer_array_init(&oshmem_group_array, 0, ORTE_GLOBAL_ARRAY_MAX_SIZE, 1); if (OPAL_SUCCESS != rc) { goto err1; } /* Setup SHMEM_GROUP_ALL */ oshmem_group_all = oshmem_proc_group_create(0, 1, ompi_comm_size(oshmem_comm_world)); if (NULL == oshmem_group_all) { goto err2; } /* Setup SHMEM_GROUP_SELF */ oshmem_group_self = oshmem_proc_group_create(oshmem_proc_pe(oshmem_proc_local()), 0, 1); if (NULL == oshmem_group_self) { goto err3; } /* Setup SHMEM_GROUP_NULL */ oshmem_group_null = NULL; return OSHMEM_SUCCESS; err3: oshmem_proc_group_destroy_internal(oshmem_group_all, 1); err2: OBJ_DESTRUCT(&oshmem_group_array); err1: oshmem_group_cache_destroy(); return OSHMEM_ERROR; }
OSHMEM_DECLSPEC int oshmem_proc_group_init(void) { /* Setup communicator array */ OBJ_CONSTRUCT(&oshmem_group_array, opal_pointer_array_t); if (OPAL_SUCCESS != opal_pointer_array_init(&oshmem_group_array, 0, ORTE_GLOBAL_ARRAY_MAX_SIZE, 1)) { return OSHMEM_ERROR; } /* Setup SHMEM_GROUP_ALL */ if (NULL == (oshmem_group_all = oshmem_proc_group_create(0, 1, opal_list_get_size(&oshmem_proc_list)))) { oshmem_proc_group_destroy(oshmem_group_all); return OSHMEM_ERROR; } /* Setup SHMEM_GROUP_SELF */ if (NULL == (oshmem_group_self = oshmem_proc_group_create(oshmem_proc_local() ->proc_name .vpid, 0, 1))) { oshmem_proc_group_destroy(oshmem_group_self); return OSHMEM_ERROR; } /* Setup SHMEM_GROUP_NULL */ oshmem_group_null = NULL; return OSHMEM_SUCCESS; }
sshmem_mkey_t *mca_spml_yoda_register(void* addr, size_t size, uint64_t shmid, int *count) { int i; sshmem_mkey_t *mkeys; struct yoda_btl *ybtl; mca_spml_yoda_context_t* yoda_context; SPML_VERBOSE(10, "address %p len %llu", addr, (unsigned long long)size); *count = 0; /* make sure everything is initialized to 0 */ mkeys = (sshmem_mkey_t *) calloc(1, mca_spml_yoda.n_btls * sizeof(*mkeys)); if (!mkeys) { return NULL ; } mca_bml.bml_register( MCA_SPML_YODA_PUT, mca_yoda_put_callback, NULL ); mca_bml.bml_register( MCA_SPML_YODA_GET, mca_yoda_get_callback, NULL ); mca_bml.bml_register( MCA_SPML_YODA_GET_RESPONSE, mca_yoda_get_response_callback, NULL ); /* Register proc memory in every rdma BTL. */ for (i = 0; i < mca_spml_yoda.n_btls; i++) { ybtl = &mca_spml_yoda.btl_type_map[i]; mkeys[i].va_base = addr; mkeys[i].u.key = MAP_SEGMENT_SHM_INVALID; if (!ybtl->use_cnt) { SPML_VERBOSE(10, "%s: present but not in use. SKIP registration", btl_type2str(ybtl->btl_type)); continue; } /* If we have shared memory just save its id */ if ((YODA_BTL_SM == ybtl->btl_type || YODA_BTL_VADER == ybtl->btl_type) && MAP_SEGMENT_SHM_INVALID != (int)shmid) { mkeys[i].u.key = shmid; mkeys[i].va_base = 0; continue; } yoda_context = calloc(1, sizeof(*yoda_context)); mkeys[i].spml_context = yoda_context; yoda_context->registration = NULL; if (ybtl->btl->btl_flags & MCA_BTL_FLAGS_RDMA) { if (NULL != ybtl->btl->btl_register_mem) { yoda_context->registration = ybtl->btl->btl_register_mem (ybtl->btl, MCA_BTL_ENDPOINT_ANY, addr, size, MCA_BTL_REG_FLAG_ACCESS_ANY); if (NULL == yoda_context->registration) { SPML_ERROR("%s: failed to register source memory: addr: %p, size: %u", btl_type2str(ybtl->btl_type), addr, size); /* FIXME some cleanup might be needed here * yoda_context->btl_src_descriptor = NULL; * *count = ???; * free(spml_context); */ free(mkeys); return NULL; } } yoda_context->btl_src_descriptor = NULL; mkeys[i].u.data = yoda_context->registration; mkeys[i].len = yoda_context->registration ? ybtl->btl->btl_registration_handle_size : 0; } SPML_VERBOSE(5, "rank %d btl %s va_base: 0x%p len: %d key %llx size %llu", oshmem_proc_pe(oshmem_proc_local()), btl_type2str(ybtl->btl_type), mkeys[i].va_base, mkeys[i].len, (unsigned long long)mkeys[i].u.key, (unsigned long long)size); } *count = mca_spml_yoda.n_btls; return mkeys; }
sshmem_mkey_t *mca_spml_ikrit_register(void* addr, size_t size, uint64_t shmid, int *count) { int i; sshmem_mkey_t *mkeys; #if MXM_API >= MXM_VERSION(2,0) mxm_error_t err; mxm_mem_key_t *m_key; #endif *count = 0; mkeys = (sshmem_mkey_t *) calloc(1, MXM_PTL_LAST * sizeof(*mkeys)); if (!mkeys) { return NULL ; } for (i = 0; i < MXM_PTL_LAST; i++) { mkeys[i].u.key = MAP_SEGMENT_SHM_INVALID; switch (i) { case MXM_PTL_SHM: if ((int)shmid != MAP_SEGMENT_SHM_INVALID) { mkeys[i].u.key = shmid; mkeys[i].va_base = 0; } else { mkeys[i].len = 0; mkeys[i].va_base = addr; } mkeys[i].spml_context = 0; break; #if MXM_API < MXM_VERSION(2,0) case MXM_PTL_SELF: mkeys[i].len = 0; mkeys[i].spml_context = 0; mkeys[i].va_base = addr; break; #endif case MXM_PTL_RDMA: mkeys[i].va_base = addr; mkeys[i].spml_context = 0; #if MXM_API < MXM_VERSION(2,0) mkeys[i].len = 0; #else if (mca_spml_ikrit.ud_only) { mkeys[i].len = 0; break; } err = mxm_mem_map(mca_spml_ikrit.mxm_context, &addr, &size, 0, 0, 0); if (MXM_OK != err) { SPML_ERROR("Failed to register memory: %s", mxm_error_string(err)); goto error_out; } mkeys[i].spml_context = (void *)(unsigned long)size; m_key = malloc(sizeof(*m_key)); if (NULL == m_key) { SPML_ERROR("Failed to allocate m_key memory"); goto error_out; } mkeys[i].len = sizeof(*m_key); mkeys[i].u.data = m_key; err = mxm_mem_get_key(mca_spml_ikrit.mxm_context, addr, m_key); if (MXM_OK != err) { SPML_ERROR("Failed to get memory key: %s", mxm_error_string(err)); goto error_out; } #endif break; default: SPML_ERROR("unsupported PTL: %d", i); goto error_out; } SPML_VERBOSE(5, "rank %d ptl %d addr %p size %llu %s", oshmem_proc_pe(oshmem_proc_local()), i, addr, (unsigned long long)size, mca_spml_base_mkey2str(&mkeys[i])); } *count = MXM_PTL_LAST; return mkeys; error_out: mca_spml_ikrit_deregister(mkeys); return NULL; }
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; }