static void ucp_perf_test_free_mem(ucx_perf_context_t *perf) { free(perf->ucp.recv_iov); free(perf->ucp.send_iov); ucp_mem_unmap(perf->ucp.context, perf->ucp.recv_memh); ucp_mem_unmap(perf->ucp.context, perf->ucp.send_memh); }
static ucs_status_t ucp_perf_test_alloc_mem(ucx_perf_context_t *perf, ucx_perf_params_t *params) { ucs_status_t status; perf->send_buffer = NULL; status = ucp_mem_map(perf->ucp.context, &perf->send_buffer, params->message_size * params->thread_count, 0, &perf->ucp.send_memh); if (status != UCS_OK) { goto err; } perf->recv_buffer = NULL; status = ucp_mem_map(perf->ucp.context, &perf->recv_buffer, params->message_size * params->thread_count, 0, &perf->ucp.recv_memh); if (status != UCS_OK) { goto err_free_send_buffer; } return UCS_OK; err_free_send_buffer: ucp_mem_unmap(perf->ucp.context, perf->ucp.send_memh); err: return UCS_ERR_NO_MEMORY; }
int mca_spml_ucx_deregister(sshmem_mkey_t *mkeys) { spml_ucx_mkey_t *ucx_mkey; map_segment_t *mem_seg; int segno; int my_pe = oshmem_my_proc_id(); MCA_SPML_CALL(quiet(oshmem_ctx_default)); if (!mkeys) return OSHMEM_SUCCESS; if (!mkeys[0].spml_context) return OSHMEM_SUCCESS; mem_seg = memheap_find_va(mkeys[0].va_base); ucx_mkey = (spml_ucx_mkey_t*)mkeys[0].spml_context; if (OPAL_UNLIKELY(NULL == mem_seg)) { return OSHMEM_ERROR; } if (MAP_SEGMENT_ALLOC_UCX != mem_seg->type) { ucp_mem_unmap(mca_spml_ucx.ucp_context, ucx_mkey->mem_h); } ucp_rkey_destroy(ucx_mkey->rkey); ucx_mkey->rkey = NULL; if (0 < mkeys[0].len) { ucp_rkey_buffer_release(mkeys[0].u.data); } free(mkeys); return OSHMEM_SUCCESS; }
int ompi_osc_ucx_free(struct ompi_win_t *win) { ompi_osc_ucx_module_t *module = (ompi_osc_ucx_module_t*) win->w_osc_module; int i, ret = OMPI_SUCCESS; if ((module->epoch_type.access != NONE_EPOCH && module->epoch_type.access != FENCE_EPOCH) || module->epoch_type.exposure != NONE_EPOCH) { ret = OMPI_ERR_RMA_SYNC; } if (module->start_group != NULL || module->post_group != NULL) { ret = OMPI_ERR_RMA_SYNC; } assert(module->global_ops_num == 0); assert(module->lock_count == 0); assert(opal_list_is_empty(&module->pending_posts) == true); OBJ_DESTRUCT(&module->outstanding_locks); OBJ_DESTRUCT(&module->pending_posts); while (module->state.lock != TARGET_LOCK_UNLOCKED) { /* not sure if this is required */ ucp_worker_progress(mca_osc_ucx_component.ucp_worker); } ret = module->comm->c_coll->coll_barrier(module->comm, module->comm->c_coll->coll_barrier_module); for (i = 0; i < ompi_comm_size(module->comm); i++) { ucp_rkey_destroy((module->win_info_array[i]).rkey); ucp_rkey_destroy((module->state_info_array[i]).rkey); } free(module->win_info_array); free(module->state_info_array); free(module->per_target_ops_nums); ucp_mem_unmap(mca_osc_ucx_component.ucp_context, module->memh); ucp_mem_unmap(mca_osc_ucx_component.ucp_context, module->state_memh); if (module->disp_units) free(module->disp_units); ompi_comm_free(&module->comm); free(module); return ret; }
static inline int mem_map(void **base, size_t size, ucp_mem_h *memh_ptr, ompi_osc_ucx_module_t *module, int flavor) { ucp_mem_map_params_t mem_params; ucp_mem_attr_t mem_attrs; ucs_status_t status; int ret = OMPI_SUCCESS; assert(flavor == MPI_WIN_FLAVOR_ALLOCATE || flavor == MPI_WIN_FLAVOR_CREATE); memset(&mem_params, 0, sizeof(ucp_mem_map_params_t)); mem_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_ADDRESS | UCP_MEM_MAP_PARAM_FIELD_LENGTH | UCP_MEM_MAP_PARAM_FIELD_FLAGS; mem_params.length = size; if (flavor == MPI_WIN_FLAVOR_ALLOCATE) { mem_params.address = NULL; mem_params.flags = UCP_MEM_MAP_ALLOCATE; } else { mem_params.address = (*base); } /* memory map */ status = ucp_mem_map(mca_osc_ucx_component.ucp_context, &mem_params, memh_ptr); if (status != UCS_OK) { opal_output_verbose(1, ompi_osc_base_framework.framework_output, "%s:%d: ucp_mem_map failed: %d\n", __FILE__, __LINE__, status); ret = OMPI_ERROR; goto error; } mem_attrs.field_mask = UCP_MEM_ATTR_FIELD_ADDRESS | UCP_MEM_ATTR_FIELD_LENGTH; status = ucp_mem_query((*memh_ptr), &mem_attrs); if (status != UCS_OK) { opal_output_verbose(1, ompi_osc_base_framework.framework_output, "%s:%d: ucp_mem_query failed: %d\n", __FILE__, __LINE__, status); ret = OMPI_ERROR; goto error; } assert(mem_attrs.length >= size); if (flavor == MPI_WIN_FLAVOR_CREATE) { assert(mem_attrs.address == (*base)); } else { (*base) = mem_attrs.address; } return ret; error: ucp_mem_unmap(mca_osc_ucx_component.ucp_context, (*memh_ptr)); return ret; }
int mca_spml_ucx_deregister(sshmem_mkey_t *mkeys) { spml_ucx_mkey_t *ucx_mkey; MCA_SPML_CALL(fence()); if (!mkeys) return OSHMEM_SUCCESS; if (!mkeys[0].spml_context) return OSHMEM_SUCCESS; ucx_mkey = (spml_ucx_mkey_t *)mkeys[0].spml_context; ucp_mem_unmap(mca_spml_ucx.ucp_context, ucx_mkey->mem_h); if (0 < mkeys[0].len) { ucp_rkey_buffer_release(mkeys[0].u.data); } return OSHMEM_SUCCESS; }
static ucs_status_t ucp_perf_test_alloc_mem(ucx_perf_context_t *perf, ucx_perf_params_t *params) { ucs_status_t status; ucp_mem_map_params_t mem_map_params; ucp_mem_attr_t mem_attr; size_t buffer_size; if (params->iov_stride) { buffer_size = params->msg_size_cnt * params->iov_stride; } else { buffer_size = ucx_perf_get_message_size(params); } /* Allocate send buffer memory */ perf->send_buffer = NULL; mem_map_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_ADDRESS | UCP_MEM_MAP_PARAM_FIELD_LENGTH | UCP_MEM_MAP_PARAM_FIELD_FLAGS; mem_map_params.address = perf->send_buffer; mem_map_params.length = buffer_size * params->thread_count; mem_map_params.flags = (params->flags & UCX_PERF_TEST_FLAG_MAP_NONBLOCK) ? UCP_MEM_MAP_NONBLOCK : 0; mem_map_params.flags |= UCP_MEM_MAP_ALLOCATE; status = ucp_mem_map(perf->ucp.context, &mem_map_params, &perf->ucp.send_memh); if (status != UCS_OK) { goto err; } mem_attr.field_mask = UCP_MEM_ATTR_FIELD_ADDRESS; status = ucp_mem_query(perf->ucp.send_memh, &mem_attr); if (status != UCS_OK) { goto err; } perf->send_buffer = mem_attr.address; /* Allocate receive buffer memory */ perf->recv_buffer = NULL; mem_map_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_ADDRESS | UCP_MEM_MAP_PARAM_FIELD_LENGTH | UCP_MEM_MAP_PARAM_FIELD_FLAGS; mem_map_params.address = perf->recv_buffer; mem_map_params.length = buffer_size * params->thread_count; mem_map_params.flags = UCP_MEM_MAP_ALLOCATE; status = ucp_mem_map(perf->ucp.context, &mem_map_params, &perf->ucp.recv_memh); if (status != UCS_OK) { goto err_free_send_buffer; } mem_attr.field_mask = UCP_MEM_ATTR_FIELD_ADDRESS; status = ucp_mem_query(perf->ucp.recv_memh, &mem_attr); if (status != UCS_OK) { goto err_free_send_buffer; } perf->recv_buffer = mem_attr.address; /* Allocate IOV datatype memory */ perf->params.msg_size_cnt = params->msg_size_cnt; perf->ucp.send_iov = NULL; status = ucp_perf_test_alloc_iov_mem(params->ucp.send_datatype, perf->params.msg_size_cnt, params->thread_count, &perf->ucp.send_iov); if (UCS_OK != status) { goto err_free_buffers; } perf->ucp.recv_iov = NULL; status = ucp_perf_test_alloc_iov_mem(params->ucp.recv_datatype, perf->params.msg_size_cnt, params->thread_count, &perf->ucp.recv_iov); if (UCS_OK != status) { goto err_free_send_iov_buffers; } return UCS_OK; err_free_send_iov_buffers: free(perf->ucp.send_iov); err_free_buffers: ucp_mem_unmap(perf->ucp.context, perf->ucp.recv_memh); err_free_send_buffer: ucp_mem_unmap(perf->ucp.context, perf->ucp.send_memh); err: return UCS_ERR_NO_MEMORY; }
sshmem_mkey_t *mca_spml_ucx_register(void* addr, size_t size, uint64_t shmid, int *count) { sshmem_mkey_t *mkeys; ucs_status_t err; spml_ucx_mkey_t *ucx_mkey; size_t len; *count = 0; mkeys = (sshmem_mkey_t *) calloc(1, sizeof(*mkeys)); if (!mkeys) { return NULL ; } ucx_mkey = (spml_ucx_mkey_t *)malloc(sizeof(*ucx_mkey)); if (!ucx_mkey) { goto error_out; } mkeys[0].spml_context = ucx_mkey; err = ucp_mem_map(mca_spml_ucx.ucp_context, &addr, size, 0, &ucx_mkey->mem_h); if (UCS_OK != err) { goto error_out1; } err = ucp_rkey_pack(mca_spml_ucx.ucp_context, ucx_mkey->mem_h, &mkeys[0].u.data, &len); if (UCS_OK != err) { goto error_unmap; } if (len >= 0xffff) { SPML_ERROR("packed rkey is too long: %llu >= %d", (unsigned long long)len, 0xffff); oshmem_shmem_abort(-1); } err = ucp_ep_rkey_unpack(mca_spml_ucx.ucp_peers[oshmem_group_self->my_pe].ucp_conn, mkeys[0].u.data, &ucx_mkey->rkey); if (UCS_OK != err) { SPML_ERROR("failed to unpack rkey"); goto error_unmap; } mkeys[0].len = len; mkeys[0].va_base = addr; *count = 1; return mkeys; error_unmap: ucp_mem_unmap(mca_spml_ucx.ucp_context, ucx_mkey->mem_h); error_out1: free(ucx_mkey); error_out: free(mkeys); return NULL ; }
sshmem_mkey_t *mca_spml_ucx_register(void* addr, size_t size, uint64_t shmid, int *count) { sshmem_mkey_t *mkeys; ucs_status_t status; spml_ucx_mkey_t *ucx_mkey; size_t len; ucp_mem_map_params_t mem_map_params; int segno; map_segment_t *mem_seg; unsigned flags; int my_pe = oshmem_my_proc_id(); *count = 0; mkeys = (sshmem_mkey_t *) calloc(1, sizeof(*mkeys)); if (!mkeys) { return NULL; } segno = memheap_find_segnum(addr); mem_seg = memheap_find_seg(segno); ucx_mkey = &mca_spml_ucx_ctx_default.ucp_peers[my_pe].mkeys[segno].key; mkeys[0].spml_context = ucx_mkey; /* if possible use mem handle already created by ucx allocator */ if (MAP_SEGMENT_ALLOC_UCX != mem_seg->type) { flags = 0; if (mca_spml_ucx.heap_reg_nb && memheap_is_va_in_segment(addr, HEAP_SEG_INDEX)) { flags = UCP_MEM_MAP_NONBLOCK; } mem_map_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_ADDRESS | UCP_MEM_MAP_PARAM_FIELD_LENGTH | UCP_MEM_MAP_PARAM_FIELD_FLAGS; mem_map_params.address = addr; mem_map_params.length = size; mem_map_params.flags = flags; status = ucp_mem_map(mca_spml_ucx.ucp_context, &mem_map_params, &ucx_mkey->mem_h); if (UCS_OK != status) { goto error_out; } } else { ucx_mkey->mem_h = (ucp_mem_h)mem_seg->context; } status = ucp_rkey_pack(mca_spml_ucx.ucp_context, ucx_mkey->mem_h, &mkeys[0].u.data, &len); if (UCS_OK != status) { goto error_unmap; } if (len >= 0xffff) { SPML_UCX_ERROR("packed rkey is too long: %llu >= %d", (unsigned long long)len, 0xffff); oshmem_shmem_abort(-1); } status = ucp_ep_rkey_unpack(mca_spml_ucx_ctx_default.ucp_peers[oshmem_group_self->my_pe].ucp_conn, mkeys[0].u.data, &ucx_mkey->rkey); if (UCS_OK != status) { SPML_UCX_ERROR("failed to unpack rkey"); goto error_unmap; } mkeys[0].len = len; mkeys[0].va_base = addr; *count = 1; mca_spml_ucx_cache_mkey(&mca_spml_ucx_ctx_default, &mkeys[0], segno, my_pe); return mkeys; error_unmap: ucp_mem_unmap(mca_spml_ucx.ucp_context, ucx_mkey->mem_h); error_out: free(mkeys); return NULL ; }