struct comp_test_data *test_data = ctx->ver.options;
uint32_t lcore = rte_lcore_id();
static rte_atomic16_t display_once = RTE_ATOMIC16_INIT(0);
+ int i, ret = EXIT_SUCCESS;
ctx->ver.mem.lcore_id = lcore;
- int i, ret = EXIT_SUCCESS;
+
+ /*
+ * printing information about current compression thread
+ */
+ if (rte_atomic16_test_and_set(&ctx->ver.mem.print_info_once))
+ printf(" lcore: %u,"
+ " driver name: %s,"
+ " device name: %s,"
+ " device id: %u,"
+ " socket id: %u,"
+ " queue pair id: %u\n",
+ lcore,
+ ctx->ver.options->driver_name,
+ rte_compressdev_name_get(ctx->ver.mem.dev_id),
+ ctx->ver.mem.dev_id,
+ rte_compressdev_socket_id(ctx->ver.mem.dev_id),
+ ctx->ver.mem.qp_id);
/*
* First the verification part is needed
1000000000;
if (rte_atomic16_test_and_set(&display_once)) {
- printf("%12s%6s%12s%17s%15s%16s\n",
+ printf("\n%12s%6s%12s%17s%15s%16s\n",
"lcore id", "Level", "Comp size", "Comp ratio [%]",
"Comp [Gbps]", "Decomp [Gbps]");
}
#define DIV_CEIL(a, b) ((a) / (b) + ((a) % (b) != 0))
+struct cperf_buffer_info {
+ 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 cperf_buffer_info buffer_info;
+
int
param_range_check(uint16_t size, const struct rte_param_log2_range *range)
{
" could not be allocated\n");
return -1;
}
+
+ buffer_info.total_segments = total_segs;
+ buffer_info.segment_sz = test_data->seg_sz;
+ buffer_info.total_buffs = mem->total_bufs;
+ buffer_info.segments_per_buff = test_data->max_sgl_segs;
+ buffer_info.input_data_sz = test_data->input_data_sz;
+
return 0;
}
{
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 */
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
}
}
+ buffer_info.segments_per_last_buff = segs_per_mbuf;
+ buffer_info.last_segment_sz = data_sz;
+
return 0;
}
+
+void
+print_test_dynamics(void)
+{
+ uint32_t opt_total_segs = DIV_CEIL(buffer_info.input_data_sz,
+ MAX_SEG_SIZE);
+
+ if (buffer_info.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 (buffer_info.total_buffs == 1) {
+ printf("\nInfo: there is only one op with %u segments -"
+ " the compression ratio is the best.\n",
+ buffer_info.segments_per_last_buff);
+ if (buffer_info.segment_sz < MAX_SEG_SIZE)
+ printf("To reduce compression time, please use"
+ " bigger segment size: %d.\n",
+ MAX_SEG_SIZE);
+ else if (buffer_info.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,"
+ " maximum segments per SGL = %u):\n",
+ buffer_info.segment_sz,
+ buffer_info.segments_per_buff);
+ printf(" * Total number of buffers: %d\n",
+ buffer_info.total_segments);
+ printf(" * %u buffer(s) %u bytes long, last buffer %u"
+ " byte(s) long\n",
+ buffer_info.total_segments - 1,
+ buffer_info.segment_sz,
+ buffer_info.last_segment_sz);
+ printf(" * Number of ops: %u\n", buffer_info.total_buffs);
+ printf(" * Total memory allocation: %u\n",
+ (buffer_info.total_segments - 1) * buffer_info.segment_sz
+ + buffer_info.last_segment_sz);
+ if (buffer_info.total_buffs > 1)
+ printf(" * %u ops: %u segment(s) in each,"
+ " segment size %u\n",
+ buffer_info.total_buffs - 1,
+ buffer_info.segments_per_buff,
+ buffer_info.segment_sz);
+ if (buffer_info.segments_per_last_buff > 1) {
+ printf(" * 1 op %u segments:\n",
+ buffer_info.segments_per_last_buff);
+ printf(" o %u segment size %u\n",
+ buffer_info.segments_per_last_buff - 1,
+ buffer_info.segment_sz);
+ printf(" o last segment size %u\n",
+ buffer_info.last_segment_sz);
+ } else if (buffer_info.segments_per_last_buff == 1) {
+ printf(" * 1 op (the last one): %u segment %u"
+ " byte(s) long\n\n",
+ buffer_info.segments_per_last_buff,
+ buffer_info.last_segment_sz);
+ }
+ printf("\n");
+}