From 7110984ddfe9d8fed36194fae4e68983aa6a5b71 Mon Sep 17 00:00:00 2001 From: Ian Ziemba Date: Wed, 18 Sep 2024 09:09:28 -0500 Subject: [PATCH] fabtests: Support TX first pingpong test 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 TX first pingpong can be enabled by used the -T option. Signed-off-by: Ian Ziemba --- fabtests/benchmarks/benchmark_shared.c | 109 ++++++++++++++++++++++++- fabtests/benchmarks/benchmark_shared.h | 2 +- fabtests/include/shared.h | 1 + 3 files changed, 108 insertions(+), 4 deletions(-) diff --git a/fabtests/benchmarks/benchmark_shared.c b/fabtests/benchmarks/benchmark_shared.c index 32b0fdc926c..5ce63621eac 100644 --- a/fabtests/benchmarks/benchmark_shared.c +++ b/fabtests/benchmarks/benchmark_shared.c @@ -70,6 +70,9 @@ void ft_parse_benchmark_opts(int op, char *optarg) case 'W': opts.window_size = atoi(optarg); break; + case 'T': + opts.options |= FT_OPT_NO_PRE_POSTED_RX; + break; default: break; } @@ -84,6 +87,11 @@ 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("-T", "Post transmit operations (e.g. fi_send, fi_tsend) before receives"); + FT_PRINT_OPTS_USAGE("", "Using this option requires out-of-band address exchange and synchronization (i.e. -b must be used)"); + 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. */ @@ -133,6 +141,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; @@ -155,9 +225,42 @@ int pingpong(void) if (ret) return ret; - ret = pingpong_pre_posted_rx(inject_size); - if (ret) - return ret; + if (ft_check_opts(FT_OPT_NO_PRE_POSTED_RX)) { + /* Consume pre-posted RX buffers on client and server. */ + if (opts.dst_addr) { + ret = ft_tx(ep, remote_fi_addr, opts.transfer_size, + &tx_ctx); + if (ret) + return ret; + + ret = ft_get_rx_comp(rx_seq); + if (ret) + return ret; + } else { + ret = ft_get_rx_comp(rx_seq); + if (ret) + return ret; + + + ret = ft_tx(ep, remote_fi_addr, opts.transfer_size, + &tx_ctx); + if (ret) + return ret; + } + + ret = pingpong_no_pre_posted_rx(inject_size); + if (ret) + return ret; + + /* Repost pre-posted RX buffers to support inband sync. */ + ret = ft_post_rx(ep, rx_size, &rx_ctx); + if (ret) + return ret; + } else { + 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, diff --git a/fabtests/benchmarks/benchmark_shared.h b/fabtests/benchmarks/benchmark_shared.h index 57f0facb087..98a7b05f828 100644 --- a/fabtests/benchmarks/benchmark_shared.h +++ b/fabtests/benchmarks/benchmark_shared.h @@ -40,7 +40,7 @@ extern "C" { #include -#define BENCHMARK_OPTS "vkj:W:" +#define BENCHMARK_OPTS "Tvkj:W:" #define FT_BENCHMARK_MAX_MSG_SIZE (test_size[TEST_CNT - 1].size) void ft_parse_benchmark_opts(int op, char *optarg); diff --git a/fabtests/include/shared.h b/fabtests/include/shared.h index ae35106b5b8..9063ffcb903 100644 --- a/fabtests/include/shared.h +++ b/fabtests/include/shared.h @@ -140,6 +140,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, };