Skip to content

Commit

Permalink
fabtests: Support no prepost RX pingpong test
Browse files Browse the repository at this point in the history
The new pingpong test allows for TX operations to be posted and
processed, if necessary, before post the RX buffer. This better aligns
to how OSU latency works. By doing this, fi_rdm_tagged_latency is now
lower than OSU latency which makes sense since less SW is involved.

The no prepost RX pingpong test can be enabled by using the -r option.

Signed-off-by: Ian Ziemba <ian.ziemba@hpe.com>
  • Loading branch information
iziemba authored and j-xiong committed Sep 24, 2024
1 parent 77b3bdd commit 256d55e
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 7 deletions.
102 changes: 96 additions & 6 deletions fabtests/benchmarks/benchmark_shared.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ void ft_parse_benchmark_opts(int op, char *optarg)
case 'W':
opts.window_size = atoi(optarg);
break;
case 'r':
opts.options |= FT_OPT_NO_PRE_POSTED_RX;
break;
default:
break;
}
Expand All @@ -84,6 +87,10 @@ void ft_benchmark_usage(void)
"* The following condition is required to have at least "
"one window\nsize # of messsages to be sent: "
"# of iterations > window size");
FT_PRINT_OPTS_USAGE("-r", "Do not pre post RX buffers");
FT_PRINT_OPTS_USAGE("", "Only the following tests support this option for now:");
FT_PRINT_OPTS_USAGE("", "\tfi_rdm_tagged_pingpong");
FT_PRINT_OPTS_USAGE("", "\tfi_rdm_pingpong");
}

/* Pingpong latency test with pre-posted receive buffers. */
Expand Down Expand Up @@ -133,6 +140,68 @@ static int pingpong_pre_posted_rx(size_t inject_size)
return FI_SUCCESS;
}

/* Pingpong latency test without pre-posted receive buffers. */
static int pingpong_no_pre_posted_rx(size_t inject_size)
{
int ret, i;

if (opts.dst_addr) {
for (i = 0; i < opts.iterations + opts.warmup_iterations; i++) {
if (i == opts.warmup_iterations)
ft_start();

if (opts.transfer_size <= inject_size)
ret = ft_inject(ep, remote_fi_addr,
opts.transfer_size);
else
ret = ft_tx(ep, remote_fi_addr,
opts.transfer_size, &tx_ctx);
if (ret)
return ret;

ret = ft_post_rx(ep, opts.transfer_size, &rx_ctx);
if (ret)
return ret;

ret = ft_get_rx_comp(rx_seq);
if (ret)
return ret;
}
} else {
for (i = 0; i < opts.iterations + opts.warmup_iterations; i++) {
if (i == opts.warmup_iterations)
ft_start();

ret = ft_post_rx(ep, opts.transfer_size, &rx_ctx);
if (ret)
return ret;

ret = ft_get_rx_comp(rx_seq);
if (ret)
return ret;

if (ft_check_opts(FT_OPT_VERIFY_DATA | FT_OPT_ACTIVE)) {
ret = ft_check_buf((char *) rx_buf + ft_rx_prefix_size(),
opts.transfer_size);
if (ret)
return ret;
}

if (opts.transfer_size <= inject_size)
ret = ft_inject(ep, remote_fi_addr,
opts.transfer_size);
else
ret = ft_tx(ep, remote_fi_addr,
opts.transfer_size, &tx_ctx);
if (ret)
return ret;
}
}
ft_stop();

return FI_SUCCESS;
}

int pingpong(void)
{
int ret;
Expand All @@ -151,13 +220,34 @@ int pingpong(void)
if (opts.options & FT_OPT_ENABLE_HMEM)
inject_size = 0;

ret = ft_sync();
if (ret)
return ret;
if (ft_check_opts(FT_OPT_NO_PRE_POSTED_RX)) {
if (ft_check_opts(FT_OPT_OOB_SYNC)) {
ret = ft_sync_oob();
if (ret)
return ret;
} else {
/* Repost RX buffers to support inband sync. */
ret = ft_post_rx(ep, rx_size, &rx_ctx);
if (ret)
return ret;

ret = pingpong_pre_posted_rx(inject_size);
if (ret)
return ret;
ret = ft_sync_inband(false);
if (ret)
return ret;
}

ret = pingpong_no_pre_posted_rx(inject_size);
if (ret)
return ret;
} else {
ret = ft_sync();
if (ret)
return ret;

ret = pingpong_pre_posted_rx(inject_size);
if (ret)
return ret;
}

if (opts.machr)
show_perf_mr(opts.transfer_size, opts.iterations, &start, &end, 2,
Expand Down
2 changes: 1 addition & 1 deletion fabtests/benchmarks/benchmark_shared.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ extern "C" {

#include <rdma/fi_rma.h>

#define BENCHMARK_OPTS "vkj:W:"
#define BENCHMARK_OPTS "rvkj:W:"
#define FT_BENCHMARK_MAX_MSG_SIZE (test_size[TEST_CNT - 1].size)

void ft_parse_benchmark_opts(int op, char *optarg);
Expand Down
8 changes: 8 additions & 0 deletions fabtests/common/shared.c
Original file line number Diff line number Diff line change
Expand Up @@ -1340,6 +1340,14 @@ int ft_init_fabric(void)
if (ft_check_opts(FT_OPT_FORK_CHILD))
ft_fork_child();

if (ft_check_opts(FT_OPT_NO_PRE_POSTED_RX) &&
!ft_check_opts(FT_OPT_SKIP_MSG_ALLOC) &&
(fi->caps & (FI_MSG | FI_TAGGED))) {
ret = ft_sync_inband(false);
if (ret)
return ret;
}

return 0;
}

Expand Down
1 change: 1 addition & 0 deletions fabtests/include/shared.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ enum {
FT_OPT_DISABLE_TAG_VALIDATION = 1 << 25,
FT_OPT_ADDR_IS_OOB = 1 << 26,
FT_OPT_REG_DMABUF_MR = 1 << 27,
FT_OPT_NO_PRE_POSTED_RX = 1 << 28,
FT_OPT_OOB_CTRL = FT_OPT_OOB_SYNC | FT_OPT_OOB_ADDR_EXCH,
};

Expand Down

0 comments on commit 256d55e

Please sign in to comment.