diff --git a/fabtests/benchmarks/benchmark_shared.c b/fabtests/benchmarks/benchmark_shared.c index 32b0fdc926c..6c863bbcf3a 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 'r': + opts.options |= FT_OPT_NO_PRE_POSTED_RX; + break; default: break; } @@ -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. */ @@ -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; @@ -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, diff --git a/fabtests/benchmarks/benchmark_shared.h b/fabtests/benchmarks/benchmark_shared.h index 57f0facb087..fbaf3eb3075 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 "rvkj: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/common/shared.c b/fabtests/common/shared.c index 2d4387ba4df..eb95127b6f0 100644 --- a/fabtests/common/shared.c +++ b/fabtests/common/shared.c @@ -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; } diff --git a/fabtests/include/shared.h b/fabtests/include/shared.h index 80fd5538fe4..7d56fdd7257 100644 --- a/fabtests/include/shared.h +++ b/fabtests/include/shared.h @@ -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, };