@@ -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+
108123UCS_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 }
0 commit comments