Skip to content

Commit fa7e9fb

Browse files
UCP/DEVICE: Add multi-lane support
1 parent 49a0d4c commit fa7e9fb

11 files changed

Lines changed: 125 additions & 270 deletions

File tree

src/ucp/api/device/ucp_device_impl.h

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,24 +105,37 @@ UCS_F_DEVICE void ucp_device_request_init(uct_device_ep_t *device_ep,
105105
})
106106

107107

108+
#define UCP_DEVICE_GET_LANE(_handle, _channel_id) \
109+
({ \
110+
unsigned _lane = _channel_id % _handle->num_lanes; \
111+
_channel_id /= _handle->num_lanes; \
112+
_lane; \
113+
})
114+
115+
116+
#define UCP_DEVICE_GET_ELEM(_handle, _index, _lane) \
117+
static_cast<ucs_typeof(_handle->mem_elements[0])*>( \
118+
UCS_PTR_BYTE_OFFSET(_handle->mem_elements, \
119+
((_index * _handle->num_lanes) + _lane) * \
120+
sizeof(_handle->mem_elements[0])))
121+
122+
108123
UCS_F_DEVICE ucs_status_t ucp_device_prepare_send_remote(
109124
const ucp_device_remote_mem_list_h dst_mem_list_h,
110-
unsigned dst_mem_list_index, uint64_t &remote_address,
125+
unsigned dst_mem_list_index, uint64_t &remote_address, unsigned lane,
111126
ucp_device_request_t *req, uct_device_ep_t *&device_ep,
112127
const uct_device_mem_element_t *&uct_elem,
113128
uct_device_completion_t *&comp)
114129
{
115-
const size_t elem_size = sizeof(uct_device_remote_mem_list_elem_t);
116130
ucs_status_t status;
117131

118132
status = ucp_device_check_params(dst_mem_list_h, dst_mem_list_index);
119133
if (status != UCS_OK) {
120134
return status;
121135
}
122136

123-
const auto dst_mem_element = static_cast<uct_device_remote_mem_list_elem_t*>(
124-
UCS_PTR_BYTE_OFFSET(dst_mem_list_h->mem_elements,
125-
dst_mem_list_index * elem_size));
137+
const auto dst_mem_element = UCP_DEVICE_GET_ELEM(dst_mem_list_h,
138+
dst_mem_list_index, lane);
126139
remote_address = dst_mem_element->addr;
127140
device_ep = dst_mem_element->device_ep;
128141
uct_elem = &dst_mem_element->uct_mem_element;
@@ -137,13 +150,12 @@ ucp_device_prepare_send(const ucp_device_local_mem_list_h src_mem_list_h,
137150
unsigned src_mem_list_index,
138151
const ucp_device_remote_mem_list_h dst_mem_list_h,
139152
unsigned dst_mem_list_index, const void *&address,
140-
uint64_t &remote_address, ucp_device_request_t *req,
141-
uct_device_ep_t *&device_ep,
153+
uint64_t &remote_address, unsigned lane,
154+
ucp_device_request_t *req, uct_device_ep_t *&device_ep,
142155
const uct_device_local_mem_list_elem_t *&src_uct_elem,
143156
const uct_device_mem_element_t *&uct_elem,
144157
uct_device_completion_t *&comp)
145158
{
146-
const size_t elem_size = sizeof(uct_device_local_mem_list_elem_t);
147159
ucs_status_t status;
148160

149161
status = ucp_device_check_params(src_mem_list_h, src_mem_list_index);
@@ -152,15 +164,14 @@ ucp_device_prepare_send(const ucp_device_local_mem_list_h src_mem_list_h,
152164
}
153165

154166
status = ucp_device_prepare_send_remote(dst_mem_list_h, dst_mem_list_index,
155-
remote_address, req, device_ep,
156-
uct_elem, comp);
167+
remote_address, lane, req,
168+
device_ep, uct_elem, comp);
157169
if (status != UCS_OK) {
158170
return status;
159171
}
160172

161-
src_uct_elem = static_cast<uct_device_local_mem_list_elem_t*>(
162-
UCS_PTR_BYTE_OFFSET(src_mem_list_h->mem_elements,
163-
src_mem_list_index * elem_size));
173+
src_uct_elem = UCP_DEVICE_GET_ELEM(src_mem_list_h, src_mem_list_index,
174+
lane);
164175
address = src_uct_elem->addr;
165176

166177
return UCS_OK;
@@ -212,6 +223,7 @@ ucp_device_put(const ucp_device_local_mem_list_h src_mem_list_h,
212223
unsigned dst_mem_list_index, size_t dst_offset, size_t length,
213224
unsigned channel_id, uint64_t flags, ucp_device_request_t *req)
214225
{
226+
const unsigned lane = UCP_DEVICE_GET_LANE(dst_mem_list_h, channel_id);
215227
const void *address;
216228
const uct_device_mem_element_t *uct_elem;
217229
const uct_device_local_mem_list_elem_t *src_uct_elem;
@@ -222,8 +234,8 @@ ucp_device_put(const ucp_device_local_mem_list_h src_mem_list_h,
222234

223235
status = ucp_device_prepare_send(src_mem_list_h, src_mem_list_index,
224236
dst_mem_list_h, dst_mem_list_index,
225-
address, remote_address, req, device_ep,
226-
src_uct_elem, uct_elem, comp);
237+
address, remote_address, lane, req,
238+
device_ep, src_uct_elem, uct_elem, comp);
227239
if (status != UCS_OK) {
228240
return status;
229241
}
@@ -274,15 +286,16 @@ UCS_F_DEVICE ucs_status_t ucp_device_counter_inc(
274286
unsigned mem_list_index, size_t offset, unsigned channel_id,
275287
uint64_t flags, ucp_device_request_t *req)
276288
{
289+
const unsigned lane = UCP_DEVICE_GET_LANE(mem_list_h, channel_id);
277290
uint64_t remote_address;
278291
const uct_device_mem_element_t *uct_elem;
279292
uct_device_completion_t *comp;
280293
uct_device_ep_t *device_ep;
281294
ucs_status_t status;
282295

283296
status = ucp_device_prepare_send_remote(mem_list_h, mem_list_index,
284-
remote_address, req, device_ep,
285-
uct_elem, comp);
297+
remote_address, lane, req,
298+
device_ep, uct_elem, comp);
286299
if (status != UCS_OK) {
287300
return status;
288301
}

src/ucp/api/device/ucp_device_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ typedef struct ucp_device_remote_mem_list {
3232
*/
3333
uint16_t version;
3434

35+
uint16_t num_lanes;
36+
3537
/**
3638
* Number of entries in the memory descriptors array @a elems.
3739
*/
@@ -61,6 +63,7 @@ typedef struct ucp_device_local_mem_list {
6163
*/
6264
uint16_t version;
6365

66+
uint16_t num_lanes;
6467
/**
6568
* Number of entries in the memory descriptors array @a elems.
6669
*/

0 commit comments

Comments
 (0)