192 строки
4.9 KiB
C
192 строки
4.9 KiB
C
/*
|
|
* Copyright (c) 2017 Mellanox Technologies, Inc.
|
|
* All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "oshmem_config.h"
|
|
|
|
#include "opal/constants.h"
|
|
#include "opal/util/output.h"
|
|
#include "opal/util/path.h"
|
|
#include "opal/util/show_help.h"
|
|
#include "orte/util/show_help.h"
|
|
|
|
#include "oshmem/proc/proc.h"
|
|
#include "oshmem/mca/sshmem/sshmem.h"
|
|
#include "oshmem/mca/sshmem/base/base.h"
|
|
#include "oshmem/util/oshmem_util.h"
|
|
#include "oshmem/mca/spml/ucx/spml_ucx.h"
|
|
|
|
#include "sshmem_ucx.h"
|
|
|
|
/* ////////////////////////////////////////////////////////////////////////// */
|
|
/*local functions */
|
|
/* local functions */
|
|
static int
|
|
module_init(void);
|
|
|
|
static int
|
|
segment_create(map_segment_t *ds_buf,
|
|
const char *file_name,
|
|
size_t size);
|
|
|
|
static void *
|
|
segment_attach(map_segment_t *ds_buf, sshmem_mkey_t *mkey);
|
|
|
|
static int
|
|
segment_detach(map_segment_t *ds_buf, sshmem_mkey_t *mkey);
|
|
|
|
static int
|
|
segment_unlink(map_segment_t *ds_buf);
|
|
|
|
static int
|
|
module_finalize(void);
|
|
|
|
/*
|
|
* ucx shmem module
|
|
*/
|
|
mca_sshmem_ucx_module_t mca_sshmem_ucx_module = {
|
|
/* super */
|
|
{
|
|
module_init,
|
|
segment_create,
|
|
segment_attach,
|
|
segment_detach,
|
|
segment_unlink,
|
|
module_finalize
|
|
}
|
|
};
|
|
|
|
static int
|
|
module_init(void)
|
|
{
|
|
/* nothing to do */
|
|
return OSHMEM_SUCCESS;
|
|
}
|
|
|
|
/* ////////////////////////////////////////////////////////////////////////// */
|
|
static int
|
|
module_finalize(void)
|
|
{
|
|
/* nothing to do */
|
|
return OSHMEM_SUCCESS;
|
|
}
|
|
|
|
/* ////////////////////////////////////////////////////////////////////////// */
|
|
|
|
static int
|
|
segment_create(map_segment_t *ds_buf,
|
|
const char *file_name,
|
|
size_t size)
|
|
{
|
|
int rc = OSHMEM_SUCCESS;
|
|
mca_spml_ucx_t *spml = (mca_spml_ucx_t *)mca_spml.self;
|
|
ucp_mem_map_params_t mem_map_params;
|
|
ucp_mem_h mem_h;
|
|
ucs_status_t status;
|
|
|
|
assert(ds_buf);
|
|
|
|
/* init the contents of map_segment_t */
|
|
shmem_ds_reset(ds_buf);
|
|
|
|
mem_map_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_ADDRESS |
|
|
UCP_MEM_MAP_PARAM_FIELD_LENGTH |
|
|
UCP_MEM_MAP_PARAM_FIELD_FLAGS;
|
|
/* TODO: use default base address */
|
|
mem_map_params.address = NULL;
|
|
mem_map_params.length = size;
|
|
mem_map_params.flags = 0;
|
|
if (spml->heap_reg_nb) {
|
|
mem_map_params.flags |= UCP_MEM_MAP_NONBLOCK;
|
|
}
|
|
|
|
status = ucp_mem_map(spml->ucp_context, &mem_map_params, &mem_h);
|
|
if (UCS_OK != status) {
|
|
rc = OSHMEM_ERROR;
|
|
goto out;
|
|
}
|
|
|
|
ds_buf->super.va_base = mem_map_params.address;
|
|
ds_buf->seg_size = size;
|
|
ds_buf->super.va_end = (void*)((uintptr_t)ds_buf->super.va_base + ds_buf->seg_size);
|
|
ds_buf->context = mem_h;
|
|
ds_buf->type = MAP_SEGMENT_ALLOC_UCX;
|
|
|
|
/* TODO: ucp_mem_advise when UCX has it */
|
|
|
|
out:
|
|
OPAL_OUTPUT_VERBOSE(
|
|
(70, oshmem_sshmem_base_framework.framework_output,
|
|
"%s: %s: create %s "
|
|
"(id: %d, addr: %p size: %lu)\n",
|
|
mca_sshmem_ucx_component.super.base_version.mca_type_name,
|
|
mca_sshmem_ucx_component.super.base_version.mca_component_name,
|
|
(rc ? "failure" : "successful"),
|
|
ds_buf->seg_id, ds_buf->super.va_base, (unsigned long)ds_buf->seg_size)
|
|
);
|
|
return rc;
|
|
}
|
|
|
|
static void *
|
|
segment_attach(map_segment_t *ds_buf, sshmem_mkey_t *mkey)
|
|
{
|
|
assert(ds_buf);
|
|
assert(mkey->va_base == 0);
|
|
|
|
OPAL_OUTPUT((oshmem_sshmem_base_framework.framework_output,
|
|
"can not attach to ucx segment"));
|
|
oshmem_shmem_abort(-1);
|
|
return NULL;
|
|
}
|
|
|
|
static int
|
|
segment_detach(map_segment_t *ds_buf, sshmem_mkey_t *mkey)
|
|
{
|
|
OPAL_OUTPUT_VERBOSE(
|
|
(70, oshmem_sshmem_base_framework.framework_output,
|
|
"%s: %s: detaching "
|
|
"(id: %d, addr: %p size: %lu)\n",
|
|
mca_sshmem_ucx_component.super.base_version.mca_type_name,
|
|
mca_sshmem_ucx_component.super.base_version.mca_component_name,
|
|
ds_buf->seg_id, ds_buf->super.va_base, (unsigned long)ds_buf->seg_size)
|
|
);
|
|
|
|
/* reset the contents of the map_segment_t associated with this
|
|
* shared memory segment.
|
|
*/
|
|
shmem_ds_reset(ds_buf);
|
|
|
|
return OSHMEM_SUCCESS;
|
|
}
|
|
|
|
static int
|
|
segment_unlink(map_segment_t *ds_buf)
|
|
{
|
|
mca_spml_ucx_t *spml = (mca_spml_ucx_t *)mca_spml.self;
|
|
|
|
assert(ds_buf);
|
|
|
|
ucp_mem_unmap(spml->ucp_context, (ucp_mem_h)ds_buf->context);
|
|
|
|
OPAL_OUTPUT_VERBOSE(
|
|
(70, oshmem_sshmem_base_framework.framework_output,
|
|
"%s: %s: unlinking "
|
|
"(id: %d, addr: %p size: %lu)\n",
|
|
mca_sshmem_ucx_component.super.base_version.mca_type_name,
|
|
mca_sshmem_ucx_component.super.base_version.mca_component_name,
|
|
ds_buf->seg_id, ds_buf->super.va_base, (unsigned long)ds_buf->seg_size)
|
|
);
|
|
|
|
ds_buf->seg_id = MAP_SEGMENT_SHM_INVALID;
|
|
MAP_SEGMENT_INVALIDATE(ds_buf);
|
|
|
|
return OSHMEM_SUCCESS;
|
|
}
|
|
|