/* * Open the component */ static int basesmuma_open(void) { /* local variables */ mca_bcol_basesmuma_component_t *cs = &mca_bcol_basesmuma_component; int ret = OMPI_SUCCESS; opal_mutex_t *mutex_ptr; int dummy; /* * Make sure that the number of banks is a power of 2 */ cs->basesmuma_num_mem_banks= roundup_to_power_radix(2,cs->basesmuma_num_mem_banks, &dummy); if ( 0 == cs->basesmuma_num_mem_banks ) { ret=OMPI_ERROR; goto ERROR; } /* * Make sure that the the number of buffers is a power of 2 */ cs->basesmuma_num_regions_per_bank= roundup_to_power_radix(2,cs->basesmuma_num_regions_per_bank, &dummy); if ( 0 == cs->basesmuma_num_regions_per_bank ) { ret=OMPI_ERROR; goto ERROR; } /* Portals initialization */ cs->portals_init = false; cs->portals_info = NULL; /* * initialization */ cs->sm_ctl_structs=NULL; OBJ_CONSTRUCT(&(cs->sm_connections_list),opal_list_t); OBJ_CONSTRUCT(&(cs->nb_admin_barriers),opal_list_t); mutex_ptr= &(cs->nb_admin_barriers_mutex); OBJ_CONSTRUCT(mutex_ptr, opal_mutex_t); /* Control structures object construct */ OBJ_CONSTRUCT(&(cs->ctl_structures), opal_list_t); /* shared memory has not been registered yet */ cs->mpool_inited = false; /* initialize base file names */ cs->clt_base_fname="sm_ctl_mem_"; cs->payload_base_fname="sm_payload_mem_"; /* initialize the size of the shared memory scartch region */ cs->my_scratch_shared_memory_size=getpagesize(); cs->my_scratch_shared_memory=NULL; cs->scratch_offset_from_base_ctl_file=0; /* * register the progess function */ ret=opal_progress_register(bcol_basesmuma_progress); if (MPI_SUCCESS != ret) { opal_output(0, "failed to register the progress function\n"); } return ret; ERROR: return ret; }
int base_bcol_basesmuma_setup_ctl_struct( mca_bcol_basesmuma_module_t *sm_bcol_module, mca_bcol_basesmuma_component_t *cs, sm_buffer_mgmt *ctl_mgmt) { int n_ctl, n_levels; int n_ctl_structs; size_t malloc_size; /* * set my no user-data conrol structures */ /* number of banks and regions per bank are already a power of 2 */ n_ctl_structs=cs->basesmuma_num_mem_banks* cs->basesmuma_num_regions_per_bank; /* initialize the control structure management struct - * for collectives without user data *--------------------------------------------------------------- */ ctl_mgmt->number_of_buffs=n_ctl_structs; ctl_mgmt->num_mem_banks= cs->basesmuma_num_mem_banks; ctl_mgmt->num_buffs_per_mem_bank= cs->basesmuma_num_regions_per_bank; ctl_mgmt->size_of_group= sm_bcol_module->super.sbgp_partner_module->group_size; roundup_to_power_radix(2,cs->basesmuma_num_regions_per_bank,&n_levels); ctl_mgmt->log2_num_buffs_per_mem_bank=n_levels; roundup_to_power_radix(2,n_ctl_structs,&n_levels); ctl_mgmt->log2_number_of_buffs=n_levels; ctl_mgmt->mask=n_ctl_structs-1; sm_bcol_module->super.n_poll_loops=cs->n_poll_loops; malloc_size= (ctl_mgmt->number_of_buffs + ctl_mgmt->num_mem_banks ) * ctl_mgmt->size_of_group * sizeof(void *); ctl_mgmt->ctl_buffs = malloc(malloc_size); if (!ctl_mgmt->ctl_buffs) { return OMPI_ERR_OUT_OF_RESOURCE; } /* * setup the no-data buffer managment data */ n_ctl = ctl_mgmt->num_mem_banks; ctl_mgmt->ctl_buffs_mgmt = (mem_bank_management_t *) calloc (n_ctl, sizeof (mem_bank_management_t)); if (!ctl_mgmt->ctl_buffs_mgmt) { opal_output (ompi_bcol_base_framework.framework_output, "Cannot allocate memory for ctl_buffs_mgmt"); free (ctl_mgmt->ctl_buffs); ctl_mgmt->ctl_buffs = NULL; return OMPI_ERR_OUT_OF_RESOURCE; } /* initialize each individual element */ for (int i = 0 ; i < n_ctl ; ++i) { opal_list_item_t *item; opal_mutex_t *mutex_ptr; ctl_mgmt->ctl_buffs_mgmt[i].available_buffers= ctl_mgmt->num_buffs_per_mem_bank; ctl_mgmt->ctl_buffs_mgmt[i].number_of_buffers= ctl_mgmt->num_buffs_per_mem_bank; mutex_ptr = &(ctl_mgmt->ctl_buffs_mgmt[i].mutex); OBJ_CONSTRUCT(mutex_ptr, opal_mutex_t); ctl_mgmt->ctl_buffs_mgmt[i].index_shared_mem_ctl_structs=i; item = (opal_list_item_t *)&(ctl_mgmt->ctl_buffs_mgmt[i].nb_barrier_desc); OBJ_CONSTRUCT(item, opal_list_item_t); ctl_mgmt->ctl_buffs_mgmt[i].nb_barrier_desc.sm_module = sm_bcol_module; ctl_mgmt->ctl_buffs_mgmt[i].nb_barrier_desc.pool_index = i; /* get the sm_buffer_mgmt pointer for the control structures */ ctl_mgmt->ctl_buffs_mgmt[i].nb_barrier_desc.coll_buff = ctl_mgmt; } return OMPI_SUCCESS; }