Skip to content

Commit b2c910a

Browse files
authored
Merge pull request #11972 from roiedanino/v4.1.x/device-memory-alloc
v4.1.x - SSHMEM/UCX: DEVICE_NIC_MEM hint - implementation should use RDMA memory type
2 parents 547d0e4 + 61ccb13 commit b2c910a

File tree

4 files changed

+33
-114
lines changed

4 files changed

+33
-114
lines changed

config/ompi_check_ucx.m4

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ AC_DEFUN([OMPI_CHECK_UCX],[
139139
UCP_ATOMIC_FETCH_OP_FXOR,
140140
UCP_PARAM_FIELD_ESTIMATED_NUM_PPN,
141141
UCP_WORKER_FLAG_IGNORE_REQUEST_LEAK,
142-
UCP_OP_ATTR_FLAG_MULTI_SEND],
142+
UCP_OP_ATTR_FLAG_MULTI_SEND,
143+
UCS_MEMORY_TYPE_RDMA],
143144
[], [],
144145
[#include <ucp/api/ucp.h>])
145146
AC_CHECK_DECLS([UCP_WORKER_ATTR_FIELD_ADDRESS_FLAGS],

oshmem/mca/sshmem/ucx/configure.m4

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,9 @@ AC_DEFUN([MCA_oshmem_sshmem_ucx_CONFIG],[
2727
save_LIBS="$LIBS"
2828
save_CPPFLAGS="$CPPFLAGS"
2929
30-
alloc_dm_LDFLAGS=" -L$ompi_check_ucx_libdir/ucx"
31-
alloc_dm_LIBS=" -luct_ib"
3230
CPPFLAGS+=" $sshmem_ucx_CPPFLAGS"
33-
LDFLAGS+=" $sshmem_ucx_LDFLAGS $alloc_dm_LDFLAGS"
34-
LIBS+=" $sshmem_ucx_LIBS $alloc_dm_LIBS"
35-
36-
AC_LANG_PUSH([C])
37-
AC_LINK_IFELSE([AC_LANG_PROGRAM(
38-
[[
39-
#include <ucp/core/ucp_resource.h>
40-
#include <uct/ib/base/ib_alloc.h>
41-
]],
42-
[[
43-
uct_md_h md = ucp_context_find_tl_md((ucp_context_h)NULL, "");
44-
(void)uct_ib_md_alloc_device_mem(md, NULL, NULL, 0, "", NULL);
45-
uct_ib_md_release_device_mem(NULL);
46-
]])],
47-
[
48-
AC_MSG_NOTICE([UCX device memory allocation is supported])
49-
AC_DEFINE([HAVE_UCX_DEVICE_MEM], [1], [Support for device memory allocation])
50-
sshmem_ucx_LIBS+=" $alloc_dm_LIBS"
51-
sshmem_ucx_LDFLAGS+=" $alloc_dm_LDFLAGS"
52-
],
53-
[AC_MSG_NOTICE([UCX device memory allocation is not supported])])
54-
AC_LANG_POP([C])
31+
LDFLAGS+=" $sshmem_ucx_LDFLAGS"
32+
LIBS+=" $sshmem_ucx_LIBS"
5533
5634
CPPFLAGS="$save_CPPFLAGS"
5735
LDFLAGS="$save_LDFLAGS"
@@ -63,4 +41,3 @@ AC_DEFUN([MCA_oshmem_sshmem_ucx_CONFIG],[
6341
AC_SUBST([sshmem_ucx_LDFLAGS])
6442
AC_SUBST([sshmem_ucx_LIBS])
6543
])dnl
66-

oshmem/mca/sshmem/ucx/sshmem_ucx.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ OSHMEM_MODULE_DECLSPEC extern mca_sshmem_ucx_component_t
3535
mca_sshmem_ucx_component;
3636

3737
typedef struct mca_sshmem_ucx_segment_context {
38-
void *dev_mem;
3938
sshmem_ucx_shadow_allocator_t *shadow_allocator;
4039
ucp_mem_h ucp_memh;
4140
} mca_sshmem_ucx_segment_context_t;

oshmem/mca/sshmem/ucx/sshmem_ucx_module.c

Lines changed: 29 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,6 @@
2525

2626
#include "sshmem_ucx.h"
2727

28-
//#include <ucs/sys/math.h>
29-
30-
#if HAVE_UCX_DEVICE_MEM
31-
#include <ucp/core/ucp_resource.h>
32-
#include <uct/ib/base/ib_alloc.h>
33-
#endif
34-
3528
#define ALLOC_ELEM_SIZE sizeof(uint64_t)
3629
#define min(a,b) ((a) < (b) ? (a) : (b))
3730
#define max(a,b) ((a) > (b) ? (a) : (b))
@@ -103,7 +96,7 @@ static segment_allocator_t sshmem_ucx_allocator = {
10396

10497
static int
10598
segment_create_internal(map_segment_t *ds_buf, void *address, size_t size,
106-
unsigned flags, long hint, void *dev_mem)
99+
unsigned flags, ucs_memory_type_t mem_type, int err_level)
107100
{
108101
mca_sshmem_ucx_segment_context_t *ctx;
109102
int rc = OSHMEM_SUCCESS;
@@ -119,15 +112,19 @@ segment_create_internal(map_segment_t *ds_buf, void *address, size_t size,
119112

120113
mem_map_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_ADDRESS |
121114
UCP_MEM_MAP_PARAM_FIELD_LENGTH |
122-
UCP_MEM_MAP_PARAM_FIELD_FLAGS;
115+
UCP_MEM_MAP_PARAM_FIELD_FLAGS |
116+
UCP_MEM_MAP_PARAM_FIELD_MEMORY_TYPE;
123117

124-
mem_map_params.address = address;
125-
mem_map_params.length = size;
126-
mem_map_params.flags = flags;
118+
mem_map_params.address = address;
119+
mem_map_params.length = size;
120+
mem_map_params.flags = flags;
121+
mem_map_params.memory_type = mem_type;
127122

128123
status = ucp_mem_map(spml->ucp_context, &mem_map_params, &mem_h);
129124
if (UCS_OK != status) {
130-
SSHMEM_ERROR("ucp_mem_map() failed: %s\n", ucs_status_string(status));
125+
SSHMEM_VERBOSE(err_level, "ucp_mem_map(memory_type=%s) failed: %s\n",
126+
ucs_memory_type_names[mem_type],
127+
ucs_status_string(status));
131128
rc = OSHMEM_ERROR;
132129
goto out;
133130
}
@@ -160,12 +157,7 @@ segment_create_internal(map_segment_t *ds_buf, void *address, size_t size,
160157
ds_buf->super.va_end = (void*)((uintptr_t)ds_buf->super.va_base + ds_buf->seg_size);
161158
ds_buf->context = ctx;
162159
ds_buf->type = MAP_SEGMENT_ALLOC_UCX;
163-
ds_buf->alloc_hints = hint;
164160
ctx->ucp_memh = mem_h;
165-
ctx->dev_mem = dev_mem;
166-
if (hint) {
167-
ds_buf->allocator = &sshmem_ucx_allocator;
168-
}
169161

170162
out:
171163
OPAL_OUTPUT_VERBOSE(
@@ -180,81 +172,37 @@ segment_create_internal(map_segment_t *ds_buf, void *address, size_t size,
180172
return rc;
181173
}
182174

183-
#if HAVE_UCX_DEVICE_MEM
184-
static uct_ib_device_mem_h alloc_device_mem(mca_spml_ucx_t *spml, size_t size,
185-
void **address_p)
186-
{
187-
uct_ib_device_mem_h dev_mem = NULL;
188-
ucs_status_t status;
189-
uct_md_h uct_md;
190-
void *address;
191-
size_t length;
192-
193-
uct_md = ucp_context_find_tl_md(spml->ucp_context, "mlx5");
194-
if (uct_md == NULL) {
195-
SSHMEM_VERBOSE(1, "ucp_context_find_tl_md() returned NULL\n");
196-
return NULL;
197-
}
198-
199-
/* If found a matching memory domain, allocate device memory on it */
200-
length = size;
201-
address = NULL;
202-
status = uct_ib_md_alloc_device_mem(uct_md, &length, &address,
203-
UCT_MD_MEM_ACCESS_ALL, "sshmem_seg",
204-
&dev_mem);
205-
if (status != UCS_OK) {
206-
/* If could not allocate device memory - fallback to mmap (since some
207-
* PEs in the job may succeed and while others failed */
208-
SSHMEM_VERBOSE(1, "uct_ib_md_alloc_dm() failed: %s\n",
209-
ucs_status_string(status));
210-
return NULL;
211-
}
212-
213-
SSHMEM_VERBOSE(3, "uct_ib_md_alloc_dm() returned address %p\n", address);
214-
*address_p = address;
215-
return dev_mem;
216-
}
217-
#endif
218-
219175
static int
220176
segment_create(map_segment_t *ds_buf,
221177
const char *file_name,
222178
size_t size, long hint)
223179
{
224180
mca_spml_ucx_t *spml = (mca_spml_ucx_t*)mca_spml.self;
225-
unsigned flags;
181+
unsigned flags = UCP_MEM_MAP_ALLOCATE;
182+
int status;
226183

227-
#if HAVE_UCX_DEVICE_MEM
228-
int ret = OSHMEM_ERROR;
229184
if (hint & SHMEM_HINT_DEVICE_NIC_MEM) {
230-
if (size > UINT_MAX) {
231-
return OSHMEM_ERR_BAD_PARAM;
185+
#if HAVE_DECL_UCS_MEMORY_TYPE_RDMA
186+
status = segment_create_internal(ds_buf, NULL, size, flags,
187+
UCS_MEMORY_TYPE_RDMA, 3);
188+
if (status == OSHMEM_SUCCESS) {
189+
ds_buf->alloc_hints = hint;
190+
ds_buf->allocator = &sshmem_ucx_allocator;
191+
return OSHMEM_SUCCESS;
232192
}
233-
234-
void *dev_mem_address;
235-
uct_ib_device_mem_h dev_mem = alloc_device_mem(spml, size,
236-
&dev_mem_address);
237-
if (dev_mem != NULL) {
238-
ret = segment_create_internal(ds_buf, dev_mem_address, size, 0,
239-
hint, dev_mem);
240-
if (ret == OSHMEM_SUCCESS) {
241-
return OSHMEM_SUCCESS;
242-
} else if (dev_mem != NULL) {
243-
uct_ib_md_release_device_mem(dev_mem);
244-
/* fallback to regular allocation */
245-
}
246-
}
247-
}
193+
#else
194+
SSHMEM_VERBOSE(3, "DEVICE_NIC_MEM hint ignored since UCX does not "
195+
"support MEMORY_TYPE_RDMA");
248196
#endif
197+
return OSHMEM_ERR_NOT_IMPLEMENTED;
198+
}
249199

250-
flags = UCP_MEM_MAP_ALLOCATE | (spml->heap_reg_nb ? UCP_MEM_MAP_NONBLOCK : 0);
251-
if (hint) {
252-
return segment_create_internal(ds_buf, NULL, size, flags, hint, NULL);
253-
} else {
254-
return segment_create_internal(ds_buf, mca_sshmem_base_start_address,
255-
size, flags | UCP_MEM_MAP_FIXED, hint,
256-
NULL);
200+
flags |= UCP_MEM_MAP_FIXED;
201+
if (spml->heap_reg_nb) {
202+
flags |= UCP_MEM_MAP_NONBLOCK;
257203
}
204+
return segment_create_internal(ds_buf, mca_sshmem_base_start_address, size,
205+
flags, UCS_MEMORY_TYPE_HOST, 0);
258206
}
259207

260208
static void *
@@ -301,12 +249,6 @@ segment_unlink(map_segment_t *ds_buf)
301249

302250
ucp_mem_unmap(spml->ucp_context, ctx->ucp_memh);
303251

304-
#if HAVE_UCX_DEVICE_MEM
305-
if (ctx->dev_mem) {
306-
uct_ib_md_release_device_mem(ctx->dev_mem);
307-
}
308-
#endif
309-
310252
ds_buf->context = NULL;
311253
free(ctx);
312254

0 commit comments

Comments
 (0)