This patch adds extra features to the compress performance test. Some important parameters (memory allocation, number of ops, number of segments) are calculated and printed out on the screen. Signed-off-by: Artur Trybula --- .../comp_perf_test_common.c | 93 ++++++++++++++++++- .../comp_perf_test_common.h | 3 + app/test-compress-perf/main.c | 4 +- 3 files changed, 97 insertions(+), 3 deletions(-) diff --git a/app/test-compress-perf/comp_perf_test_common.c b/app/test-compress-perf/comp_perf_test_common.c index dc9d0b0f4..7c5f36939 100644 --- a/app/test-compress-perf/comp_perf_test_common.c +++ b/app/test-compress-perf/comp_perf_test_common.c @@ -15,6 +15,18 @@ #define DIV_CEIL(a, b) ((a) / (b) + ((a) % (b) != 0)) +struct performance_tests_results { + uint16_t total_segments; + uint16_t segment_sz; + uint16_t last_segment_sz; + uint32_t total_buffs; /*number of buffers = number of ops*/ + uint16_t segments_per_buff; + uint16_t segments_per_last_buff; + size_t input_data_sz; +}; + +static struct performance_tests_results tests_res; + int param_range_check(uint16_t size, const struct rte_param_log2_range *range) { @@ -169,6 +181,13 @@ comp_perf_allocate_memory(struct comp_test_data *test_data, " could not be allocated\n"); return -1; } + + tests_res.total_segments = total_segs; + tests_res.segment_sz = test_data->seg_sz; + tests_res.total_buffs = mem->total_bufs; + tests_res.segments_per_buff = test_data->max_sgl_segs; + tests_res.input_data_sz = test_data->input_data_sz; + return 0; } @@ -177,9 +196,10 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem) { uint32_t remaining_data = test_data->input_data_sz; uint8_t *input_data_ptr = test_data->input_data; - size_t data_sz; + size_t data_sz = 0; uint8_t *data_addr; uint32_t i, j; + uint16_t segs_per_mbuf = 0; for (i = 0; i < mem->total_bufs; i++) { /* Allocate data in input mbuf and copy data from input file */ @@ -203,7 +223,7 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem) remaining_data -= data_sz; /* Already one segment in the mbuf */ - uint16_t segs_per_mbuf = 1; + segs_per_mbuf = 1; /* Chain mbufs if needed for input mbufs */ while (segs_per_mbuf < test_data->max_sgl_segs @@ -280,5 +300,74 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem) } } + tests_res.segments_per_last_buff = segs_per_mbuf; + tests_res.last_segment_sz = data_sz; + return 0; } + +void +print_test_dynamics(void) +{ + uint32_t opt_total_segs = DIV_CEIL(tests_res.input_data_sz, + MAX_SEG_SIZE); + + if (tests_res.total_buffs > 1) { + printf("\nWarning: for the current input parameters number" + " of ops is higher than one, which may result" + " in sub-optimal performance.\n"); + printf("To improve the performance (for the current" + " input data) following parameters are" + " suggested:\n"); + printf(" • Segment size: %d\n", MAX_SEG_SIZE); + printf(" • Number of segments: %u\n", opt_total_segs); + } else if (tests_res.total_buffs == 1) { + printf("\nWarning: There is only one op with %u segments –" + " the compression ratio is the best.\n", + tests_res.segments_per_last_buff); + if (tests_res.segment_sz < MAX_SEG_SIZE) + printf("To reduce compression time, please use" + " bigger segment size: %d.\n", + MAX_SEG_SIZE); + else if (tests_res.segment_sz == MAX_SEG_SIZE) + printf("Segment size is optimal for the best" + " performance.\n"); + } else + printf("Warning: something wrong happened!!\n"); + + printf("\nFor the current input parameters (segment size = %u," + " segments number = %u):\n", + tests_res.segment_sz, + tests_res.segments_per_buff); + printf(" • Total number of segments: %d\n", + tests_res.total_segments); + printf(" • %u segments %u bytes long, last segment %u" + " byte(s) long\n", + tests_res.total_segments - 1, + tests_res.segment_sz, + tests_res.last_segment_sz); + printf(" • Number of ops: %u\n", tests_res.total_buffs); + printf(" • Total memory allocation: %u\n", + (tests_res.total_segments - 1) * tests_res.segment_sz + + tests_res.last_segment_sz); + if (tests_res.total_buffs > 1) + printf(" • %u ops: %u segments in each," + " segment size %u\n", + tests_res.total_buffs - 1, + tests_res.segments_per_buff, + tests_res.segment_sz); + if (tests_res.segments_per_last_buff > 1) { + printf(" • 1 op %u segments:\n", + tests_res.segments_per_last_buff); + printf(" o %u segment size %u\n", + tests_res.segments_per_last_buff - 1, + tests_res.segment_sz); + printf(" o last segment size %u\n", + tests_res.last_segment_sz); + } else if (tests_res.segments_per_last_buff == 1) { + printf(" • 1 op (the last one): %u segment %u" + " byte(s) long\n\n", + tests_res.segments_per_last_buff, + tests_res.last_segment_sz); + } +} diff --git a/app/test-compress-perf/comp_perf_test_common.h b/app/test-compress-perf/comp_perf_test_common.h index 9c11e3a00..c72f3ef3c 100644 --- a/app/test-compress-perf/comp_perf_test_common.h +++ b/app/test-compress-perf/comp_perf_test_common.h @@ -38,4 +38,7 @@ comp_perf_allocate_memory(struct comp_test_data *test_data, int prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem); +void +print_test_dynamics(void); + #endif /* _COMP_PERF_TEST_COMMON_H_ */ diff --git a/app/test-compress-perf/main.c b/app/test-compress-perf/main.c index e746e4708..76961bffb 100644 --- a/app/test-compress-perf/main.c +++ b/app/test-compress-perf/main.c @@ -363,7 +363,7 @@ main(int argc, char **argv) printf("App uses socket: %u\n", rte_socket_id()); printf("Burst size = %u\n", test_data->burst_sz); - printf("File size = %zu\n", test_data->input_data_sz); + printf("Input data size = %zu\n", test_data->input_data_sz); test_data->cleanup = ST_DURING_TEST; total_nb_qps = nb_compressdevs * test_data->nb_qps; @@ -390,6 +390,8 @@ main(int argc, char **argv) i++; } + print_test_dynamics(); + while (test_data->level <= test_data->level_lst.max) { i = 0; -- 2.17.1