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; }
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; }