xref: /dpdk/app/test-mldev/test_inference_common.c (revision fccf444cfe059fad295f4037ba221ddfee694cc0)
1bbd272edSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2bbd272edSSrikanth Yalavarthi  * Copyright (c) 2022 Marvell.
3bbd272edSSrikanth Yalavarthi  */
4bbd272edSSrikanth Yalavarthi 
5bbd272edSSrikanth Yalavarthi #include <errno.h>
68cb22a54SDavid Marchand #include <stdio.h>
7bbd272edSSrikanth Yalavarthi #include <unistd.h>
8bbd272edSSrikanth Yalavarthi 
9bbd272edSSrikanth Yalavarthi #include <rte_common.h>
105a82bc33SSrikanth Yalavarthi #include <rte_cycles.h>
11da679339SSrikanth Yalavarthi #include <rte_hash_crc.h>
12bbd272edSSrikanth Yalavarthi #include <rte_launch.h>
13bbd272edSSrikanth Yalavarthi #include <rte_lcore.h>
14bbd272edSSrikanth Yalavarthi #include <rte_malloc.h>
15bbd272edSSrikanth Yalavarthi #include <rte_memzone.h>
16bbd272edSSrikanth Yalavarthi #include <rte_mldev.h>
17bbd272edSSrikanth Yalavarthi 
18bbd272edSSrikanth Yalavarthi #include "ml_common.h"
19bbd272edSSrikanth Yalavarthi #include "test_inference_common.h"
20bbd272edSSrikanth Yalavarthi 
21da679339SSrikanth Yalavarthi #define ML_TEST_READ_TYPE(buffer, type) (*((type *)buffer))
22da679339SSrikanth Yalavarthi 
23da679339SSrikanth Yalavarthi #define ML_TEST_CHECK_OUTPUT(output, reference, tolerance) \
24da679339SSrikanth Yalavarthi 	(((float)output - (float)reference) <= (((float)reference * tolerance) / 100.0))
25da679339SSrikanth Yalavarthi 
26da679339SSrikanth Yalavarthi #define ML_OPEN_WRITE_GET_ERR(name, buffer, size, err) \
27da679339SSrikanth Yalavarthi 	do { \
28da679339SSrikanth Yalavarthi 		FILE *fp = fopen(name, "w+"); \
29da679339SSrikanth Yalavarthi 		if (fp == NULL) { \
30da679339SSrikanth Yalavarthi 			ml_err("Unable to create file: %s, error: %s", name, strerror(errno)); \
31da679339SSrikanth Yalavarthi 			err = true; \
32da679339SSrikanth Yalavarthi 		} else { \
33da679339SSrikanth Yalavarthi 			if (fwrite(buffer, 1, size, fp) != size) { \
34da679339SSrikanth Yalavarthi 				ml_err("Error writing output, file: %s, error: %s", name, \
35da679339SSrikanth Yalavarthi 				       strerror(errno)); \
36da679339SSrikanth Yalavarthi 				err = true; \
37da679339SSrikanth Yalavarthi 			} \
38da679339SSrikanth Yalavarthi 			fclose(fp); \
39da679339SSrikanth Yalavarthi 		} \
40da679339SSrikanth Yalavarthi 	} while (0)
41da679339SSrikanth Yalavarthi 
42bbd272edSSrikanth Yalavarthi /* Enqueue inference requests with burst size equal to 1 */
43bbd272edSSrikanth Yalavarthi static int
44bbd272edSSrikanth Yalavarthi ml_enqueue_single(void *arg)
45bbd272edSSrikanth Yalavarthi {
46bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv((struct ml_test *)arg);
47bbd272edSSrikanth Yalavarthi 	struct ml_request *req = NULL;
48bbd272edSSrikanth Yalavarthi 	struct rte_ml_op *op = NULL;
49bbd272edSSrikanth Yalavarthi 	struct ml_core_args *args;
50bbd272edSSrikanth Yalavarthi 	uint64_t model_enq = 0;
515a82bc33SSrikanth Yalavarthi 	uint64_t start_cycle;
52bbd272edSSrikanth Yalavarthi 	uint32_t burst_enq;
53bbd272edSSrikanth Yalavarthi 	uint32_t lcore_id;
54bbd272edSSrikanth Yalavarthi 	uint16_t fid;
55bbd272edSSrikanth Yalavarthi 	int ret;
56bbd272edSSrikanth Yalavarthi 
57bbd272edSSrikanth Yalavarthi 	lcore_id = rte_lcore_id();
58bbd272edSSrikanth Yalavarthi 	args = &t->args[lcore_id];
595a82bc33SSrikanth Yalavarthi 	args->start_cycles = 0;
60bbd272edSSrikanth Yalavarthi 	model_enq = 0;
61bbd272edSSrikanth Yalavarthi 
62bbd272edSSrikanth Yalavarthi 	if (args->nb_reqs == 0)
63bbd272edSSrikanth Yalavarthi 		return 0;
64bbd272edSSrikanth Yalavarthi 
65bbd272edSSrikanth Yalavarthi next_rep:
66bbd272edSSrikanth Yalavarthi 	fid = args->start_fid;
67bbd272edSSrikanth Yalavarthi 
68bbd272edSSrikanth Yalavarthi next_model:
69bbd272edSSrikanth Yalavarthi 	ret = rte_mempool_get(t->op_pool, (void **)&op);
70bbd272edSSrikanth Yalavarthi 	if (ret != 0)
71bbd272edSSrikanth Yalavarthi 		goto next_model;
72bbd272edSSrikanth Yalavarthi 
73bbd272edSSrikanth Yalavarthi retry:
74bbd272edSSrikanth Yalavarthi 	ret = rte_mempool_get(t->model[fid].io_pool, (void **)&req);
75bbd272edSSrikanth Yalavarthi 	if (ret != 0)
76bbd272edSSrikanth Yalavarthi 		goto retry;
77bbd272edSSrikanth Yalavarthi 
78bbd272edSSrikanth Yalavarthi 	op->model_id = t->model[fid].id;
7938e884b5SSrikanth Yalavarthi 	op->nb_batches = t->model[fid].nb_batches;
80bbd272edSSrikanth Yalavarthi 	op->mempool = t->op_pool;
81bbd272edSSrikanth Yalavarthi 
82bbd272edSSrikanth Yalavarthi 	op->input.addr = req->input;
83bbd272edSSrikanth Yalavarthi 	op->input.length = t->model[fid].inp_qsize;
84bbd272edSSrikanth Yalavarthi 	op->input.next = NULL;
85bbd272edSSrikanth Yalavarthi 
86bbd272edSSrikanth Yalavarthi 	op->output.addr = req->output;
87bbd272edSSrikanth Yalavarthi 	op->output.length = t->model[fid].out_qsize;
88bbd272edSSrikanth Yalavarthi 	op->output.next = NULL;
89bbd272edSSrikanth Yalavarthi 
90bbd272edSSrikanth Yalavarthi 	op->user_ptr = req;
91bbd272edSSrikanth Yalavarthi 	req->niters++;
92bbd272edSSrikanth Yalavarthi 	req->fid = fid;
93bbd272edSSrikanth Yalavarthi 
94bbd272edSSrikanth Yalavarthi enqueue_req:
955a82bc33SSrikanth Yalavarthi 	start_cycle = rte_get_tsc_cycles();
96c0e87165SSrikanth Yalavarthi 	burst_enq = rte_ml_enqueue_burst(t->cmn.opt->dev_id, args->qp_id, &op, 1);
97bbd272edSSrikanth Yalavarthi 	if (burst_enq == 0)
98bbd272edSSrikanth Yalavarthi 		goto enqueue_req;
99bbd272edSSrikanth Yalavarthi 
1005a82bc33SSrikanth Yalavarthi 	args->start_cycles += start_cycle;
101bbd272edSSrikanth Yalavarthi 	fid++;
102bbd272edSSrikanth Yalavarthi 	if (likely(fid <= args->end_fid))
103bbd272edSSrikanth Yalavarthi 		goto next_model;
104bbd272edSSrikanth Yalavarthi 
105bbd272edSSrikanth Yalavarthi 	model_enq++;
106bbd272edSSrikanth Yalavarthi 	if (likely(model_enq < args->nb_reqs))
107bbd272edSSrikanth Yalavarthi 		goto next_rep;
108bbd272edSSrikanth Yalavarthi 
109bbd272edSSrikanth Yalavarthi 	return 0;
110bbd272edSSrikanth Yalavarthi }
111bbd272edSSrikanth Yalavarthi 
112bbd272edSSrikanth Yalavarthi /* Dequeue inference requests with burst size equal to 1 */
113bbd272edSSrikanth Yalavarthi static int
114bbd272edSSrikanth Yalavarthi ml_dequeue_single(void *arg)
115bbd272edSSrikanth Yalavarthi {
116bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv((struct ml_test *)arg);
117bbd272edSSrikanth Yalavarthi 	struct rte_ml_op_error error;
118bbd272edSSrikanth Yalavarthi 	struct rte_ml_op *op = NULL;
119bbd272edSSrikanth Yalavarthi 	struct ml_core_args *args;
120bbd272edSSrikanth Yalavarthi 	struct ml_request *req;
121bbd272edSSrikanth Yalavarthi 	uint64_t total_deq = 0;
122bbd272edSSrikanth Yalavarthi 	uint8_t nb_filelist;
123bbd272edSSrikanth Yalavarthi 	uint32_t burst_deq;
1245a82bc33SSrikanth Yalavarthi 	uint64_t end_cycle;
125bbd272edSSrikanth Yalavarthi 	uint32_t lcore_id;
126bbd272edSSrikanth Yalavarthi 
127bbd272edSSrikanth Yalavarthi 	lcore_id = rte_lcore_id();
128bbd272edSSrikanth Yalavarthi 	args = &t->args[lcore_id];
1295a82bc33SSrikanth Yalavarthi 	args->end_cycles = 0;
130bbd272edSSrikanth Yalavarthi 	nb_filelist = args->end_fid - args->start_fid + 1;
131bbd272edSSrikanth Yalavarthi 
132bbd272edSSrikanth Yalavarthi 	if (args->nb_reqs == 0)
133bbd272edSSrikanth Yalavarthi 		return 0;
134bbd272edSSrikanth Yalavarthi 
135bbd272edSSrikanth Yalavarthi dequeue_req:
136c0e87165SSrikanth Yalavarthi 	burst_deq = rte_ml_dequeue_burst(t->cmn.opt->dev_id, args->qp_id, &op, 1);
1375a82bc33SSrikanth Yalavarthi 	end_cycle = rte_get_tsc_cycles();
138bbd272edSSrikanth Yalavarthi 
139bbd272edSSrikanth Yalavarthi 	if (likely(burst_deq == 1)) {
140bbd272edSSrikanth Yalavarthi 		total_deq += burst_deq;
1415a82bc33SSrikanth Yalavarthi 		args->end_cycles += end_cycle;
142bbd272edSSrikanth Yalavarthi 		if (unlikely(op->status == RTE_ML_OP_STATUS_ERROR)) {
143bbd272edSSrikanth Yalavarthi 			rte_ml_op_error_get(t->cmn.opt->dev_id, op, &error);
144bbd272edSSrikanth Yalavarthi 			ml_err("error_code = 0x%" PRIx64 ", error_message = %s\n", error.errcode,
145bbd272edSSrikanth Yalavarthi 			       error.message);
146bbd272edSSrikanth Yalavarthi 			t->error_count[lcore_id]++;
147bbd272edSSrikanth Yalavarthi 		}
148bbd272edSSrikanth Yalavarthi 		req = (struct ml_request *)op->user_ptr;
149bbd272edSSrikanth Yalavarthi 		rte_mempool_put(t->model[req->fid].io_pool, req);
150bbd272edSSrikanth Yalavarthi 		rte_mempool_put(t->op_pool, op);
151bbd272edSSrikanth Yalavarthi 	}
152bbd272edSSrikanth Yalavarthi 
153bbd272edSSrikanth Yalavarthi 	if (likely(total_deq < args->nb_reqs * nb_filelist))
154bbd272edSSrikanth Yalavarthi 		goto dequeue_req;
155bbd272edSSrikanth Yalavarthi 
156bbd272edSSrikanth Yalavarthi 	return 0;
157bbd272edSSrikanth Yalavarthi }
158bbd272edSSrikanth Yalavarthi 
15939890f07SSrikanth Yalavarthi /* Enqueue inference requests with burst size greater than 1 */
16039890f07SSrikanth Yalavarthi static int
16139890f07SSrikanth Yalavarthi ml_enqueue_burst(void *arg)
16239890f07SSrikanth Yalavarthi {
16339890f07SSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv((struct ml_test *)arg);
16439890f07SSrikanth Yalavarthi 	struct ml_core_args *args;
1655a82bc33SSrikanth Yalavarthi 	uint64_t start_cycle;
16639890f07SSrikanth Yalavarthi 	uint16_t ops_count;
16739890f07SSrikanth Yalavarthi 	uint64_t model_enq;
16839890f07SSrikanth Yalavarthi 	uint16_t burst_enq;
16939890f07SSrikanth Yalavarthi 	uint32_t lcore_id;
17039890f07SSrikanth Yalavarthi 	uint16_t pending;
17139890f07SSrikanth Yalavarthi 	uint16_t idx;
17239890f07SSrikanth Yalavarthi 	uint16_t fid;
17339890f07SSrikanth Yalavarthi 	uint16_t i;
17439890f07SSrikanth Yalavarthi 	int ret;
17539890f07SSrikanth Yalavarthi 
17639890f07SSrikanth Yalavarthi 	lcore_id = rte_lcore_id();
17739890f07SSrikanth Yalavarthi 	args = &t->args[lcore_id];
1785a82bc33SSrikanth Yalavarthi 	args->start_cycles = 0;
17939890f07SSrikanth Yalavarthi 	model_enq = 0;
18039890f07SSrikanth Yalavarthi 
18139890f07SSrikanth Yalavarthi 	if (args->nb_reqs == 0)
18239890f07SSrikanth Yalavarthi 		return 0;
18339890f07SSrikanth Yalavarthi 
18439890f07SSrikanth Yalavarthi next_rep:
18539890f07SSrikanth Yalavarthi 	fid = args->start_fid;
18639890f07SSrikanth Yalavarthi 
18739890f07SSrikanth Yalavarthi next_model:
18839890f07SSrikanth Yalavarthi 	ops_count = RTE_MIN(t->cmn.opt->burst_size, args->nb_reqs - model_enq);
18939890f07SSrikanth Yalavarthi 	ret = rte_mempool_get_bulk(t->op_pool, (void **)args->enq_ops, ops_count);
19039890f07SSrikanth Yalavarthi 	if (ret != 0)
19139890f07SSrikanth Yalavarthi 		goto next_model;
19239890f07SSrikanth Yalavarthi 
19339890f07SSrikanth Yalavarthi retry:
19439890f07SSrikanth Yalavarthi 	ret = rte_mempool_get_bulk(t->model[fid].io_pool, (void **)args->reqs, ops_count);
19539890f07SSrikanth Yalavarthi 	if (ret != 0)
19639890f07SSrikanth Yalavarthi 		goto retry;
19739890f07SSrikanth Yalavarthi 
19839890f07SSrikanth Yalavarthi 	for (i = 0; i < ops_count; i++) {
19939890f07SSrikanth Yalavarthi 		args->enq_ops[i]->model_id = t->model[fid].id;
20038e884b5SSrikanth Yalavarthi 		args->enq_ops[i]->nb_batches = t->model[fid].nb_batches;
20139890f07SSrikanth Yalavarthi 		args->enq_ops[i]->mempool = t->op_pool;
20239890f07SSrikanth Yalavarthi 
20339890f07SSrikanth Yalavarthi 		args->enq_ops[i]->input.addr = args->reqs[i]->input;
20439890f07SSrikanth Yalavarthi 		args->enq_ops[i]->input.length = t->model[fid].inp_qsize;
20539890f07SSrikanth Yalavarthi 		args->enq_ops[i]->input.next = NULL;
20639890f07SSrikanth Yalavarthi 
20739890f07SSrikanth Yalavarthi 		args->enq_ops[i]->output.addr = args->reqs[i]->output;
20839890f07SSrikanth Yalavarthi 		args->enq_ops[i]->output.length = t->model[fid].out_qsize;
20939890f07SSrikanth Yalavarthi 		args->enq_ops[i]->output.next = NULL;
21039890f07SSrikanth Yalavarthi 
21139890f07SSrikanth Yalavarthi 		args->enq_ops[i]->user_ptr = args->reqs[i];
21239890f07SSrikanth Yalavarthi 		args->reqs[i]->niters++;
21339890f07SSrikanth Yalavarthi 		args->reqs[i]->fid = fid;
21439890f07SSrikanth Yalavarthi 	}
21539890f07SSrikanth Yalavarthi 
21639890f07SSrikanth Yalavarthi 	idx = 0;
21739890f07SSrikanth Yalavarthi 	pending = ops_count;
21839890f07SSrikanth Yalavarthi 
21939890f07SSrikanth Yalavarthi enqueue_reqs:
2205a82bc33SSrikanth Yalavarthi 	start_cycle = rte_get_tsc_cycles();
221c0e87165SSrikanth Yalavarthi 	burst_enq =
222c0e87165SSrikanth Yalavarthi 		rte_ml_enqueue_burst(t->cmn.opt->dev_id, args->qp_id, &args->enq_ops[idx], pending);
2235a82bc33SSrikanth Yalavarthi 	args->start_cycles += burst_enq * start_cycle;
22439890f07SSrikanth Yalavarthi 	pending = pending - burst_enq;
22539890f07SSrikanth Yalavarthi 
22639890f07SSrikanth Yalavarthi 	if (pending > 0) {
22739890f07SSrikanth Yalavarthi 		idx = idx + burst_enq;
22839890f07SSrikanth Yalavarthi 		goto enqueue_reqs;
22939890f07SSrikanth Yalavarthi 	}
23039890f07SSrikanth Yalavarthi 
23139890f07SSrikanth Yalavarthi 	fid++;
23239890f07SSrikanth Yalavarthi 	if (fid <= args->end_fid)
23339890f07SSrikanth Yalavarthi 		goto next_model;
23439890f07SSrikanth Yalavarthi 
23539890f07SSrikanth Yalavarthi 	model_enq = model_enq + ops_count;
23639890f07SSrikanth Yalavarthi 	if (model_enq < args->nb_reqs)
23739890f07SSrikanth Yalavarthi 		goto next_rep;
23839890f07SSrikanth Yalavarthi 
23939890f07SSrikanth Yalavarthi 	return 0;
24039890f07SSrikanth Yalavarthi }
24139890f07SSrikanth Yalavarthi 
24239890f07SSrikanth Yalavarthi /* Dequeue inference requests with burst size greater than 1 */
24339890f07SSrikanth Yalavarthi static int
24439890f07SSrikanth Yalavarthi ml_dequeue_burst(void *arg)
24539890f07SSrikanth Yalavarthi {
24639890f07SSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv((struct ml_test *)arg);
24739890f07SSrikanth Yalavarthi 	struct rte_ml_op_error error;
24839890f07SSrikanth Yalavarthi 	struct ml_core_args *args;
24939890f07SSrikanth Yalavarthi 	struct ml_request *req;
25039890f07SSrikanth Yalavarthi 	uint64_t total_deq = 0;
25139890f07SSrikanth Yalavarthi 	uint16_t burst_deq = 0;
25239890f07SSrikanth Yalavarthi 	uint8_t nb_filelist;
2535a82bc33SSrikanth Yalavarthi 	uint64_t end_cycle;
25439890f07SSrikanth Yalavarthi 	uint32_t lcore_id;
25539890f07SSrikanth Yalavarthi 	uint32_t i;
25639890f07SSrikanth Yalavarthi 
25739890f07SSrikanth Yalavarthi 	lcore_id = rte_lcore_id();
25839890f07SSrikanth Yalavarthi 	args = &t->args[lcore_id];
2595a82bc33SSrikanth Yalavarthi 	args->end_cycles = 0;
26039890f07SSrikanth Yalavarthi 	nb_filelist = args->end_fid - args->start_fid + 1;
26139890f07SSrikanth Yalavarthi 
26239890f07SSrikanth Yalavarthi 	if (args->nb_reqs == 0)
26339890f07SSrikanth Yalavarthi 		return 0;
26439890f07SSrikanth Yalavarthi 
26539890f07SSrikanth Yalavarthi dequeue_burst:
266c0e87165SSrikanth Yalavarthi 	burst_deq = rte_ml_dequeue_burst(t->cmn.opt->dev_id, args->qp_id, args->deq_ops,
267c0e87165SSrikanth Yalavarthi 					 t->cmn.opt->burst_size);
2685a82bc33SSrikanth Yalavarthi 	end_cycle = rte_get_tsc_cycles();
26939890f07SSrikanth Yalavarthi 
27039890f07SSrikanth Yalavarthi 	if (likely(burst_deq > 0)) {
27139890f07SSrikanth Yalavarthi 		total_deq += burst_deq;
2725a82bc33SSrikanth Yalavarthi 		args->end_cycles += burst_deq * end_cycle;
27339890f07SSrikanth Yalavarthi 
27439890f07SSrikanth Yalavarthi 		for (i = 0; i < burst_deq; i++) {
27539890f07SSrikanth Yalavarthi 			if (unlikely(args->deq_ops[i]->status == RTE_ML_OP_STATUS_ERROR)) {
27639890f07SSrikanth Yalavarthi 				rte_ml_op_error_get(t->cmn.opt->dev_id, args->deq_ops[i], &error);
27739890f07SSrikanth Yalavarthi 				ml_err("error_code = 0x%" PRIx64 ", error_message = %s\n",
27839890f07SSrikanth Yalavarthi 				       error.errcode, error.message);
27939890f07SSrikanth Yalavarthi 				t->error_count[lcore_id]++;
28039890f07SSrikanth Yalavarthi 			}
28139890f07SSrikanth Yalavarthi 			req = (struct ml_request *)args->deq_ops[i]->user_ptr;
28239890f07SSrikanth Yalavarthi 			if (req != NULL)
28339890f07SSrikanth Yalavarthi 				rte_mempool_put(t->model[req->fid].io_pool, req);
28439890f07SSrikanth Yalavarthi 		}
28539890f07SSrikanth Yalavarthi 		rte_mempool_put_bulk(t->op_pool, (void *)args->deq_ops, burst_deq);
28639890f07SSrikanth Yalavarthi 	}
28739890f07SSrikanth Yalavarthi 
28839890f07SSrikanth Yalavarthi 	if (total_deq < args->nb_reqs * nb_filelist)
28939890f07SSrikanth Yalavarthi 		goto dequeue_burst;
29039890f07SSrikanth Yalavarthi 
29139890f07SSrikanth Yalavarthi 	return 0;
29239890f07SSrikanth Yalavarthi }
29339890f07SSrikanth Yalavarthi 
294bbd272edSSrikanth Yalavarthi bool
295bbd272edSSrikanth Yalavarthi test_inference_cap_check(struct ml_options *opt)
296bbd272edSSrikanth Yalavarthi {
297bbd272edSSrikanth Yalavarthi 	struct rte_ml_dev_info dev_info;
298bbd272edSSrikanth Yalavarthi 
299bbd272edSSrikanth Yalavarthi 	if (!ml_test_cap_check(opt))
300bbd272edSSrikanth Yalavarthi 		return false;
301bbd272edSSrikanth Yalavarthi 
302bbd272edSSrikanth Yalavarthi 	rte_ml_dev_info_get(opt->dev_id, &dev_info);
303c0e87165SSrikanth Yalavarthi 
304c0e87165SSrikanth Yalavarthi 	if (opt->queue_pairs > dev_info.max_queue_pairs) {
305c0e87165SSrikanth Yalavarthi 		ml_err("Insufficient capabilities: queue_pairs = %u, max_queue_pairs = %u",
306c0e87165SSrikanth Yalavarthi 		       opt->queue_pairs, dev_info.max_queue_pairs);
307c0e87165SSrikanth Yalavarthi 		return false;
308c0e87165SSrikanth Yalavarthi 	}
309c0e87165SSrikanth Yalavarthi 
310c0e87165SSrikanth Yalavarthi 	if (opt->queue_size > dev_info.max_desc) {
311c0e87165SSrikanth Yalavarthi 		ml_err("Insufficient capabilities: queue_size = %u, max_desc = %u", opt->queue_size,
312c0e87165SSrikanth Yalavarthi 		       dev_info.max_desc);
313c0e87165SSrikanth Yalavarthi 		return false;
314c0e87165SSrikanth Yalavarthi 	}
315c0e87165SSrikanth Yalavarthi 
316bbd272edSSrikanth Yalavarthi 	if (opt->nb_filelist > dev_info.max_models) {
317bbd272edSSrikanth Yalavarthi 		ml_err("Insufficient capabilities:  Filelist count exceeded device limit, count = %u (max limit = %u)",
318bbd272edSSrikanth Yalavarthi 		       opt->nb_filelist, dev_info.max_models);
319bbd272edSSrikanth Yalavarthi 		return false;
320bbd272edSSrikanth Yalavarthi 	}
321bbd272edSSrikanth Yalavarthi 
322bbd272edSSrikanth Yalavarthi 	return true;
323bbd272edSSrikanth Yalavarthi }
324bbd272edSSrikanth Yalavarthi 
325bbd272edSSrikanth Yalavarthi int
326bbd272edSSrikanth Yalavarthi test_inference_opt_check(struct ml_options *opt)
327bbd272edSSrikanth Yalavarthi {
328bbd272edSSrikanth Yalavarthi 	uint32_t i;
329bbd272edSSrikanth Yalavarthi 	int ret;
330bbd272edSSrikanth Yalavarthi 
331bbd272edSSrikanth Yalavarthi 	/* check common opts */
332bbd272edSSrikanth Yalavarthi 	ret = ml_test_opt_check(opt);
333bbd272edSSrikanth Yalavarthi 	if (ret != 0)
334bbd272edSSrikanth Yalavarthi 		return ret;
335bbd272edSSrikanth Yalavarthi 
336a1474e13SSrikanth Yalavarthi 	/* check for at least one filelist */
337a1474e13SSrikanth Yalavarthi 	if (opt->nb_filelist == 0) {
338a1474e13SSrikanth Yalavarthi 		ml_err("Filelist empty, need at least one filelist to run the test\n");
339a1474e13SSrikanth Yalavarthi 		return -EINVAL;
340a1474e13SSrikanth Yalavarthi 	}
341a1474e13SSrikanth Yalavarthi 
342bbd272edSSrikanth Yalavarthi 	/* check file availability */
343bbd272edSSrikanth Yalavarthi 	for (i = 0; i < opt->nb_filelist; i++) {
344bbd272edSSrikanth Yalavarthi 		if (access(opt->filelist[i].model, F_OK) == -1) {
345bbd272edSSrikanth Yalavarthi 			ml_err("Model file not accessible: id = %u, file = %s", i,
346bbd272edSSrikanth Yalavarthi 			       opt->filelist[i].model);
347bbd272edSSrikanth Yalavarthi 			return -ENOENT;
348bbd272edSSrikanth Yalavarthi 		}
349bbd272edSSrikanth Yalavarthi 
350bbd272edSSrikanth Yalavarthi 		if (access(opt->filelist[i].input, F_OK) == -1) {
351bbd272edSSrikanth Yalavarthi 			ml_err("Input file not accessible: id = %u, file = %s", i,
352bbd272edSSrikanth Yalavarthi 			       opt->filelist[i].input);
353bbd272edSSrikanth Yalavarthi 			return -ENOENT;
354bbd272edSSrikanth Yalavarthi 		}
355bbd272edSSrikanth Yalavarthi 	}
356bbd272edSSrikanth Yalavarthi 
357bbd272edSSrikanth Yalavarthi 	if (opt->repetitions == 0) {
358bbd272edSSrikanth Yalavarthi 		ml_err("Invalid option, repetitions = %" PRIu64 "\n", opt->repetitions);
359bbd272edSSrikanth Yalavarthi 		return -EINVAL;
360bbd272edSSrikanth Yalavarthi 	}
361bbd272edSSrikanth Yalavarthi 
36239890f07SSrikanth Yalavarthi 	if (opt->burst_size == 0) {
36339890f07SSrikanth Yalavarthi 		ml_err("Invalid option, burst_size = %u\n", opt->burst_size);
36439890f07SSrikanth Yalavarthi 		return -EINVAL;
36539890f07SSrikanth Yalavarthi 	}
36639890f07SSrikanth Yalavarthi 
36739890f07SSrikanth Yalavarthi 	if (opt->burst_size > ML_TEST_MAX_POOL_SIZE) {
36839890f07SSrikanth Yalavarthi 		ml_err("Invalid option, burst_size = %u (> max supported = %d)\n", opt->burst_size,
36939890f07SSrikanth Yalavarthi 		       ML_TEST_MAX_POOL_SIZE);
37039890f07SSrikanth Yalavarthi 		return -EINVAL;
37139890f07SSrikanth Yalavarthi 	}
37239890f07SSrikanth Yalavarthi 
373c0e87165SSrikanth Yalavarthi 	if (opt->queue_pairs == 0) {
374c0e87165SSrikanth Yalavarthi 		ml_err("Invalid option, queue_pairs = %u\n", opt->queue_pairs);
375c0e87165SSrikanth Yalavarthi 		return -EINVAL;
376c0e87165SSrikanth Yalavarthi 	}
377c0e87165SSrikanth Yalavarthi 
378c0e87165SSrikanth Yalavarthi 	if (opt->queue_size == 0) {
379c0e87165SSrikanth Yalavarthi 		ml_err("Invalid option, queue_size = %u\n", opt->queue_size);
380c0e87165SSrikanth Yalavarthi 		return -EINVAL;
381c0e87165SSrikanth Yalavarthi 	}
382c0e87165SSrikanth Yalavarthi 
383bbd272edSSrikanth Yalavarthi 	/* check number of available lcores. */
384c0e87165SSrikanth Yalavarthi 	if (rte_lcore_count() < (uint32_t)(opt->queue_pairs * 2 + 1)) {
385bbd272edSSrikanth Yalavarthi 		ml_err("Insufficient lcores = %u\n", rte_lcore_count());
386c0e87165SSrikanth Yalavarthi 		ml_err("Minimum lcores required to create %u queue-pairs = %u\n", opt->queue_pairs,
387c0e87165SSrikanth Yalavarthi 		       (opt->queue_pairs * 2 + 1));
388bbd272edSSrikanth Yalavarthi 		return -EINVAL;
389bbd272edSSrikanth Yalavarthi 	}
390bbd272edSSrikanth Yalavarthi 
391bbd272edSSrikanth Yalavarthi 	return 0;
392bbd272edSSrikanth Yalavarthi }
393bbd272edSSrikanth Yalavarthi 
394bbd272edSSrikanth Yalavarthi void
395bbd272edSSrikanth Yalavarthi test_inference_opt_dump(struct ml_options *opt)
396bbd272edSSrikanth Yalavarthi {
397bbd272edSSrikanth Yalavarthi 	uint32_t i;
398bbd272edSSrikanth Yalavarthi 
399bbd272edSSrikanth Yalavarthi 	/* dump common opts */
400bbd272edSSrikanth Yalavarthi 	ml_test_opt_dump(opt);
401bbd272edSSrikanth Yalavarthi 
402bbd272edSSrikanth Yalavarthi 	/* dump test opts */
403bbd272edSSrikanth Yalavarthi 	ml_dump("repetitions", "%" PRIu64, opt->repetitions);
40439890f07SSrikanth Yalavarthi 	ml_dump("burst_size", "%u", opt->burst_size);
405c0e87165SSrikanth Yalavarthi 	ml_dump("queue_pairs", "%u", opt->queue_pairs);
406c0e87165SSrikanth Yalavarthi 	ml_dump("queue_size", "%u", opt->queue_size);
407da679339SSrikanth Yalavarthi 	ml_dump("tolerance", "%-7.3f", opt->tolerance);
4085a82bc33SSrikanth Yalavarthi 	ml_dump("stats", "%s", (opt->stats ? "true" : "false"));
409bbd272edSSrikanth Yalavarthi 
41038e884b5SSrikanth Yalavarthi 	if (opt->batches == 0)
41138e884b5SSrikanth Yalavarthi 		ml_dump("batches", "%u (default)", opt->batches);
41238e884b5SSrikanth Yalavarthi 	else
41338e884b5SSrikanth Yalavarthi 		ml_dump("batches", "%u", opt->batches);
41438e884b5SSrikanth Yalavarthi 
415bbd272edSSrikanth Yalavarthi 	ml_dump_begin("filelist");
416bbd272edSSrikanth Yalavarthi 	for (i = 0; i < opt->nb_filelist; i++) {
417bbd272edSSrikanth Yalavarthi 		ml_dump_list("model", i, opt->filelist[i].model);
418bbd272edSSrikanth Yalavarthi 		ml_dump_list("input", i, opt->filelist[i].input);
419bbd272edSSrikanth Yalavarthi 		ml_dump_list("output", i, opt->filelist[i].output);
420da679339SSrikanth Yalavarthi 		if (strcmp(opt->filelist[i].reference, "\0") != 0)
421da679339SSrikanth Yalavarthi 			ml_dump_list("reference", i, opt->filelist[i].reference);
422bbd272edSSrikanth Yalavarthi 	}
423bbd272edSSrikanth Yalavarthi 	ml_dump_end;
424bbd272edSSrikanth Yalavarthi }
425bbd272edSSrikanth Yalavarthi 
426bbd272edSSrikanth Yalavarthi int
427bbd272edSSrikanth Yalavarthi test_inference_setup(struct ml_test *test, struct ml_options *opt)
428bbd272edSSrikanth Yalavarthi {
429bbd272edSSrikanth Yalavarthi 	struct test_inference *t;
430bbd272edSSrikanth Yalavarthi 	void *test_inference;
43139890f07SSrikanth Yalavarthi 	uint32_t lcore_id;
432bbd272edSSrikanth Yalavarthi 	int ret = 0;
433bbd272edSSrikanth Yalavarthi 	uint32_t i;
434bbd272edSSrikanth Yalavarthi 
435bbd272edSSrikanth Yalavarthi 	test_inference = rte_zmalloc_socket(test->name, sizeof(struct test_inference),
436bbd272edSSrikanth Yalavarthi 					    RTE_CACHE_LINE_SIZE, opt->socket_id);
437bbd272edSSrikanth Yalavarthi 	if (test_inference == NULL) {
438bbd272edSSrikanth Yalavarthi 		ml_err("failed to allocate memory for test_model");
439bbd272edSSrikanth Yalavarthi 		ret = -ENOMEM;
440bbd272edSSrikanth Yalavarthi 		goto error;
441bbd272edSSrikanth Yalavarthi 	}
442bbd272edSSrikanth Yalavarthi 	test->test_priv = test_inference;
443bbd272edSSrikanth Yalavarthi 	t = ml_test_priv(test);
444bbd272edSSrikanth Yalavarthi 
445bbd272edSSrikanth Yalavarthi 	t->nb_used = 0;
446da679339SSrikanth Yalavarthi 	t->nb_valid = 0;
447bbd272edSSrikanth Yalavarthi 	t->cmn.result = ML_TEST_FAILED;
448bbd272edSSrikanth Yalavarthi 	t->cmn.opt = opt;
449bbd272edSSrikanth Yalavarthi 	memset(t->error_count, 0, RTE_MAX_LCORE * sizeof(uint64_t));
450bbd272edSSrikanth Yalavarthi 
451bbd272edSSrikanth Yalavarthi 	/* get device info */
452bbd272edSSrikanth Yalavarthi 	ret = rte_ml_dev_info_get(opt->dev_id, &t->cmn.dev_info);
453bbd272edSSrikanth Yalavarthi 	if (ret < 0) {
454bbd272edSSrikanth Yalavarthi 		ml_err("failed to get device info");
455bbd272edSSrikanth Yalavarthi 		goto error;
456bbd272edSSrikanth Yalavarthi 	}
457bbd272edSSrikanth Yalavarthi 
45839890f07SSrikanth Yalavarthi 	if (opt->burst_size == 1) {
459bbd272edSSrikanth Yalavarthi 		t->enqueue = ml_enqueue_single;
460bbd272edSSrikanth Yalavarthi 		t->dequeue = ml_dequeue_single;
46139890f07SSrikanth Yalavarthi 	} else {
46239890f07SSrikanth Yalavarthi 		t->enqueue = ml_enqueue_burst;
46339890f07SSrikanth Yalavarthi 		t->dequeue = ml_dequeue_burst;
46439890f07SSrikanth Yalavarthi 	}
465bbd272edSSrikanth Yalavarthi 
466bbd272edSSrikanth Yalavarthi 	/* set model initial state */
467bbd272edSSrikanth Yalavarthi 	for (i = 0; i < opt->nb_filelist; i++)
468bbd272edSSrikanth Yalavarthi 		t->model[i].state = MODEL_INITIAL;
469bbd272edSSrikanth Yalavarthi 
47039890f07SSrikanth Yalavarthi 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
47139890f07SSrikanth Yalavarthi 		t->args[lcore_id].enq_ops = rte_zmalloc_socket(
47239890f07SSrikanth Yalavarthi 			"ml_test_enq_ops", opt->burst_size * sizeof(struct rte_ml_op *),
47339890f07SSrikanth Yalavarthi 			RTE_CACHE_LINE_SIZE, opt->socket_id);
47439890f07SSrikanth Yalavarthi 		t->args[lcore_id].deq_ops = rte_zmalloc_socket(
47539890f07SSrikanth Yalavarthi 			"ml_test_deq_ops", opt->burst_size * sizeof(struct rte_ml_op *),
47639890f07SSrikanth Yalavarthi 			RTE_CACHE_LINE_SIZE, opt->socket_id);
47739890f07SSrikanth Yalavarthi 		t->args[lcore_id].reqs = rte_zmalloc_socket(
47839890f07SSrikanth Yalavarthi 			"ml_test_requests", opt->burst_size * sizeof(struct ml_request *),
47939890f07SSrikanth Yalavarthi 			RTE_CACHE_LINE_SIZE, opt->socket_id);
48039890f07SSrikanth Yalavarthi 	}
48139890f07SSrikanth Yalavarthi 
4825a82bc33SSrikanth Yalavarthi 	for (i = 0; i < RTE_MAX_LCORE; i++) {
4835a82bc33SSrikanth Yalavarthi 		t->args[i].start_cycles = 0;
4845a82bc33SSrikanth Yalavarthi 		t->args[i].end_cycles = 0;
4855a82bc33SSrikanth Yalavarthi 	}
4865a82bc33SSrikanth Yalavarthi 
487bbd272edSSrikanth Yalavarthi 	return 0;
488bbd272edSSrikanth Yalavarthi 
489bbd272edSSrikanth Yalavarthi error:
490bbd272edSSrikanth Yalavarthi 	rte_free(test_inference);
491bbd272edSSrikanth Yalavarthi 
492bbd272edSSrikanth Yalavarthi 	return ret;
493bbd272edSSrikanth Yalavarthi }
494bbd272edSSrikanth Yalavarthi 
495bbd272edSSrikanth Yalavarthi void
496bbd272edSSrikanth Yalavarthi test_inference_destroy(struct ml_test *test, struct ml_options *opt)
497bbd272edSSrikanth Yalavarthi {
498bbd272edSSrikanth Yalavarthi 	struct test_inference *t;
499bbd272edSSrikanth Yalavarthi 
500bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(opt);
501bbd272edSSrikanth Yalavarthi 
502bbd272edSSrikanth Yalavarthi 	t = ml_test_priv(test);
503bbd272edSSrikanth Yalavarthi 	rte_free(t);
504bbd272edSSrikanth Yalavarthi }
505bbd272edSSrikanth Yalavarthi 
506bbd272edSSrikanth Yalavarthi int
507bbd272edSSrikanth Yalavarthi ml_inference_mldev_setup(struct ml_test *test, struct ml_options *opt)
508bbd272edSSrikanth Yalavarthi {
509bbd272edSSrikanth Yalavarthi 	struct rte_ml_dev_qp_conf qp_conf;
510bbd272edSSrikanth Yalavarthi 	struct test_inference *t;
511c0e87165SSrikanth Yalavarthi 	uint16_t qp_id;
512bbd272edSSrikanth Yalavarthi 	int ret;
513bbd272edSSrikanth Yalavarthi 
514bbd272edSSrikanth Yalavarthi 	t = ml_test_priv(test);
515bbd272edSSrikanth Yalavarthi 
516c0e87165SSrikanth Yalavarthi 	RTE_SET_USED(t);
517c0e87165SSrikanth Yalavarthi 
518bbd272edSSrikanth Yalavarthi 	ret = ml_test_device_configure(test, opt);
519bbd272edSSrikanth Yalavarthi 	if (ret != 0)
520bbd272edSSrikanth Yalavarthi 		return ret;
521bbd272edSSrikanth Yalavarthi 
522bbd272edSSrikanth Yalavarthi 	/* setup queue pairs */
523c0e87165SSrikanth Yalavarthi 	qp_conf.nb_desc = opt->queue_size;
524bbd272edSSrikanth Yalavarthi 	qp_conf.cb = NULL;
525bbd272edSSrikanth Yalavarthi 
526c0e87165SSrikanth Yalavarthi 	for (qp_id = 0; qp_id < opt->queue_pairs; qp_id++) {
527c0e87165SSrikanth Yalavarthi 		qp_conf.nb_desc = opt->queue_size;
528c0e87165SSrikanth Yalavarthi 		qp_conf.cb = NULL;
529c0e87165SSrikanth Yalavarthi 
530c0e87165SSrikanth Yalavarthi 		ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, opt->socket_id);
531bbd272edSSrikanth Yalavarthi 		if (ret != 0) {
532bbd272edSSrikanth Yalavarthi 			ml_err("Failed to setup ml device queue-pair, dev_id = %d, qp_id = %u\n",
533c0e87165SSrikanth Yalavarthi 			       opt->dev_id, qp_id);
534c0e87165SSrikanth Yalavarthi 			return ret;
535c0e87165SSrikanth Yalavarthi 		}
536bbd272edSSrikanth Yalavarthi 	}
537bbd272edSSrikanth Yalavarthi 
538bbd272edSSrikanth Yalavarthi 	ret = ml_test_device_start(test, opt);
539bbd272edSSrikanth Yalavarthi 	if (ret != 0)
540bbd272edSSrikanth Yalavarthi 		goto error;
541bbd272edSSrikanth Yalavarthi 
542bbd272edSSrikanth Yalavarthi 	return 0;
543bbd272edSSrikanth Yalavarthi 
544bbd272edSSrikanth Yalavarthi error:
545bbd272edSSrikanth Yalavarthi 	ml_test_device_close(test, opt);
546bbd272edSSrikanth Yalavarthi 
547bbd272edSSrikanth Yalavarthi 	return ret;
548bbd272edSSrikanth Yalavarthi }
549bbd272edSSrikanth Yalavarthi 
550bbd272edSSrikanth Yalavarthi int
551bbd272edSSrikanth Yalavarthi ml_inference_mldev_destroy(struct ml_test *test, struct ml_options *opt)
552bbd272edSSrikanth Yalavarthi {
553bbd272edSSrikanth Yalavarthi 	int ret;
554bbd272edSSrikanth Yalavarthi 
555bbd272edSSrikanth Yalavarthi 	ret = ml_test_device_stop(test, opt);
556bbd272edSSrikanth Yalavarthi 	if (ret != 0)
557bbd272edSSrikanth Yalavarthi 		goto error;
558bbd272edSSrikanth Yalavarthi 
559bbd272edSSrikanth Yalavarthi 	ret = ml_test_device_close(test, opt);
560bbd272edSSrikanth Yalavarthi 	if (ret != 0)
561bbd272edSSrikanth Yalavarthi 		return ret;
562bbd272edSSrikanth Yalavarthi 
563bbd272edSSrikanth Yalavarthi 	return 0;
564bbd272edSSrikanth Yalavarthi 
565bbd272edSSrikanth Yalavarthi error:
566bbd272edSSrikanth Yalavarthi 	ml_test_device_close(test, opt);
567bbd272edSSrikanth Yalavarthi 
568bbd272edSSrikanth Yalavarthi 	return ret;
569bbd272edSSrikanth Yalavarthi }
570bbd272edSSrikanth Yalavarthi 
571bbd272edSSrikanth Yalavarthi /* Callback for IO pool create. This function would compute the fields of ml_request
572bbd272edSSrikanth Yalavarthi  * structure and prepare the quantized input data.
573bbd272edSSrikanth Yalavarthi  */
574bbd272edSSrikanth Yalavarthi static void
575bbd272edSSrikanth Yalavarthi ml_request_initialize(struct rte_mempool *mp, void *opaque, void *obj, unsigned int obj_idx)
576bbd272edSSrikanth Yalavarthi {
577bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv((struct ml_test *)opaque);
578bbd272edSSrikanth Yalavarthi 	struct ml_request *req = (struct ml_request *)obj;
579bbd272edSSrikanth Yalavarthi 
580bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(mp);
581bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(obj_idx);
582bbd272edSSrikanth Yalavarthi 
583bbd272edSSrikanth Yalavarthi 	req->input = (uint8_t *)obj +
584bbd272edSSrikanth Yalavarthi 		     RTE_ALIGN_CEIL(sizeof(struct ml_request), t->cmn.dev_info.min_align_size);
585bbd272edSSrikanth Yalavarthi 	req->output = req->input +
586bbd272edSSrikanth Yalavarthi 		      RTE_ALIGN_CEIL(t->model[t->fid].inp_qsize, t->cmn.dev_info.min_align_size);
587bbd272edSSrikanth Yalavarthi 	req->niters = 0;
588bbd272edSSrikanth Yalavarthi 
589bbd272edSSrikanth Yalavarthi 	/* quantize data */
59038e884b5SSrikanth Yalavarthi 	rte_ml_io_quantize(t->cmn.opt->dev_id, t->model[t->fid].id, t->model[t->fid].nb_batches,
59138e884b5SSrikanth Yalavarthi 			   t->model[t->fid].input, req->input);
592bbd272edSSrikanth Yalavarthi }
593bbd272edSSrikanth Yalavarthi 
594bbd272edSSrikanth Yalavarthi int
595bbd272edSSrikanth Yalavarthi ml_inference_iomem_setup(struct ml_test *test, struct ml_options *opt, uint16_t fid)
596bbd272edSSrikanth Yalavarthi {
597bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv(test);
598bbd272edSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
599bbd272edSSrikanth Yalavarthi 	char mp_name[RTE_MEMPOOL_NAMESIZE];
600bbd272edSSrikanth Yalavarthi 	const struct rte_memzone *mz;
601bbd272edSSrikanth Yalavarthi 	uint64_t nb_buffers;
602*fccf444cSSrikanth Yalavarthi 	char *buffer = NULL;
603bbd272edSSrikanth Yalavarthi 	uint32_t buff_size;
604bbd272edSSrikanth Yalavarthi 	uint32_t mz_size;
605*fccf444cSSrikanth Yalavarthi 	size_t fsize;
606bbd272edSSrikanth Yalavarthi 	int ret;
607bbd272edSSrikanth Yalavarthi 
608bbd272edSSrikanth Yalavarthi 	/* get input buffer size */
60938e884b5SSrikanth Yalavarthi 	ret = rte_ml_io_input_size_get(opt->dev_id, t->model[fid].id, t->model[fid].nb_batches,
610bbd272edSSrikanth Yalavarthi 				       &t->model[fid].inp_qsize, &t->model[fid].inp_dsize);
611bbd272edSSrikanth Yalavarthi 	if (ret != 0) {
612bbd272edSSrikanth Yalavarthi 		ml_err("Failed to get input size, model : %s\n", opt->filelist[fid].model);
613bbd272edSSrikanth Yalavarthi 		return ret;
614bbd272edSSrikanth Yalavarthi 	}
615bbd272edSSrikanth Yalavarthi 
616bbd272edSSrikanth Yalavarthi 	/* get output buffer size */
61738e884b5SSrikanth Yalavarthi 	ret = rte_ml_io_output_size_get(opt->dev_id, t->model[fid].id, t->model[fid].nb_batches,
61838e884b5SSrikanth Yalavarthi 					&t->model[fid].out_qsize, &t->model[fid].out_dsize);
619bbd272edSSrikanth Yalavarthi 	if (ret != 0) {
620bbd272edSSrikanth Yalavarthi 		ml_err("Failed to get input size, model : %s\n", opt->filelist[fid].model);
621bbd272edSSrikanth Yalavarthi 		return ret;
622bbd272edSSrikanth Yalavarthi 	}
623bbd272edSSrikanth Yalavarthi 
624bbd272edSSrikanth Yalavarthi 	/* allocate buffer for user data */
625bbd272edSSrikanth Yalavarthi 	mz_size = t->model[fid].inp_dsize + t->model[fid].out_dsize;
626da679339SSrikanth Yalavarthi 	if (strcmp(opt->filelist[fid].reference, "\0") != 0)
627da679339SSrikanth Yalavarthi 		mz_size += t->model[fid].out_dsize;
628da679339SSrikanth Yalavarthi 
629bbd272edSSrikanth Yalavarthi 	sprintf(mz_name, "ml_user_data_%d", fid);
630bbd272edSSrikanth Yalavarthi 	mz = rte_memzone_reserve(mz_name, mz_size, opt->socket_id, 0);
631bbd272edSSrikanth Yalavarthi 	if (mz == NULL) {
632bbd272edSSrikanth Yalavarthi 		ml_err("Memzone allocation failed for ml_user_data\n");
633bbd272edSSrikanth Yalavarthi 		ret = -ENOMEM;
634bbd272edSSrikanth Yalavarthi 		goto error;
635bbd272edSSrikanth Yalavarthi 	}
636bbd272edSSrikanth Yalavarthi 
637bbd272edSSrikanth Yalavarthi 	t->model[fid].input = mz->addr;
638bbd272edSSrikanth Yalavarthi 	t->model[fid].output = t->model[fid].input + t->model[fid].inp_dsize;
639da679339SSrikanth Yalavarthi 	if (strcmp(opt->filelist[fid].reference, "\0") != 0)
640da679339SSrikanth Yalavarthi 		t->model[fid].reference = t->model[fid].output + t->model[fid].out_dsize;
641da679339SSrikanth Yalavarthi 	else
642da679339SSrikanth Yalavarthi 		t->model[fid].reference = NULL;
643bbd272edSSrikanth Yalavarthi 
644bbd272edSSrikanth Yalavarthi 	/* load input file */
645*fccf444cSSrikanth Yalavarthi 	ret = ml_read_file(opt->filelist[fid].input, &fsize, &buffer);
646*fccf444cSSrikanth Yalavarthi 	if (ret != 0)
647bbd272edSSrikanth Yalavarthi 		goto error;
648bbd272edSSrikanth Yalavarthi 
649*fccf444cSSrikanth Yalavarthi 	if (fsize == t->model[fid].inp_dsize) {
650*fccf444cSSrikanth Yalavarthi 		rte_memcpy(t->model[fid].input, buffer, fsize);
651*fccf444cSSrikanth Yalavarthi 		free(buffer);
652*fccf444cSSrikanth Yalavarthi 	} else {
653*fccf444cSSrikanth Yalavarthi 		ml_err("Invalid input file, size = %zu (expected size = %" PRIu64 ")\n", fsize,
654bbd272edSSrikanth Yalavarthi 		       t->model[fid].inp_dsize);
655bbd272edSSrikanth Yalavarthi 		ret = -EINVAL;
656bbd272edSSrikanth Yalavarthi 		goto error;
657bbd272edSSrikanth Yalavarthi 	}
658bbd272edSSrikanth Yalavarthi 
659da679339SSrikanth Yalavarthi 	/* load reference file */
660*fccf444cSSrikanth Yalavarthi 	buffer = NULL;
661da679339SSrikanth Yalavarthi 	if (t->model[fid].reference != NULL) {
662*fccf444cSSrikanth Yalavarthi 		ret = ml_read_file(opt->filelist[fid].reference, &fsize, &buffer);
663*fccf444cSSrikanth Yalavarthi 		if (ret != 0)
664da679339SSrikanth Yalavarthi 			goto error;
665da679339SSrikanth Yalavarthi 
666*fccf444cSSrikanth Yalavarthi 		if (fsize == t->model[fid].out_dsize) {
667*fccf444cSSrikanth Yalavarthi 			rte_memcpy(t->model[fid].reference, buffer, fsize);
668*fccf444cSSrikanth Yalavarthi 			free(buffer);
669*fccf444cSSrikanth Yalavarthi 		} else {
670*fccf444cSSrikanth Yalavarthi 			ml_err("Invalid reference file, size = %zu (expected size = %" PRIu64 ")\n",
671*fccf444cSSrikanth Yalavarthi 			       fsize, t->model[fid].out_dsize);
672*fccf444cSSrikanth Yalavarthi 			ret = -EINVAL;
673da679339SSrikanth Yalavarthi 			goto error;
674da679339SSrikanth Yalavarthi 		}
675da679339SSrikanth Yalavarthi 	}
676da679339SSrikanth Yalavarthi 
677bbd272edSSrikanth Yalavarthi 	/* create mempool for quantized input and output buffers. ml_request_initialize is
678bbd272edSSrikanth Yalavarthi 	 * used as a callback for object creation.
679bbd272edSSrikanth Yalavarthi 	 */
680bbd272edSSrikanth Yalavarthi 	buff_size = RTE_ALIGN_CEIL(sizeof(struct ml_request), t->cmn.dev_info.min_align_size) +
681bbd272edSSrikanth Yalavarthi 		    RTE_ALIGN_CEIL(t->model[fid].inp_qsize, t->cmn.dev_info.min_align_size) +
682bbd272edSSrikanth Yalavarthi 		    RTE_ALIGN_CEIL(t->model[fid].out_qsize, t->cmn.dev_info.min_align_size);
683bbd272edSSrikanth Yalavarthi 	nb_buffers = RTE_MIN((uint64_t)ML_TEST_MAX_POOL_SIZE, opt->repetitions);
684bbd272edSSrikanth Yalavarthi 
685bbd272edSSrikanth Yalavarthi 	t->fid = fid;
686bbd272edSSrikanth Yalavarthi 	sprintf(mp_name, "ml_io_pool_%d", fid);
687bbd272edSSrikanth Yalavarthi 	t->model[fid].io_pool = rte_mempool_create(mp_name, nb_buffers, buff_size, 0, 0, NULL, NULL,
688bbd272edSSrikanth Yalavarthi 						   ml_request_initialize, test, opt->socket_id, 0);
689bbd272edSSrikanth Yalavarthi 	if (t->model[fid].io_pool == NULL) {
690bbd272edSSrikanth Yalavarthi 		ml_err("Failed to create io pool : %s\n", "ml_io_pool");
691bbd272edSSrikanth Yalavarthi 		ret = -ENOMEM;
692bbd272edSSrikanth Yalavarthi 		goto error;
693bbd272edSSrikanth Yalavarthi 	}
694bbd272edSSrikanth Yalavarthi 
695bbd272edSSrikanth Yalavarthi 	return 0;
696bbd272edSSrikanth Yalavarthi 
697bbd272edSSrikanth Yalavarthi error:
698bbd272edSSrikanth Yalavarthi 	if (mz != NULL)
699bbd272edSSrikanth Yalavarthi 		rte_memzone_free(mz);
700bbd272edSSrikanth Yalavarthi 
701bbd272edSSrikanth Yalavarthi 	if (t->model[fid].io_pool != NULL) {
702bbd272edSSrikanth Yalavarthi 		rte_mempool_free(t->model[fid].io_pool);
703bbd272edSSrikanth Yalavarthi 		t->model[fid].io_pool = NULL;
704bbd272edSSrikanth Yalavarthi 	}
705bbd272edSSrikanth Yalavarthi 
706*fccf444cSSrikanth Yalavarthi 	free(buffer);
707*fccf444cSSrikanth Yalavarthi 
708bbd272edSSrikanth Yalavarthi 	return ret;
709bbd272edSSrikanth Yalavarthi }
710bbd272edSSrikanth Yalavarthi 
711bbd272edSSrikanth Yalavarthi void
712bbd272edSSrikanth Yalavarthi ml_inference_iomem_destroy(struct ml_test *test, struct ml_options *opt, uint16_t fid)
713bbd272edSSrikanth Yalavarthi {
714bbd272edSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
715bbd272edSSrikanth Yalavarthi 	char mp_name[RTE_MEMPOOL_NAMESIZE];
716bbd272edSSrikanth Yalavarthi 	const struct rte_memzone *mz;
717bbd272edSSrikanth Yalavarthi 	struct rte_mempool *mp;
718bbd272edSSrikanth Yalavarthi 
719bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(test);
720bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(opt);
721bbd272edSSrikanth Yalavarthi 
722bbd272edSSrikanth Yalavarthi 	/* release user data memzone */
723bbd272edSSrikanth Yalavarthi 	sprintf(mz_name, "ml_user_data_%d", fid);
724bbd272edSSrikanth Yalavarthi 	mz = rte_memzone_lookup(mz_name);
725bbd272edSSrikanth Yalavarthi 	if (mz != NULL)
726bbd272edSSrikanth Yalavarthi 		rte_memzone_free(mz);
727bbd272edSSrikanth Yalavarthi 
728bbd272edSSrikanth Yalavarthi 	/* destroy io pool */
729bbd272edSSrikanth Yalavarthi 	sprintf(mp_name, "ml_io_pool_%d", fid);
730bbd272edSSrikanth Yalavarthi 	mp = rte_mempool_lookup(mp_name);
731bbd272edSSrikanth Yalavarthi 	rte_mempool_free(mp);
732bbd272edSSrikanth Yalavarthi }
733bbd272edSSrikanth Yalavarthi 
734bbd272edSSrikanth Yalavarthi int
735bbd272edSSrikanth Yalavarthi ml_inference_mem_setup(struct ml_test *test, struct ml_options *opt)
736bbd272edSSrikanth Yalavarthi {
737bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv(test);
738bbd272edSSrikanth Yalavarthi 
739bbd272edSSrikanth Yalavarthi 	/* create op pool */
740bbd272edSSrikanth Yalavarthi 	t->op_pool = rte_ml_op_pool_create("ml_test_op_pool", ML_TEST_MAX_POOL_SIZE, 0, 0,
741bbd272edSSrikanth Yalavarthi 					   opt->socket_id);
742bbd272edSSrikanth Yalavarthi 	if (t->op_pool == NULL) {
743bbd272edSSrikanth Yalavarthi 		ml_err("Failed to create op pool : %s\n", "ml_op_pool");
744bbd272edSSrikanth Yalavarthi 		return -ENOMEM;
745bbd272edSSrikanth Yalavarthi 	}
746bbd272edSSrikanth Yalavarthi 
747bbd272edSSrikanth Yalavarthi 	return 0;
748bbd272edSSrikanth Yalavarthi }
749bbd272edSSrikanth Yalavarthi 
750bbd272edSSrikanth Yalavarthi void
751bbd272edSSrikanth Yalavarthi ml_inference_mem_destroy(struct ml_test *test, struct ml_options *opt)
752bbd272edSSrikanth Yalavarthi {
753bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv(test);
754bbd272edSSrikanth Yalavarthi 
755bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(opt);
756bbd272edSSrikanth Yalavarthi 
757bbd272edSSrikanth Yalavarthi 	/* release op pool */
758bbd272edSSrikanth Yalavarthi 	rte_mempool_free(t->op_pool);
759bbd272edSSrikanth Yalavarthi }
760bbd272edSSrikanth Yalavarthi 
761da679339SSrikanth Yalavarthi static bool
762da679339SSrikanth Yalavarthi ml_inference_validation(struct ml_test *test, struct ml_request *req)
763da679339SSrikanth Yalavarthi {
764da679339SSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv((struct ml_test *)test);
765da679339SSrikanth Yalavarthi 	struct ml_model *model;
766da679339SSrikanth Yalavarthi 	uint32_t nb_elements;
767da679339SSrikanth Yalavarthi 	uint8_t *reference;
768da679339SSrikanth Yalavarthi 	uint8_t *output;
769da679339SSrikanth Yalavarthi 	bool match;
770da679339SSrikanth Yalavarthi 	uint32_t i;
771da679339SSrikanth Yalavarthi 	uint32_t j;
772da679339SSrikanth Yalavarthi 
773da679339SSrikanth Yalavarthi 	model = &t->model[req->fid];
774da679339SSrikanth Yalavarthi 
775da679339SSrikanth Yalavarthi 	/* compare crc when tolerance is 0 */
776da679339SSrikanth Yalavarthi 	if (t->cmn.opt->tolerance == 0.0) {
777da679339SSrikanth Yalavarthi 		match = (rte_hash_crc(model->output, model->out_dsize, 0) ==
778da679339SSrikanth Yalavarthi 			 rte_hash_crc(model->reference, model->out_dsize, 0));
779da679339SSrikanth Yalavarthi 	} else {
780da679339SSrikanth Yalavarthi 		output = model->output;
781da679339SSrikanth Yalavarthi 		reference = model->reference;
782da679339SSrikanth Yalavarthi 
783da679339SSrikanth Yalavarthi 		i = 0;
784da679339SSrikanth Yalavarthi next_output:
785da679339SSrikanth Yalavarthi 		nb_elements =
786da679339SSrikanth Yalavarthi 			model->info.output_info[i].shape.w * model->info.output_info[i].shape.x *
787da679339SSrikanth Yalavarthi 			model->info.output_info[i].shape.y * model->info.output_info[i].shape.z;
788da679339SSrikanth Yalavarthi 		j = 0;
789da679339SSrikanth Yalavarthi next_element:
790da679339SSrikanth Yalavarthi 		match = false;
791da679339SSrikanth Yalavarthi 		switch (model->info.output_info[i].dtype) {
792da679339SSrikanth Yalavarthi 		case RTE_ML_IO_TYPE_INT8:
793da679339SSrikanth Yalavarthi 			if (ML_TEST_CHECK_OUTPUT(ML_TEST_READ_TYPE(output, int8_t),
794da679339SSrikanth Yalavarthi 						 ML_TEST_READ_TYPE(reference, int8_t),
795da679339SSrikanth Yalavarthi 						 t->cmn.opt->tolerance))
796da679339SSrikanth Yalavarthi 				match = true;
797da679339SSrikanth Yalavarthi 
798da679339SSrikanth Yalavarthi 			output += sizeof(int8_t);
799da679339SSrikanth Yalavarthi 			reference += sizeof(int8_t);
800da679339SSrikanth Yalavarthi 			break;
801da679339SSrikanth Yalavarthi 		case RTE_ML_IO_TYPE_UINT8:
802da679339SSrikanth Yalavarthi 			if (ML_TEST_CHECK_OUTPUT(ML_TEST_READ_TYPE(output, uint8_t),
803da679339SSrikanth Yalavarthi 						 ML_TEST_READ_TYPE(reference, uint8_t),
804da679339SSrikanth Yalavarthi 						 t->cmn.opt->tolerance))
805da679339SSrikanth Yalavarthi 				match = true;
806da679339SSrikanth Yalavarthi 
807da679339SSrikanth Yalavarthi 			output += sizeof(float);
808da679339SSrikanth Yalavarthi 			reference += sizeof(float);
809da679339SSrikanth Yalavarthi 			break;
810da679339SSrikanth Yalavarthi 		case RTE_ML_IO_TYPE_INT16:
811da679339SSrikanth Yalavarthi 			if (ML_TEST_CHECK_OUTPUT(ML_TEST_READ_TYPE(output, int16_t),
812da679339SSrikanth Yalavarthi 						 ML_TEST_READ_TYPE(reference, int16_t),
813da679339SSrikanth Yalavarthi 						 t->cmn.opt->tolerance))
814da679339SSrikanth Yalavarthi 				match = true;
815da679339SSrikanth Yalavarthi 
816da679339SSrikanth Yalavarthi 			output += sizeof(int16_t);
817da679339SSrikanth Yalavarthi 			reference += sizeof(int16_t);
818da679339SSrikanth Yalavarthi 			break;
819da679339SSrikanth Yalavarthi 		case RTE_ML_IO_TYPE_UINT16:
820da679339SSrikanth Yalavarthi 			if (ML_TEST_CHECK_OUTPUT(ML_TEST_READ_TYPE(output, uint16_t),
821da679339SSrikanth Yalavarthi 						 ML_TEST_READ_TYPE(reference, uint16_t),
822da679339SSrikanth Yalavarthi 						 t->cmn.opt->tolerance))
823da679339SSrikanth Yalavarthi 				match = true;
824da679339SSrikanth Yalavarthi 
825da679339SSrikanth Yalavarthi 			output += sizeof(uint16_t);
826da679339SSrikanth Yalavarthi 			reference += sizeof(uint16_t);
827da679339SSrikanth Yalavarthi 			break;
828da679339SSrikanth Yalavarthi 		case RTE_ML_IO_TYPE_INT32:
829da679339SSrikanth Yalavarthi 			if (ML_TEST_CHECK_OUTPUT(ML_TEST_READ_TYPE(output, int32_t),
830da679339SSrikanth Yalavarthi 						 ML_TEST_READ_TYPE(reference, int32_t),
831da679339SSrikanth Yalavarthi 						 t->cmn.opt->tolerance))
832da679339SSrikanth Yalavarthi 				match = true;
833da679339SSrikanth Yalavarthi 
834da679339SSrikanth Yalavarthi 			output += sizeof(int32_t);
835da679339SSrikanth Yalavarthi 			reference += sizeof(int32_t);
836da679339SSrikanth Yalavarthi 			break;
837da679339SSrikanth Yalavarthi 		case RTE_ML_IO_TYPE_UINT32:
838da679339SSrikanth Yalavarthi 			if (ML_TEST_CHECK_OUTPUT(ML_TEST_READ_TYPE(output, uint32_t),
839da679339SSrikanth Yalavarthi 						 ML_TEST_READ_TYPE(reference, uint32_t),
840da679339SSrikanth Yalavarthi 						 t->cmn.opt->tolerance))
841da679339SSrikanth Yalavarthi 				match = true;
842da679339SSrikanth Yalavarthi 
843da679339SSrikanth Yalavarthi 			output += sizeof(uint32_t);
844da679339SSrikanth Yalavarthi 			reference += sizeof(uint32_t);
845da679339SSrikanth Yalavarthi 			break;
846da679339SSrikanth Yalavarthi 		case RTE_ML_IO_TYPE_FP32:
847da679339SSrikanth Yalavarthi 			if (ML_TEST_CHECK_OUTPUT(ML_TEST_READ_TYPE(output, float),
848da679339SSrikanth Yalavarthi 						 ML_TEST_READ_TYPE(reference, float),
849da679339SSrikanth Yalavarthi 						 t->cmn.opt->tolerance))
850da679339SSrikanth Yalavarthi 				match = true;
851da679339SSrikanth Yalavarthi 
852da679339SSrikanth Yalavarthi 			output += sizeof(float);
853da679339SSrikanth Yalavarthi 			reference += sizeof(float);
854da679339SSrikanth Yalavarthi 			break;
855da679339SSrikanth Yalavarthi 		default: /* other types, fp8, fp16, bfloat16 */
856da679339SSrikanth Yalavarthi 			match = true;
857da679339SSrikanth Yalavarthi 		}
858da679339SSrikanth Yalavarthi 
859da679339SSrikanth Yalavarthi 		if (!match)
860da679339SSrikanth Yalavarthi 			goto done;
861da679339SSrikanth Yalavarthi 		j++;
862da679339SSrikanth Yalavarthi 		if (j < nb_elements)
863da679339SSrikanth Yalavarthi 			goto next_element;
864da679339SSrikanth Yalavarthi 
865da679339SSrikanth Yalavarthi 		i++;
866da679339SSrikanth Yalavarthi 		if (i < model->info.nb_outputs)
867da679339SSrikanth Yalavarthi 			goto next_output;
868da679339SSrikanth Yalavarthi 	}
869da679339SSrikanth Yalavarthi done:
870da679339SSrikanth Yalavarthi 	if (match)
871da679339SSrikanth Yalavarthi 		t->nb_valid++;
872da679339SSrikanth Yalavarthi 
873da679339SSrikanth Yalavarthi 	return match;
874da679339SSrikanth Yalavarthi }
875da679339SSrikanth Yalavarthi 
876bbd272edSSrikanth Yalavarthi /* Callback for mempool object iteration. This call would dequantize output data. */
877bbd272edSSrikanth Yalavarthi static void
878bbd272edSSrikanth Yalavarthi ml_request_finish(struct rte_mempool *mp, void *opaque, void *obj, unsigned int obj_idx)
879bbd272edSSrikanth Yalavarthi {
880bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv((struct ml_test *)opaque);
881bbd272edSSrikanth Yalavarthi 	struct ml_request *req = (struct ml_request *)obj;
882bbd272edSSrikanth Yalavarthi 	struct ml_model *model = &t->model[req->fid];
883da679339SSrikanth Yalavarthi 	bool error = false;
8848cb22a54SDavid Marchand 	char *dump_path;
885bbd272edSSrikanth Yalavarthi 
886bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(mp);
887bbd272edSSrikanth Yalavarthi 
888bbd272edSSrikanth Yalavarthi 	if (req->niters == 0)
889bbd272edSSrikanth Yalavarthi 		return;
890bbd272edSSrikanth Yalavarthi 
891bbd272edSSrikanth Yalavarthi 	t->nb_used++;
89238e884b5SSrikanth Yalavarthi 	rte_ml_io_dequantize(t->cmn.opt->dev_id, model->id, t->model[req->fid].nb_batches,
893bbd272edSSrikanth Yalavarthi 			     req->output, model->output);
894da679339SSrikanth Yalavarthi 
895da679339SSrikanth Yalavarthi 	if (model->reference == NULL) {
896da679339SSrikanth Yalavarthi 		t->nb_valid++;
897da679339SSrikanth Yalavarthi 		goto dump_output_pass;
898da679339SSrikanth Yalavarthi 	}
899da679339SSrikanth Yalavarthi 
900da679339SSrikanth Yalavarthi 	if (!ml_inference_validation(opaque, req))
901da679339SSrikanth Yalavarthi 		goto dump_output_fail;
902da679339SSrikanth Yalavarthi 	else
903da679339SSrikanth Yalavarthi 		goto dump_output_pass;
904da679339SSrikanth Yalavarthi 
905da679339SSrikanth Yalavarthi dump_output_pass:
906da679339SSrikanth Yalavarthi 	if (obj_idx == 0) {
907da679339SSrikanth Yalavarthi 		/* write quantized output */
9088cb22a54SDavid Marchand 		if (asprintf(&dump_path, "%s.q", t->cmn.opt->filelist[req->fid].output) == -1)
9098cb22a54SDavid Marchand 			return;
9108cb22a54SDavid Marchand 		ML_OPEN_WRITE_GET_ERR(dump_path, req->output, model->out_qsize, error);
9118cb22a54SDavid Marchand 		free(dump_path);
912da679339SSrikanth Yalavarthi 		if (error)
913da679339SSrikanth Yalavarthi 			return;
914da679339SSrikanth Yalavarthi 
915da679339SSrikanth Yalavarthi 		/* write dequantized output */
9168cb22a54SDavid Marchand 		if (asprintf(&dump_path, "%s", t->cmn.opt->filelist[req->fid].output) == -1)
9178cb22a54SDavid Marchand 			return;
9188cb22a54SDavid Marchand 		ML_OPEN_WRITE_GET_ERR(dump_path, model->output, model->out_dsize, error);
9198cb22a54SDavid Marchand 		free(dump_path);
920da679339SSrikanth Yalavarthi 		if (error)
921da679339SSrikanth Yalavarthi 			return;
922da679339SSrikanth Yalavarthi 	}
923da679339SSrikanth Yalavarthi 
924da679339SSrikanth Yalavarthi 	return;
925da679339SSrikanth Yalavarthi 
926da679339SSrikanth Yalavarthi dump_output_fail:
927da679339SSrikanth Yalavarthi 	if (t->cmn.opt->debug) {
928da679339SSrikanth Yalavarthi 		/* dump quantized output buffer */
9298cb22a54SDavid Marchand 		if (asprintf(&dump_path, "%s.q.%u", t->cmn.opt->filelist[req->fid].output,
9308cb22a54SDavid Marchand 			     obj_idx) == -1)
9318cb22a54SDavid Marchand 			return;
9328cb22a54SDavid Marchand 		ML_OPEN_WRITE_GET_ERR(dump_path, req->output, model->out_qsize, error);
9338cb22a54SDavid Marchand 		free(dump_path);
934da679339SSrikanth Yalavarthi 		if (error)
935da679339SSrikanth Yalavarthi 			return;
936da679339SSrikanth Yalavarthi 
937da679339SSrikanth Yalavarthi 		/* dump dequantized output buffer */
9385d41169bSSrikanth Yalavarthi 		if (asprintf(&dump_path, "%s.%u", t->cmn.opt->filelist[req->fid].output, obj_idx) ==
9395d41169bSSrikanth Yalavarthi 		    -1)
9408cb22a54SDavid Marchand 			return;
9418cb22a54SDavid Marchand 		ML_OPEN_WRITE_GET_ERR(dump_path, model->output, model->out_dsize, error);
9428cb22a54SDavid Marchand 		free(dump_path);
943da679339SSrikanth Yalavarthi 		if (error)
944da679339SSrikanth Yalavarthi 			return;
945da679339SSrikanth Yalavarthi 	}
946bbd272edSSrikanth Yalavarthi }
947bbd272edSSrikanth Yalavarthi 
948bbd272edSSrikanth Yalavarthi int
949bbd272edSSrikanth Yalavarthi ml_inference_result(struct ml_test *test, struct ml_options *opt, uint16_t fid)
950bbd272edSSrikanth Yalavarthi {
951bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv(test);
952bbd272edSSrikanth Yalavarthi 	uint64_t error_count = 0;
953bbd272edSSrikanth Yalavarthi 	uint32_t i;
954bbd272edSSrikanth Yalavarthi 
955bbd272edSSrikanth Yalavarthi 	RTE_SET_USED(opt);
956bbd272edSSrikanth Yalavarthi 
957bbd272edSSrikanth Yalavarthi 	/* check for errors */
958bbd272edSSrikanth Yalavarthi 	for (i = 0; i < RTE_MAX_LCORE; i++)
959bbd272edSSrikanth Yalavarthi 		error_count += t->error_count[i];
960bbd272edSSrikanth Yalavarthi 
961bbd272edSSrikanth Yalavarthi 	rte_mempool_obj_iter(t->model[fid].io_pool, ml_request_finish, test);
962bbd272edSSrikanth Yalavarthi 
963da679339SSrikanth Yalavarthi 	if ((t->nb_used == t->nb_valid) && (error_count == 0))
964bbd272edSSrikanth Yalavarthi 		t->cmn.result = ML_TEST_SUCCESS;
965bbd272edSSrikanth Yalavarthi 	else
966bbd272edSSrikanth Yalavarthi 		t->cmn.result = ML_TEST_FAILED;
967bbd272edSSrikanth Yalavarthi 
968bbd272edSSrikanth Yalavarthi 	return t->cmn.result;
969bbd272edSSrikanth Yalavarthi }
970bbd272edSSrikanth Yalavarthi 
971bbd272edSSrikanth Yalavarthi int
972bbd272edSSrikanth Yalavarthi ml_inference_launch_cores(struct ml_test *test, struct ml_options *opt, uint16_t start_fid,
973bbd272edSSrikanth Yalavarthi 			  uint16_t end_fid)
974bbd272edSSrikanth Yalavarthi {
975bbd272edSSrikanth Yalavarthi 	struct test_inference *t = ml_test_priv(test);
976bbd272edSSrikanth Yalavarthi 	uint32_t lcore_id;
977c0e87165SSrikanth Yalavarthi 	uint32_t nb_reqs;
978bbd272edSSrikanth Yalavarthi 	uint32_t id = 0;
979c0e87165SSrikanth Yalavarthi 	uint32_t qp_id;
980c0e87165SSrikanth Yalavarthi 
981c0e87165SSrikanth Yalavarthi 	nb_reqs = opt->repetitions / opt->queue_pairs;
982bbd272edSSrikanth Yalavarthi 
983bbd272edSSrikanth Yalavarthi 	RTE_LCORE_FOREACH_WORKER(lcore_id)
984bbd272edSSrikanth Yalavarthi 	{
985c0e87165SSrikanth Yalavarthi 		if (id >= opt->queue_pairs * 2)
986bbd272edSSrikanth Yalavarthi 			break;
987bbd272edSSrikanth Yalavarthi 
988c0e87165SSrikanth Yalavarthi 		qp_id = id / 2;
989c0e87165SSrikanth Yalavarthi 		t->args[lcore_id].qp_id = qp_id;
990c0e87165SSrikanth Yalavarthi 		t->args[lcore_id].nb_reqs = nb_reqs;
991c0e87165SSrikanth Yalavarthi 		if (qp_id == 0)
992c0e87165SSrikanth Yalavarthi 			t->args[lcore_id].nb_reqs += opt->repetitions - nb_reqs * opt->queue_pairs;
993c0e87165SSrikanth Yalavarthi 
994c0e87165SSrikanth Yalavarthi 		if (t->args[lcore_id].nb_reqs == 0) {
995c0e87165SSrikanth Yalavarthi 			id++;
996c0e87165SSrikanth Yalavarthi 			break;
997c0e87165SSrikanth Yalavarthi 		}
998c0e87165SSrikanth Yalavarthi 
999bbd272edSSrikanth Yalavarthi 		t->args[lcore_id].start_fid = start_fid;
1000bbd272edSSrikanth Yalavarthi 		t->args[lcore_id].end_fid = end_fid;
1001bbd272edSSrikanth Yalavarthi 
1002bbd272edSSrikanth Yalavarthi 		if (id % 2 == 0)
1003bbd272edSSrikanth Yalavarthi 			rte_eal_remote_launch(t->enqueue, test, lcore_id);
1004bbd272edSSrikanth Yalavarthi 		else
1005bbd272edSSrikanth Yalavarthi 			rte_eal_remote_launch(t->dequeue, test, lcore_id);
1006bbd272edSSrikanth Yalavarthi 
1007bbd272edSSrikanth Yalavarthi 		id++;
1008bbd272edSSrikanth Yalavarthi 	}
1009bbd272edSSrikanth Yalavarthi 
1010bbd272edSSrikanth Yalavarthi 	return 0;
1011bbd272edSSrikanth Yalavarthi }
1012