Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 18 additions & 21 deletions src/ucp/proto/proto_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ ucp_proto_common_get_frag_size(const ucp_proto_common_init_params_t *params,

/* Update 'perf' with the distance */
static void ucp_proto_common_update_lane_perf_by_distance(
ucp_proto_common_tl_perf_t *perf, ucp_proto_perf_node_t *perf_node,
ucp_proto_common_tl_perf_t *perf,
const ucs_sys_dev_distance_t *distance, const char *perf_name,
const char *perf_fmt, ...)
{
Expand All @@ -261,7 +261,7 @@ static void ucp_proto_common_update_lane_perf_by_distance(
sys_perf_node = ucp_proto_perf_node_new_data(perf_name, "%s",
perf_node_desc);
ucp_proto_perf_node_add_data(sys_perf_node, "", distance_func);
ucp_proto_perf_node_own_child(perf_node, &sys_perf_node);
ucp_proto_perf_node_own_child(perf->node, &sys_perf_node);
}

void ucp_proto_common_lane_perf_node(ucp_context_h context,
Expand Down Expand Up @@ -317,6 +317,7 @@ static void ucp_proto_common_tl_perf_reset(ucp_proto_common_tl_perf_t *tl_perf)
tl_perf->sys_latency = 0;
tl_perf->min_length = 0;
tl_perf->max_frag = SIZE_MAX;
tl_perf->node = NULL;
}

static void ucp_proto_common_perf_attr_set_mem_type(
Expand All @@ -337,15 +338,14 @@ static void ucp_proto_common_perf_attr_set_mem_type(
ucs_status_t
ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,
ucp_lane_index_t lane,
ucp_proto_common_tl_perf_t *tl_perf,
ucp_proto_perf_node_t **perf_node_p)
ucp_proto_common_tl_perf_t *tl_perf)
{
ucp_worker_h worker = params->super.worker;
ucp_context_h context = worker->context;
ucp_rsc_index_t rsc_index = ucp_proto_common_get_rsc_index(&params->super,
lane);
ucp_worker_iface_t *wiface = ucp_worker_iface(worker, rsc_index);
ucp_proto_perf_node_t *perf_node, *lane_perf_node;
ucp_proto_perf_node_t *lane_perf_node;
const ucp_rkey_config_t *rkey_config;
ucs_sys_dev_distance_t distance;
size_t tl_min_frag, tl_max_frag;
Expand All @@ -356,7 +356,6 @@ ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,

if (lane == UCP_NULL_LANE) {
ucp_proto_common_tl_perf_reset(tl_perf);
*perf_node_p = NULL;
return UCS_OK;
}

Expand All @@ -370,9 +369,9 @@ ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,
return UCS_ERR_INVALID_PARAM;
}

perf_node = ucp_proto_perf_node_new_data("lane", "%u ppn %u eps",
context->config.est_num_ppn,
context->config.est_num_eps);
tl_perf->node = ucp_proto_perf_node_new_data("lane", "%u ppn %u eps",
context->config.est_num_ppn,
context->config.est_num_eps);

perf_attr.field_mask = UCT_PERF_ATTR_FIELD_OPERATION |
UCT_PERF_ATTR_FIELD_SEND_PRE_OVERHEAD |
Expand Down Expand Up @@ -406,7 +405,7 @@ ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,

ucp_proto_common_lane_perf_node(context, rsc_index, &perf_attr,
&lane_perf_node);
ucp_proto_perf_node_own_child(perf_node, &lane_perf_node);
ucp_proto_perf_node_own_child(tl_perf->node, &lane_perf_node);

/* If reg_mem_info type is not unknown we assume the protocol is going to
* send that mem type in a zero copy fashion. So, need to consider the
Expand All @@ -423,7 +422,7 @@ ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,
ucp_proto_common_get_lane_distance(&params->super, lane, sys_dev,
&distance);
ucp_proto_common_update_lane_perf_by_distance(
tl_perf, perf_node, &distance, "local system", "%s %s",
tl_perf, &distance, "local system", "%s %s",
ucs_topo_sys_device_get_name(sys_dev),
ucs_topo_sys_device_bdf_name(sys_dev, bdf_name,
sizeof(bdf_name)));
Expand All @@ -437,7 +436,7 @@ ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,
rkey_config = &worker->rkey_config[params->super.rkey_cfg_index];
distance = rkey_config->lanes_distance[lane];
ucp_proto_common_update_lane_perf_by_distance(
tl_perf, perf_node, &distance, "remote system", "sys-dev %d %s",
tl_perf, &distance, "remote system", "sys-dev %d %s",
rkey_config->key.sys_dev,
ucs_memory_type_names[rkey_config->key.mem_type]);
}
Expand All @@ -451,20 +450,18 @@ ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,
params->hdr_size);
ucs_assert(tl_perf->sys_latency >= 0);

ucp_proto_perf_node_add_bandwidth(perf_node, "bw", tl_perf->bandwidth);
ucp_proto_perf_node_add_scalar(perf_node, "lat", tl_perf->latency);
ucp_proto_perf_node_add_scalar(perf_node, "sys-lat", tl_perf->sys_latency);
ucp_proto_perf_node_add_scalar(perf_node, "send-pre",
ucp_proto_perf_node_add_bandwidth(tl_perf->node, "bw", tl_perf->bandwidth);
ucp_proto_perf_node_add_scalar(tl_perf->node, "lat", tl_perf->latency);
ucp_proto_perf_node_add_scalar(tl_perf->node, "sys-lat", tl_perf->sys_latency);
ucp_proto_perf_node_add_scalar(tl_perf->node, "send-pre",
tl_perf->send_pre_overhead);
ucp_proto_perf_node_add_scalar(perf_node, "send-post",
ucp_proto_perf_node_add_scalar(tl_perf->node, "send-post",
tl_perf->send_post_overhead);
ucp_proto_perf_node_add_scalar(perf_node, "recv", tl_perf->recv_overhead);

*perf_node_p = perf_node;
ucp_proto_perf_node_add_scalar(tl_perf->node, "recv", tl_perf->recv_overhead);
return UCS_OK;

err_deref_perf_node:
ucp_proto_perf_node_deref(&perf_node);
ucp_proto_perf_node_deref(&tl_perf->node);
return status;
}

Expand Down
6 changes: 4 additions & 2 deletions src/ucp/proto/proto_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,9 @@ typedef struct {

/* Maximum single message length */
size_t max_frag;

/* Performance selection tree node */
ucp_proto_perf_node_t *node;
} ucp_proto_common_tl_perf_t;


Expand Down Expand Up @@ -279,8 +282,7 @@ void ucp_proto_common_lane_perf_node(ucp_context_h context,
ucs_status_t
ucp_proto_common_get_lane_perf(const ucp_proto_common_init_params_t *params,
ucp_lane_index_t lane,
ucp_proto_common_tl_perf_t *perf,
ucp_proto_perf_node_t **perf_node_p);
ucp_proto_common_tl_perf_t *perf);


typedef int (*ucp_proto_common_filter_lane_cb_t)(
Expand Down
8 changes: 3 additions & 5 deletions src/ucp/proto/proto_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ ucp_proto_init_skip_recv_overhead(const ucp_proto_common_init_params_t *params,
static ucs_status_t
ucp_proto_init_add_tl_perf(const ucp_proto_common_init_params_t *params,
const ucp_proto_common_tl_perf_t *tl_perf,
ucp_proto_perf_node_t *const tl_perf_node,
size_t range_start, size_t range_end,
ucp_proto_perf_t *perf)
{
Expand Down Expand Up @@ -186,7 +185,7 @@ ucp_proto_init_add_tl_perf(const ucp_proto_common_init_params_t *params,
return ucp_proto_perf_add_funcs(perf, range_start, range_end, perf_factors,
ucp_proto_perf_node_new_data("transport",
""),
tl_perf_node);
tl_perf->node);
}

/**
Expand Down Expand Up @@ -504,7 +503,6 @@ ucp_proto_common_check_mem_access(const ucp_proto_common_init_params_t *params)

ucs_status_t ucp_proto_init_perf(const ucp_proto_common_init_params_t *params,
const ucp_proto_common_tl_perf_t *tl_perf,
ucp_proto_perf_node_t *const tl_perf_node,
ucp_md_map_t reg_md_map, const char *perf_name,
ucp_proto_perf_t **perf_p)
{
Expand Down Expand Up @@ -533,8 +531,8 @@ ucs_status_t ucp_proto_init_perf(const ucp_proto_common_init_params_t *params,
return status;
}

status = ucp_proto_init_add_tl_perf(params, tl_perf, tl_perf_node,
range_start, range_end, perf);
status = ucp_proto_init_add_tl_perf(params, tl_perf, range_start, range_end,
perf);
if (status != UCS_OK) {
goto err_cleanup_perf;
}
Expand Down
1 change: 0 additions & 1 deletion src/ucp/proto/proto_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ ucp_proto_init_add_buffer_copy_time(ucp_worker_h worker, const char *title,

ucs_status_t ucp_proto_init_perf(const ucp_proto_common_init_params_t *params,
const ucp_proto_common_tl_perf_t *tl_perf,
ucp_proto_perf_node_t *const tl_perf_node,
ucp_md_map_t reg_md_map, const char *perf_name,
ucp_proto_perf_t **perf_p);

Expand Down
37 changes: 16 additions & 21 deletions src/ucp/proto/proto_multi.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ static ucp_sys_dev_map_t ucp_proto_multi_init_flush_sys_dev_mask(

static ucp_lane_index_t ucp_proto_multi_filter_net_devices(
ucp_lane_index_t num_lanes, const ucp_proto_init_params_t *params,
const ucp_proto_common_tl_perf_t *tl_perfs, int fixed_first_lane,
ucp_lane_index_t *lanes, ucp_proto_perf_node_t **perf_nodes)
ucp_proto_common_tl_perf_t *tl_perfs, int fixed_first_lane,
ucp_lane_index_t *lanes)
{
ucp_lane_index_t num_max_bw_devs = 0;
double max_bandwidth;
Expand Down Expand Up @@ -209,7 +209,7 @@ static ucp_lane_index_t ucp_proto_multi_filter_net_devices(
tl_rsc = ucp_proto_common_get_tl_rsc(params, lane);
if ((tl_rsc->dev_type == UCT_DEVICE_TYPE_NET) &&
(tl_rsc->sys_device != sys_devs[seed])) {
ucp_proto_perf_node_deref(&perf_nodes[lane]);
ucp_proto_perf_node_deref(&tl_perfs[lane].node);
ucs_trace("filtered out " UCP_PROTO_LANE_FMT,
UCP_PROTO_LANE_ARG(params, lane, &tl_perfs[lane]));
} else {
Expand All @@ -225,16 +225,14 @@ ucs_status_t ucp_proto_multi_init(const ucp_proto_multi_init_params_t *params,
ucp_proto_perf_t **perf_p,
ucp_proto_multi_priv_t *mpriv)
{
ucp_context_h context = params->super.super.worker->context;
const double max_bw_ratio = context->config.ext.multi_lane_max_ratio;
ucp_proto_perf_node_t *lanes_perf_nodes[UCP_PROTO_MAX_LANES];
ucp_context_h context = params->super.super.worker->context;
const double max_bw_ratio = context->config.ext.multi_lane_max_ratio;
ucp_proto_common_tl_perf_t lanes_perf[UCP_PROTO_MAX_LANES];
ucp_proto_common_tl_perf_t *lane_perf, perf;
ucp_lane_index_t lanes[UCP_PROTO_MAX_LANES];
double max_bandwidth, max_frag_ratio, min_bandwidth;
ucp_lane_index_t i, lane, num_lanes, num_fast_lanes;
ucp_proto_multi_lane_priv_t *lpriv;
ucp_proto_perf_node_t *perf_node;
size_t max_frag, min_length, min_end_offset, min_chunk;
ucp_proto_lane_selection_t selection;
ucp_md_map_t reg_md_map;
Expand Down Expand Up @@ -282,8 +280,7 @@ ucs_status_t ucp_proto_multi_init(const ucp_proto_multi_init_params_t *params,
lane = lanes[i];
lane_perf = &lanes_perf[lane];

status = ucp_proto_common_get_lane_perf(&params->super, lane, lane_perf,
&lanes_perf_nodes[lane]);
status = ucp_proto_common_get_lane_perf(&params->super, lane, lane_perf);
if (status != UCS_OK) {
return status;
}
Expand All @@ -310,7 +307,7 @@ ucs_status_t ucp_proto_multi_init(const ucp_proto_multi_init_params_t *params,
if ((lane_perf->bandwidth * max_bw_ratio) < max_bandwidth) {
/* Bandwidth on this lane is too low compared to the fastest
available lane, so it's not worth using it */
ucp_proto_perf_node_deref(&lanes_perf_nodes[lane]);
ucp_proto_perf_node_deref(&lanes_perf[lane].node);
ucs_trace("drop " UCP_PROTO_LANE_FMT,
UCP_PROTO_LANE_ARG(&params->super.super, lane, lane_perf));
} else {
Expand All @@ -325,8 +322,7 @@ ucs_status_t ucp_proto_multi_init(const ucp_proto_multi_init_params_t *params,
num_lanes = ucp_proto_multi_filter_net_devices(num_lanes,
&params->super.super,
lanes_perf,
fixed_first_lane, lanes,
lanes_perf_nodes);
fixed_first_lane, lanes);
}

ucp_proto_multi_select_bw_lanes(&params->super.super, lanes, num_lanes,
Expand Down Expand Up @@ -468,27 +464,26 @@ ucs_status_t ucp_proto_multi_init(const ucp_proto_multi_init_params_t *params,
}
ucs_assert(mpriv->num_lanes == ucs_popcount(selection.lane_map));

/* After this block, 'perf_node' and 'lane_perf_nodes[]' have extra ref */
if (mpriv->num_lanes == 1) {
perf_node = lanes_perf_nodes[ucs_ffs64(selection.lane_map)];
ucp_proto_perf_node_ref(perf_node);
perf.node = lanes_perf[ucs_ffs64(selection.lane_map)].node;
ucp_proto_perf_node_ref(perf.node);
} else {
perf_node = ucp_proto_perf_node_new_data("multi", "%u lanes",
perf.node = ucp_proto_perf_node_new_data("multi", "%u lanes",
mpriv->num_lanes);
ucs_for_each_bit(lane, selection.lane_map) {
ucs_assert(lane < UCP_MAX_LANES);
ucp_proto_perf_node_add_child(perf_node, lanes_perf_nodes[lane]);
ucp_proto_perf_node_add_child(perf.node, lanes_perf[lane].node);
}
}

status = ucp_proto_init_perf(&params->super, &perf, perf_node, reg_md_map,
perf_name, perf_p);
status = ucp_proto_init_perf(&params->super, &perf, reg_md_map, perf_name,
perf_p);

/* Deref unused nodes */
for (i = 0; i < num_lanes; ++i) {
ucp_proto_perf_node_deref(&lanes_perf_nodes[lanes[i]]);
ucp_proto_perf_node_deref(&lanes_perf[lanes[i]].node);
}
ucp_proto_perf_node_deref(&perf_node);
ucp_proto_perf_node_deref(&perf.node);

return status;
}
Expand Down
10 changes: 4 additions & 6 deletions src/ucp/proto/proto_single.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ ucs_status_t ucp_proto_single_init(const ucp_proto_single_init_params_t *params,
{
const char *proto_name = ucp_proto_id_field(params->super.super.proto_id,
name);
ucp_proto_perf_node_t *tl_perf_node;
ucp_proto_common_tl_perf_t tl_perf;
ucp_lane_index_t num_lanes;
ucp_md_map_t reg_md_map;
Expand Down Expand Up @@ -57,15 +56,14 @@ ucs_status_t ucp_proto_single_init(const ucp_proto_single_init_params_t *params,

ucp_proto_common_lane_priv_init(&params->super, reg_md_map, lane,
&spriv->super);
status = ucp_proto_common_get_lane_perf(&params->super, lane, &tl_perf,
&tl_perf_node);
status = ucp_proto_common_get_lane_perf(&params->super, lane, &tl_perf);
if (status != UCS_OK) {
return status;
}

status = ucp_proto_init_perf(&params->super, &tl_perf, tl_perf_node,
reg_md_map, proto_name, perf_p);
ucp_proto_perf_node_deref(&tl_perf_node);
status = ucp_proto_init_perf(&params->super, &tl_perf, reg_md_map,
proto_name, perf_p);
ucp_proto_perf_node_deref(&tl_perf.node);

return status;
}
Expand Down
Loading