1bbd272edSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2bbd272edSSrikanth Yalavarthi * Copyright (c) 2022 Marvell.
3bbd272edSSrikanth Yalavarthi */
4bbd272edSSrikanth Yalavarthi
5bbd272edSSrikanth Yalavarthi #include <errno.h>
66ebb6f98SSrikanth Yalavarthi #include <math.h>
78cb22a54SDavid Marchand #include <stdio.h>
8bbd272edSSrikanth Yalavarthi #include <unistd.h>
9bbd272edSSrikanth Yalavarthi
10bbd272edSSrikanth Yalavarthi #include <rte_common.h>
115a82bc33SSrikanth Yalavarthi #include <rte_cycles.h>
12da679339SSrikanth Yalavarthi #include <rte_hash_crc.h>
13bbd272edSSrikanth Yalavarthi #include <rte_launch.h>
14bbd272edSSrikanth Yalavarthi #include <rte_lcore.h>
15bbd272edSSrikanth Yalavarthi #include <rte_malloc.h>
16bbd272edSSrikanth Yalavarthi #include <rte_memzone.h>
17bbd272edSSrikanth Yalavarthi #include <rte_mldev.h>
18bbd272edSSrikanth Yalavarthi
19bbd272edSSrikanth Yalavarthi #include "ml_common.h"
20bbd272edSSrikanth Yalavarthi #include "test_inference_common.h"
21bbd272edSSrikanth Yalavarthi
22da679339SSrikanth Yalavarthi #define ML_OPEN_WRITE_GET_ERR(name, buffer, size, err) \
23da679339SSrikanth Yalavarthi do { \
24da679339SSrikanth Yalavarthi FILE *fp = fopen(name, "w+"); \
25da679339SSrikanth Yalavarthi if (fp == NULL) { \
26da679339SSrikanth Yalavarthi ml_err("Unable to create file: %s, error: %s", name, strerror(errno)); \
27da679339SSrikanth Yalavarthi err = true; \
28da679339SSrikanth Yalavarthi } else { \
29da679339SSrikanth Yalavarthi if (fwrite(buffer, 1, size, fp) != size) { \
30da679339SSrikanth Yalavarthi ml_err("Error writing output, file: %s, error: %s", name, \
31da679339SSrikanth Yalavarthi strerror(errno)); \
32da679339SSrikanth Yalavarthi err = true; \
33da679339SSrikanth Yalavarthi } \
34da679339SSrikanth Yalavarthi fclose(fp); \
35da679339SSrikanth Yalavarthi } \
36da679339SSrikanth Yalavarthi } while (0)
37da679339SSrikanth Yalavarthi
38bbd272edSSrikanth Yalavarthi /* Enqueue inference requests with burst size equal to 1 */
39bbd272edSSrikanth Yalavarthi static int
ml_enqueue_single(void * arg)40bbd272edSSrikanth Yalavarthi ml_enqueue_single(void *arg)
41bbd272edSSrikanth Yalavarthi {
42bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)arg);
43bbd272edSSrikanth Yalavarthi struct ml_request *req = NULL;
44bbd272edSSrikanth Yalavarthi struct rte_ml_op *op = NULL;
45bbd272edSSrikanth Yalavarthi struct ml_core_args *args;
46bbd272edSSrikanth Yalavarthi uint64_t model_enq = 0;
475a82bc33SSrikanth Yalavarthi uint64_t start_cycle;
48bbd272edSSrikanth Yalavarthi uint32_t burst_enq;
49bbd272edSSrikanth Yalavarthi uint32_t lcore_id;
5024364292SSrikanth Yalavarthi uint64_t offset;
5124364292SSrikanth Yalavarthi uint64_t bufsz;
52bbd272edSSrikanth Yalavarthi uint16_t fid;
5324364292SSrikanth Yalavarthi uint32_t i;
54bbd272edSSrikanth Yalavarthi int ret;
55bbd272edSSrikanth Yalavarthi
56bbd272edSSrikanth Yalavarthi lcore_id = rte_lcore_id();
57bbd272edSSrikanth Yalavarthi args = &t->args[lcore_id];
585a82bc33SSrikanth Yalavarthi args->start_cycles = 0;
59bbd272edSSrikanth Yalavarthi model_enq = 0;
60bbd272edSSrikanth Yalavarthi
61bbd272edSSrikanth Yalavarthi if (args->nb_reqs == 0)
62bbd272edSSrikanth Yalavarthi return 0;
63bbd272edSSrikanth Yalavarthi
64bbd272edSSrikanth Yalavarthi next_rep:
65bbd272edSSrikanth Yalavarthi fid = args->start_fid;
66bbd272edSSrikanth Yalavarthi
67bbd272edSSrikanth Yalavarthi next_model:
68bbd272edSSrikanth Yalavarthi ret = rte_mempool_get(t->op_pool, (void **)&op);
69bbd272edSSrikanth Yalavarthi if (ret != 0)
70bbd272edSSrikanth Yalavarthi goto next_model;
71bbd272edSSrikanth Yalavarthi
7224364292SSrikanth Yalavarthi retry_req:
73bbd272edSSrikanth Yalavarthi ret = rte_mempool_get(t->model[fid].io_pool, (void **)&req);
74bbd272edSSrikanth Yalavarthi if (ret != 0)
7524364292SSrikanth Yalavarthi goto retry_req;
7624364292SSrikanth Yalavarthi
7724364292SSrikanth Yalavarthi retry_inp_segs:
7824364292SSrikanth Yalavarthi ret = rte_mempool_get_bulk(t->buf_seg_pool, (void **)req->inp_buf_segs,
7924364292SSrikanth Yalavarthi t->model[fid].info.nb_inputs);
8024364292SSrikanth Yalavarthi if (ret != 0)
8124364292SSrikanth Yalavarthi goto retry_inp_segs;
8224364292SSrikanth Yalavarthi
8324364292SSrikanth Yalavarthi retry_out_segs:
8424364292SSrikanth Yalavarthi ret = rte_mempool_get_bulk(t->buf_seg_pool, (void **)req->out_buf_segs,
8524364292SSrikanth Yalavarthi t->model[fid].info.nb_outputs);
8624364292SSrikanth Yalavarthi if (ret != 0)
8724364292SSrikanth Yalavarthi goto retry_out_segs;
88bbd272edSSrikanth Yalavarthi
89bbd272edSSrikanth Yalavarthi op->model_id = t->model[fid].id;
9024364292SSrikanth Yalavarthi op->nb_batches = t->model[fid].info.min_batches;
91bbd272edSSrikanth Yalavarthi op->mempool = t->op_pool;
9224364292SSrikanth Yalavarthi op->input = req->inp_buf_segs;
9324364292SSrikanth Yalavarthi op->output = req->out_buf_segs;
94bbd272edSSrikanth Yalavarthi op->user_ptr = req;
9524364292SSrikanth Yalavarthi
9624364292SSrikanth Yalavarthi if (t->model[fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED) {
9724364292SSrikanth Yalavarthi op->input[0]->addr = req->input;
9824364292SSrikanth Yalavarthi op->input[0]->iova_addr = rte_mem_virt2iova(req->input);
9924364292SSrikanth Yalavarthi op->input[0]->length = t->model[fid].inp_qsize;
10024364292SSrikanth Yalavarthi op->input[0]->next = NULL;
10124364292SSrikanth Yalavarthi
10224364292SSrikanth Yalavarthi op->output[0]->addr = req->output;
10324364292SSrikanth Yalavarthi op->output[0]->iova_addr = rte_mem_virt2iova(req->output);
10424364292SSrikanth Yalavarthi op->output[0]->length = t->model[fid].out_qsize;
10524364292SSrikanth Yalavarthi op->output[0]->next = NULL;
10624364292SSrikanth Yalavarthi } else {
10724364292SSrikanth Yalavarthi offset = 0;
10824364292SSrikanth Yalavarthi for (i = 0; i < t->model[fid].info.nb_inputs; i++) {
10924364292SSrikanth Yalavarthi bufsz = RTE_ALIGN_CEIL(t->model[fid].info.input_info[i].size,
11024364292SSrikanth Yalavarthi t->cmn.dev_info.align_size);
11124364292SSrikanth Yalavarthi op->input[i]->addr = req->input + offset;
11224364292SSrikanth Yalavarthi op->input[i]->iova_addr = rte_mem_virt2iova(req->input + offset);
11324364292SSrikanth Yalavarthi op->input[i]->length = bufsz;
11424364292SSrikanth Yalavarthi op->input[i]->next = NULL;
11524364292SSrikanth Yalavarthi offset += bufsz;
11624364292SSrikanth Yalavarthi }
11724364292SSrikanth Yalavarthi
11824364292SSrikanth Yalavarthi offset = 0;
11924364292SSrikanth Yalavarthi for (i = 0; i < t->model[fid].info.nb_outputs; i++) {
12024364292SSrikanth Yalavarthi bufsz = RTE_ALIGN_CEIL(t->model[fid].info.output_info[i].size,
12124364292SSrikanth Yalavarthi t->cmn.dev_info.align_size);
12224364292SSrikanth Yalavarthi op->output[i]->addr = req->output + offset;
12324364292SSrikanth Yalavarthi op->output[i]->iova_addr = rte_mem_virt2iova(req->output + offset);
12424364292SSrikanth Yalavarthi op->output[i]->length = bufsz;
12524364292SSrikanth Yalavarthi op->output[i]->next = NULL;
12624364292SSrikanth Yalavarthi offset += bufsz;
12724364292SSrikanth Yalavarthi }
12824364292SSrikanth Yalavarthi }
12924364292SSrikanth Yalavarthi
130bbd272edSSrikanth Yalavarthi req->niters++;
131bbd272edSSrikanth Yalavarthi req->fid = fid;
132bbd272edSSrikanth Yalavarthi
133bbd272edSSrikanth Yalavarthi enqueue_req:
1345a82bc33SSrikanth Yalavarthi start_cycle = rte_get_tsc_cycles();
135c0e87165SSrikanth Yalavarthi burst_enq = rte_ml_enqueue_burst(t->cmn.opt->dev_id, args->qp_id, &op, 1);
136bbd272edSSrikanth Yalavarthi if (burst_enq == 0)
137bbd272edSSrikanth Yalavarthi goto enqueue_req;
138bbd272edSSrikanth Yalavarthi
1395a82bc33SSrikanth Yalavarthi args->start_cycles += start_cycle;
140bbd272edSSrikanth Yalavarthi fid++;
141bbd272edSSrikanth Yalavarthi if (likely(fid <= args->end_fid))
142bbd272edSSrikanth Yalavarthi goto next_model;
143bbd272edSSrikanth Yalavarthi
144bbd272edSSrikanth Yalavarthi model_enq++;
145bbd272edSSrikanth Yalavarthi if (likely(model_enq < args->nb_reqs))
146bbd272edSSrikanth Yalavarthi goto next_rep;
147bbd272edSSrikanth Yalavarthi
148bbd272edSSrikanth Yalavarthi return 0;
149bbd272edSSrikanth Yalavarthi }
150bbd272edSSrikanth Yalavarthi
151bbd272edSSrikanth Yalavarthi /* Dequeue inference requests with burst size equal to 1 */
152bbd272edSSrikanth Yalavarthi static int
ml_dequeue_single(void * arg)153bbd272edSSrikanth Yalavarthi ml_dequeue_single(void *arg)
154bbd272edSSrikanth Yalavarthi {
155bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)arg);
156bbd272edSSrikanth Yalavarthi struct rte_ml_op_error error;
157bbd272edSSrikanth Yalavarthi struct rte_ml_op *op = NULL;
158bbd272edSSrikanth Yalavarthi struct ml_core_args *args;
159bbd272edSSrikanth Yalavarthi struct ml_request *req;
160bbd272edSSrikanth Yalavarthi uint64_t total_deq = 0;
161bbd272edSSrikanth Yalavarthi uint8_t nb_filelist;
162bbd272edSSrikanth Yalavarthi uint32_t burst_deq;
1635a82bc33SSrikanth Yalavarthi uint64_t end_cycle;
164bbd272edSSrikanth Yalavarthi uint32_t lcore_id;
165bbd272edSSrikanth Yalavarthi
166bbd272edSSrikanth Yalavarthi lcore_id = rte_lcore_id();
167bbd272edSSrikanth Yalavarthi args = &t->args[lcore_id];
1685a82bc33SSrikanth Yalavarthi args->end_cycles = 0;
169bbd272edSSrikanth Yalavarthi nb_filelist = args->end_fid - args->start_fid + 1;
170bbd272edSSrikanth Yalavarthi
171bbd272edSSrikanth Yalavarthi if (args->nb_reqs == 0)
172bbd272edSSrikanth Yalavarthi return 0;
173bbd272edSSrikanth Yalavarthi
174bbd272edSSrikanth Yalavarthi dequeue_req:
175c0e87165SSrikanth Yalavarthi burst_deq = rte_ml_dequeue_burst(t->cmn.opt->dev_id, args->qp_id, &op, 1);
1765a82bc33SSrikanth Yalavarthi end_cycle = rte_get_tsc_cycles();
177bbd272edSSrikanth Yalavarthi
178bbd272edSSrikanth Yalavarthi if (likely(burst_deq == 1)) {
179bbd272edSSrikanth Yalavarthi total_deq += burst_deq;
1805a82bc33SSrikanth Yalavarthi args->end_cycles += end_cycle;
181bbd272edSSrikanth Yalavarthi if (unlikely(op->status == RTE_ML_OP_STATUS_ERROR)) {
182bbd272edSSrikanth Yalavarthi rte_ml_op_error_get(t->cmn.opt->dev_id, op, &error);
183bbd272edSSrikanth Yalavarthi ml_err("error_code = 0x%" PRIx64 ", error_message = %s\n", error.errcode,
184bbd272edSSrikanth Yalavarthi error.message);
185bbd272edSSrikanth Yalavarthi t->error_count[lcore_id]++;
186bbd272edSSrikanth Yalavarthi }
187bbd272edSSrikanth Yalavarthi req = (struct ml_request *)op->user_ptr;
188bbd272edSSrikanth Yalavarthi rte_mempool_put(t->model[req->fid].io_pool, req);
18924364292SSrikanth Yalavarthi rte_mempool_put_bulk(t->buf_seg_pool, (void **)op->input,
19024364292SSrikanth Yalavarthi t->model[req->fid].info.nb_inputs);
19124364292SSrikanth Yalavarthi rte_mempool_put_bulk(t->buf_seg_pool, (void **)op->output,
19224364292SSrikanth Yalavarthi t->model[req->fid].info.nb_outputs);
193bbd272edSSrikanth Yalavarthi rte_mempool_put(t->op_pool, op);
194bbd272edSSrikanth Yalavarthi }
195bbd272edSSrikanth Yalavarthi
196bbd272edSSrikanth Yalavarthi if (likely(total_deq < args->nb_reqs * nb_filelist))
197bbd272edSSrikanth Yalavarthi goto dequeue_req;
198bbd272edSSrikanth Yalavarthi
199bbd272edSSrikanth Yalavarthi return 0;
200bbd272edSSrikanth Yalavarthi }
201bbd272edSSrikanth Yalavarthi
20239890f07SSrikanth Yalavarthi /* Enqueue inference requests with burst size greater than 1 */
20339890f07SSrikanth Yalavarthi static int
ml_enqueue_burst(void * arg)20439890f07SSrikanth Yalavarthi ml_enqueue_burst(void *arg)
20539890f07SSrikanth Yalavarthi {
20639890f07SSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)arg);
20739890f07SSrikanth Yalavarthi struct ml_core_args *args;
2085a82bc33SSrikanth Yalavarthi uint64_t start_cycle;
20939890f07SSrikanth Yalavarthi uint16_t ops_count;
21039890f07SSrikanth Yalavarthi uint64_t model_enq;
21139890f07SSrikanth Yalavarthi uint16_t burst_enq;
21239890f07SSrikanth Yalavarthi uint32_t lcore_id;
21339890f07SSrikanth Yalavarthi uint16_t pending;
21424364292SSrikanth Yalavarthi uint64_t offset;
21524364292SSrikanth Yalavarthi uint64_t bufsz;
21639890f07SSrikanth Yalavarthi uint16_t idx;
21739890f07SSrikanth Yalavarthi uint16_t fid;
21839890f07SSrikanth Yalavarthi uint16_t i;
21924364292SSrikanth Yalavarthi uint16_t j;
22039890f07SSrikanth Yalavarthi int ret;
22139890f07SSrikanth Yalavarthi
22239890f07SSrikanth Yalavarthi lcore_id = rte_lcore_id();
22339890f07SSrikanth Yalavarthi args = &t->args[lcore_id];
2245a82bc33SSrikanth Yalavarthi args->start_cycles = 0;
22539890f07SSrikanth Yalavarthi model_enq = 0;
22639890f07SSrikanth Yalavarthi
22739890f07SSrikanth Yalavarthi if (args->nb_reqs == 0)
22839890f07SSrikanth Yalavarthi return 0;
22939890f07SSrikanth Yalavarthi
23039890f07SSrikanth Yalavarthi next_rep:
23139890f07SSrikanth Yalavarthi fid = args->start_fid;
23239890f07SSrikanth Yalavarthi
23339890f07SSrikanth Yalavarthi next_model:
23439890f07SSrikanth Yalavarthi ops_count = RTE_MIN(t->cmn.opt->burst_size, args->nb_reqs - model_enq);
23539890f07SSrikanth Yalavarthi ret = rte_mempool_get_bulk(t->op_pool, (void **)args->enq_ops, ops_count);
23639890f07SSrikanth Yalavarthi if (ret != 0)
23739890f07SSrikanth Yalavarthi goto next_model;
23839890f07SSrikanth Yalavarthi
23924364292SSrikanth Yalavarthi retry_reqs:
24039890f07SSrikanth Yalavarthi ret = rte_mempool_get_bulk(t->model[fid].io_pool, (void **)args->reqs, ops_count);
24139890f07SSrikanth Yalavarthi if (ret != 0)
24224364292SSrikanth Yalavarthi goto retry_reqs;
24339890f07SSrikanth Yalavarthi
24439890f07SSrikanth Yalavarthi for (i = 0; i < ops_count; i++) {
24524364292SSrikanth Yalavarthi retry_inp_segs:
24624364292SSrikanth Yalavarthi ret = rte_mempool_get_bulk(t->buf_seg_pool, (void **)args->reqs[i]->inp_buf_segs,
24724364292SSrikanth Yalavarthi t->model[fid].info.nb_inputs);
24824364292SSrikanth Yalavarthi if (ret != 0)
24924364292SSrikanth Yalavarthi goto retry_inp_segs;
25024364292SSrikanth Yalavarthi
25124364292SSrikanth Yalavarthi retry_out_segs:
25224364292SSrikanth Yalavarthi ret = rte_mempool_get_bulk(t->buf_seg_pool, (void **)args->reqs[i]->out_buf_segs,
25324364292SSrikanth Yalavarthi t->model[fid].info.nb_outputs);
25424364292SSrikanth Yalavarthi if (ret != 0)
25524364292SSrikanth Yalavarthi goto retry_out_segs;
25624364292SSrikanth Yalavarthi
25739890f07SSrikanth Yalavarthi args->enq_ops[i]->model_id = t->model[fid].id;
25824364292SSrikanth Yalavarthi args->enq_ops[i]->nb_batches = t->model[fid].info.min_batches;
25939890f07SSrikanth Yalavarthi args->enq_ops[i]->mempool = t->op_pool;
26024364292SSrikanth Yalavarthi args->enq_ops[i]->input = args->reqs[i]->inp_buf_segs;
26124364292SSrikanth Yalavarthi args->enq_ops[i]->output = args->reqs[i]->out_buf_segs;
26239890f07SSrikanth Yalavarthi args->enq_ops[i]->user_ptr = args->reqs[i];
26324364292SSrikanth Yalavarthi
26424364292SSrikanth Yalavarthi if (t->model[fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED) {
26524364292SSrikanth Yalavarthi args->enq_ops[i]->input[0]->addr = args->reqs[i]->input;
26624364292SSrikanth Yalavarthi args->enq_ops[i]->input[0]->iova_addr =
26724364292SSrikanth Yalavarthi rte_mem_virt2iova(args->reqs[i]->input);
26824364292SSrikanth Yalavarthi args->enq_ops[i]->input[0]->length = t->model[fid].inp_qsize;
26924364292SSrikanth Yalavarthi args->enq_ops[i]->input[0]->next = NULL;
27024364292SSrikanth Yalavarthi
27124364292SSrikanth Yalavarthi args->enq_ops[i]->output[0]->addr = args->reqs[i]->output;
27224364292SSrikanth Yalavarthi args->enq_ops[i]->output[0]->iova_addr =
27324364292SSrikanth Yalavarthi rte_mem_virt2iova(args->reqs[i]->output);
27424364292SSrikanth Yalavarthi args->enq_ops[i]->output[0]->length = t->model[fid].out_qsize;
27524364292SSrikanth Yalavarthi args->enq_ops[i]->output[0]->next = NULL;
27624364292SSrikanth Yalavarthi } else {
27724364292SSrikanth Yalavarthi offset = 0;
27824364292SSrikanth Yalavarthi for (j = 0; j < t->model[fid].info.nb_inputs; j++) {
27924364292SSrikanth Yalavarthi bufsz = RTE_ALIGN_CEIL(t->model[fid].info.input_info[i].size,
28024364292SSrikanth Yalavarthi t->cmn.dev_info.align_size);
28124364292SSrikanth Yalavarthi
28224364292SSrikanth Yalavarthi args->enq_ops[i]->input[j]->addr = args->reqs[i]->input + offset;
28324364292SSrikanth Yalavarthi args->enq_ops[i]->input[j]->iova_addr =
28424364292SSrikanth Yalavarthi rte_mem_virt2iova(args->reqs[i]->input + offset);
28524364292SSrikanth Yalavarthi args->enq_ops[i]->input[j]->length = t->model[fid].inp_qsize;
28624364292SSrikanth Yalavarthi args->enq_ops[i]->input[j]->next = NULL;
28724364292SSrikanth Yalavarthi offset += bufsz;
28824364292SSrikanth Yalavarthi }
28924364292SSrikanth Yalavarthi
29024364292SSrikanth Yalavarthi offset = 0;
29124364292SSrikanth Yalavarthi for (j = 0; j < t->model[fid].info.nb_outputs; j++) {
29224364292SSrikanth Yalavarthi bufsz = RTE_ALIGN_CEIL(t->model[fid].info.output_info[i].size,
29324364292SSrikanth Yalavarthi t->cmn.dev_info.align_size);
29424364292SSrikanth Yalavarthi args->enq_ops[i]->output[j]->addr = args->reqs[i]->output + offset;
29524364292SSrikanth Yalavarthi args->enq_ops[i]->output[j]->iova_addr =
29624364292SSrikanth Yalavarthi rte_mem_virt2iova(args->reqs[i]->output + offset);
29724364292SSrikanth Yalavarthi args->enq_ops[i]->output[j]->length = t->model[fid].out_qsize;
29824364292SSrikanth Yalavarthi args->enq_ops[i]->output[j]->next = NULL;
29924364292SSrikanth Yalavarthi offset += bufsz;
30024364292SSrikanth Yalavarthi }
30124364292SSrikanth Yalavarthi }
30224364292SSrikanth Yalavarthi
30339890f07SSrikanth Yalavarthi args->reqs[i]->niters++;
30439890f07SSrikanth Yalavarthi args->reqs[i]->fid = fid;
30539890f07SSrikanth Yalavarthi }
30639890f07SSrikanth Yalavarthi
30739890f07SSrikanth Yalavarthi idx = 0;
30839890f07SSrikanth Yalavarthi pending = ops_count;
30939890f07SSrikanth Yalavarthi
31039890f07SSrikanth Yalavarthi enqueue_reqs:
3115a82bc33SSrikanth Yalavarthi start_cycle = rte_get_tsc_cycles();
312c0e87165SSrikanth Yalavarthi burst_enq =
313c0e87165SSrikanth Yalavarthi rte_ml_enqueue_burst(t->cmn.opt->dev_id, args->qp_id, &args->enq_ops[idx], pending);
3145a82bc33SSrikanth Yalavarthi args->start_cycles += burst_enq * start_cycle;
31539890f07SSrikanth Yalavarthi pending = pending - burst_enq;
31639890f07SSrikanth Yalavarthi
31739890f07SSrikanth Yalavarthi if (pending > 0) {
31839890f07SSrikanth Yalavarthi idx = idx + burst_enq;
31939890f07SSrikanth Yalavarthi goto enqueue_reqs;
32039890f07SSrikanth Yalavarthi }
32139890f07SSrikanth Yalavarthi
32239890f07SSrikanth Yalavarthi fid++;
32339890f07SSrikanth Yalavarthi if (fid <= args->end_fid)
32439890f07SSrikanth Yalavarthi goto next_model;
32539890f07SSrikanth Yalavarthi
32639890f07SSrikanth Yalavarthi model_enq = model_enq + ops_count;
32739890f07SSrikanth Yalavarthi if (model_enq < args->nb_reqs)
32839890f07SSrikanth Yalavarthi goto next_rep;
32939890f07SSrikanth Yalavarthi
33039890f07SSrikanth Yalavarthi return 0;
33139890f07SSrikanth Yalavarthi }
33239890f07SSrikanth Yalavarthi
33339890f07SSrikanth Yalavarthi /* Dequeue inference requests with burst size greater than 1 */
33439890f07SSrikanth Yalavarthi static int
ml_dequeue_burst(void * arg)33539890f07SSrikanth Yalavarthi ml_dequeue_burst(void *arg)
33639890f07SSrikanth Yalavarthi {
33739890f07SSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)arg);
33839890f07SSrikanth Yalavarthi struct rte_ml_op_error error;
33939890f07SSrikanth Yalavarthi struct ml_core_args *args;
34039890f07SSrikanth Yalavarthi struct ml_request *req;
34139890f07SSrikanth Yalavarthi uint64_t total_deq = 0;
34239890f07SSrikanth Yalavarthi uint16_t burst_deq = 0;
34339890f07SSrikanth Yalavarthi uint8_t nb_filelist;
3445a82bc33SSrikanth Yalavarthi uint64_t end_cycle;
34539890f07SSrikanth Yalavarthi uint32_t lcore_id;
34639890f07SSrikanth Yalavarthi uint32_t i;
34739890f07SSrikanth Yalavarthi
34839890f07SSrikanth Yalavarthi lcore_id = rte_lcore_id();
34939890f07SSrikanth Yalavarthi args = &t->args[lcore_id];
3505a82bc33SSrikanth Yalavarthi args->end_cycles = 0;
35139890f07SSrikanth Yalavarthi nb_filelist = args->end_fid - args->start_fid + 1;
35239890f07SSrikanth Yalavarthi
35339890f07SSrikanth Yalavarthi if (args->nb_reqs == 0)
35439890f07SSrikanth Yalavarthi return 0;
35539890f07SSrikanth Yalavarthi
35639890f07SSrikanth Yalavarthi dequeue_burst:
357c0e87165SSrikanth Yalavarthi burst_deq = rte_ml_dequeue_burst(t->cmn.opt->dev_id, args->qp_id, args->deq_ops,
358c0e87165SSrikanth Yalavarthi t->cmn.opt->burst_size);
3595a82bc33SSrikanth Yalavarthi end_cycle = rte_get_tsc_cycles();
36039890f07SSrikanth Yalavarthi
36139890f07SSrikanth Yalavarthi if (likely(burst_deq > 0)) {
36239890f07SSrikanth Yalavarthi total_deq += burst_deq;
3635a82bc33SSrikanth Yalavarthi args->end_cycles += burst_deq * end_cycle;
36439890f07SSrikanth Yalavarthi
36539890f07SSrikanth Yalavarthi for (i = 0; i < burst_deq; i++) {
36639890f07SSrikanth Yalavarthi if (unlikely(args->deq_ops[i]->status == RTE_ML_OP_STATUS_ERROR)) {
36739890f07SSrikanth Yalavarthi rte_ml_op_error_get(t->cmn.opt->dev_id, args->deq_ops[i], &error);
36839890f07SSrikanth Yalavarthi ml_err("error_code = 0x%" PRIx64 ", error_message = %s\n",
36939890f07SSrikanth Yalavarthi error.errcode, error.message);
37039890f07SSrikanth Yalavarthi t->error_count[lcore_id]++;
37139890f07SSrikanth Yalavarthi }
37239890f07SSrikanth Yalavarthi req = (struct ml_request *)args->deq_ops[i]->user_ptr;
37324364292SSrikanth Yalavarthi if (req != NULL) {
37439890f07SSrikanth Yalavarthi rte_mempool_put(t->model[req->fid].io_pool, req);
37524364292SSrikanth Yalavarthi rte_mempool_put_bulk(t->buf_seg_pool,
37624364292SSrikanth Yalavarthi (void **)args->deq_ops[i]->input,
37724364292SSrikanth Yalavarthi t->model[req->fid].info.nb_inputs);
37824364292SSrikanth Yalavarthi rte_mempool_put_bulk(t->buf_seg_pool,
37924364292SSrikanth Yalavarthi (void **)args->deq_ops[i]->output,
38024364292SSrikanth Yalavarthi t->model[req->fid].info.nb_outputs);
38124364292SSrikanth Yalavarthi }
38239890f07SSrikanth Yalavarthi }
38339890f07SSrikanth Yalavarthi rte_mempool_put_bulk(t->op_pool, (void *)args->deq_ops, burst_deq);
38439890f07SSrikanth Yalavarthi }
38539890f07SSrikanth Yalavarthi
38639890f07SSrikanth Yalavarthi if (total_deq < args->nb_reqs * nb_filelist)
38739890f07SSrikanth Yalavarthi goto dequeue_burst;
38839890f07SSrikanth Yalavarthi
38939890f07SSrikanth Yalavarthi return 0;
39039890f07SSrikanth Yalavarthi }
39139890f07SSrikanth Yalavarthi
392bbd272edSSrikanth Yalavarthi bool
test_inference_cap_check(struct ml_options * opt)393bbd272edSSrikanth Yalavarthi test_inference_cap_check(struct ml_options *opt)
394bbd272edSSrikanth Yalavarthi {
395bbd272edSSrikanth Yalavarthi struct rte_ml_dev_info dev_info;
396bbd272edSSrikanth Yalavarthi
397bbd272edSSrikanth Yalavarthi if (!ml_test_cap_check(opt))
398bbd272edSSrikanth Yalavarthi return false;
399bbd272edSSrikanth Yalavarthi
400bbd272edSSrikanth Yalavarthi rte_ml_dev_info_get(opt->dev_id, &dev_info);
401c0e87165SSrikanth Yalavarthi
402c0e87165SSrikanth Yalavarthi if (opt->queue_pairs > dev_info.max_queue_pairs) {
40328a4a819SSrikanth Yalavarthi ml_err("Insufficient capabilities: queue_pairs = %u > (max_queue_pairs = %u)",
404c0e87165SSrikanth Yalavarthi opt->queue_pairs, dev_info.max_queue_pairs);
405c0e87165SSrikanth Yalavarthi return false;
406c0e87165SSrikanth Yalavarthi }
407c0e87165SSrikanth Yalavarthi
408c0e87165SSrikanth Yalavarthi if (opt->queue_size > dev_info.max_desc) {
40928a4a819SSrikanth Yalavarthi ml_err("Insufficient capabilities: queue_size = %u > (max_desc = %u)",
41028a4a819SSrikanth Yalavarthi opt->queue_size, dev_info.max_desc);
411c0e87165SSrikanth Yalavarthi return false;
412c0e87165SSrikanth Yalavarthi }
413c0e87165SSrikanth Yalavarthi
414bbd272edSSrikanth Yalavarthi if (opt->nb_filelist > dev_info.max_models) {
41528a4a819SSrikanth Yalavarthi ml_err("Insufficient capabilities: Filelist count exceeded device limit, count = %u > (max limit = %u)",
416bbd272edSSrikanth Yalavarthi opt->nb_filelist, dev_info.max_models);
417bbd272edSSrikanth Yalavarthi return false;
418bbd272edSSrikanth Yalavarthi }
419bbd272edSSrikanth Yalavarthi
42024364292SSrikanth Yalavarthi if (dev_info.max_io < ML_TEST_MAX_IO_SIZE) {
42124364292SSrikanth Yalavarthi ml_err("Insufficient capabilities: Max I/O, count = %u > (max limit = %u)",
42224364292SSrikanth Yalavarthi ML_TEST_MAX_IO_SIZE, dev_info.max_io);
42324364292SSrikanth Yalavarthi return false;
42424364292SSrikanth Yalavarthi }
42524364292SSrikanth Yalavarthi
426bbd272edSSrikanth Yalavarthi return true;
427bbd272edSSrikanth Yalavarthi }
428bbd272edSSrikanth Yalavarthi
429bbd272edSSrikanth Yalavarthi int
test_inference_opt_check(struct ml_options * opt)430bbd272edSSrikanth Yalavarthi test_inference_opt_check(struct ml_options *opt)
431bbd272edSSrikanth Yalavarthi {
432bbd272edSSrikanth Yalavarthi uint32_t i;
433bbd272edSSrikanth Yalavarthi int ret;
434bbd272edSSrikanth Yalavarthi
435bbd272edSSrikanth Yalavarthi /* check common opts */
436bbd272edSSrikanth Yalavarthi ret = ml_test_opt_check(opt);
437bbd272edSSrikanth Yalavarthi if (ret != 0)
438bbd272edSSrikanth Yalavarthi return ret;
439bbd272edSSrikanth Yalavarthi
440a1474e13SSrikanth Yalavarthi /* check for at least one filelist */
441a1474e13SSrikanth Yalavarthi if (opt->nb_filelist == 0) {
442a1474e13SSrikanth Yalavarthi ml_err("Filelist empty, need at least one filelist to run the test\n");
443a1474e13SSrikanth Yalavarthi return -EINVAL;
444a1474e13SSrikanth Yalavarthi }
445a1474e13SSrikanth Yalavarthi
446bbd272edSSrikanth Yalavarthi /* check file availability */
447bbd272edSSrikanth Yalavarthi for (i = 0; i < opt->nb_filelist; i++) {
448bbd272edSSrikanth Yalavarthi if (access(opt->filelist[i].model, F_OK) == -1) {
449bbd272edSSrikanth Yalavarthi ml_err("Model file not accessible: id = %u, file = %s", i,
450bbd272edSSrikanth Yalavarthi opt->filelist[i].model);
451bbd272edSSrikanth Yalavarthi return -ENOENT;
452bbd272edSSrikanth Yalavarthi }
453bbd272edSSrikanth Yalavarthi
454bbd272edSSrikanth Yalavarthi if (access(opt->filelist[i].input, F_OK) == -1) {
455bbd272edSSrikanth Yalavarthi ml_err("Input file not accessible: id = %u, file = %s", i,
456bbd272edSSrikanth Yalavarthi opt->filelist[i].input);
457bbd272edSSrikanth Yalavarthi return -ENOENT;
458bbd272edSSrikanth Yalavarthi }
459bbd272edSSrikanth Yalavarthi }
460bbd272edSSrikanth Yalavarthi
461bbd272edSSrikanth Yalavarthi if (opt->repetitions == 0) {
462bbd272edSSrikanth Yalavarthi ml_err("Invalid option, repetitions = %" PRIu64 "\n", opt->repetitions);
463bbd272edSSrikanth Yalavarthi return -EINVAL;
464bbd272edSSrikanth Yalavarthi }
465bbd272edSSrikanth Yalavarthi
46639890f07SSrikanth Yalavarthi if (opt->burst_size == 0) {
46739890f07SSrikanth Yalavarthi ml_err("Invalid option, burst_size = %u\n", opt->burst_size);
46839890f07SSrikanth Yalavarthi return -EINVAL;
46939890f07SSrikanth Yalavarthi }
47039890f07SSrikanth Yalavarthi
47139890f07SSrikanth Yalavarthi if (opt->burst_size > ML_TEST_MAX_POOL_SIZE) {
47239890f07SSrikanth Yalavarthi ml_err("Invalid option, burst_size = %u (> max supported = %d)\n", opt->burst_size,
47339890f07SSrikanth Yalavarthi ML_TEST_MAX_POOL_SIZE);
47439890f07SSrikanth Yalavarthi return -EINVAL;
47539890f07SSrikanth Yalavarthi }
47639890f07SSrikanth Yalavarthi
477c0e87165SSrikanth Yalavarthi if (opt->queue_pairs == 0) {
478c0e87165SSrikanth Yalavarthi ml_err("Invalid option, queue_pairs = %u\n", opt->queue_pairs);
479c0e87165SSrikanth Yalavarthi return -EINVAL;
480c0e87165SSrikanth Yalavarthi }
481c0e87165SSrikanth Yalavarthi
482c0e87165SSrikanth Yalavarthi if (opt->queue_size == 0) {
483c0e87165SSrikanth Yalavarthi ml_err("Invalid option, queue_size = %u\n", opt->queue_size);
484c0e87165SSrikanth Yalavarthi return -EINVAL;
485c0e87165SSrikanth Yalavarthi }
486c0e87165SSrikanth Yalavarthi
487bbd272edSSrikanth Yalavarthi /* check number of available lcores. */
488c0e87165SSrikanth Yalavarthi if (rte_lcore_count() < (uint32_t)(opt->queue_pairs * 2 + 1)) {
489bbd272edSSrikanth Yalavarthi ml_err("Insufficient lcores = %u\n", rte_lcore_count());
490c0e87165SSrikanth Yalavarthi ml_err("Minimum lcores required to create %u queue-pairs = %u\n", opt->queue_pairs,
491c0e87165SSrikanth Yalavarthi (opt->queue_pairs * 2 + 1));
492bbd272edSSrikanth Yalavarthi return -EINVAL;
493bbd272edSSrikanth Yalavarthi }
494bbd272edSSrikanth Yalavarthi
495bbd272edSSrikanth Yalavarthi return 0;
496bbd272edSSrikanth Yalavarthi }
497bbd272edSSrikanth Yalavarthi
498bbd272edSSrikanth Yalavarthi void
test_inference_opt_dump(struct ml_options * opt)499bbd272edSSrikanth Yalavarthi test_inference_opt_dump(struct ml_options *opt)
500bbd272edSSrikanth Yalavarthi {
501bbd272edSSrikanth Yalavarthi uint32_t i;
502bbd272edSSrikanth Yalavarthi
503bbd272edSSrikanth Yalavarthi /* dump common opts */
504bbd272edSSrikanth Yalavarthi ml_test_opt_dump(opt);
505bbd272edSSrikanth Yalavarthi
506bbd272edSSrikanth Yalavarthi /* dump test opts */
507bbd272edSSrikanth Yalavarthi ml_dump("repetitions", "%" PRIu64, opt->repetitions);
50839890f07SSrikanth Yalavarthi ml_dump("burst_size", "%u", opt->burst_size);
509c0e87165SSrikanth Yalavarthi ml_dump("queue_pairs", "%u", opt->queue_pairs);
510c0e87165SSrikanth Yalavarthi ml_dump("queue_size", "%u", opt->queue_size);
511da679339SSrikanth Yalavarthi ml_dump("tolerance", "%-7.3f", opt->tolerance);
5125a82bc33SSrikanth Yalavarthi ml_dump("stats", "%s", (opt->stats ? "true" : "false"));
513bbd272edSSrikanth Yalavarthi
514bbd272edSSrikanth Yalavarthi ml_dump_begin("filelist");
515bbd272edSSrikanth Yalavarthi for (i = 0; i < opt->nb_filelist; i++) {
516bbd272edSSrikanth Yalavarthi ml_dump_list("model", i, opt->filelist[i].model);
517bbd272edSSrikanth Yalavarthi ml_dump_list("input", i, opt->filelist[i].input);
518bbd272edSSrikanth Yalavarthi ml_dump_list("output", i, opt->filelist[i].output);
519da679339SSrikanth Yalavarthi if (strcmp(opt->filelist[i].reference, "\0") != 0)
520da679339SSrikanth Yalavarthi ml_dump_list("reference", i, opt->filelist[i].reference);
521bbd272edSSrikanth Yalavarthi }
522bbd272edSSrikanth Yalavarthi ml_dump_end;
523bbd272edSSrikanth Yalavarthi }
524bbd272edSSrikanth Yalavarthi
525bbd272edSSrikanth Yalavarthi int
test_inference_setup(struct ml_test * test,struct ml_options * opt)526bbd272edSSrikanth Yalavarthi test_inference_setup(struct ml_test *test, struct ml_options *opt)
527bbd272edSSrikanth Yalavarthi {
528bbd272edSSrikanth Yalavarthi struct test_inference *t;
529bbd272edSSrikanth Yalavarthi void *test_inference;
53039890f07SSrikanth Yalavarthi uint32_t lcore_id;
531bbd272edSSrikanth Yalavarthi int ret = 0;
532bbd272edSSrikanth Yalavarthi uint32_t i;
533bbd272edSSrikanth Yalavarthi
534bbd272edSSrikanth Yalavarthi test_inference = rte_zmalloc_socket(test->name, sizeof(struct test_inference),
535bbd272edSSrikanth Yalavarthi RTE_CACHE_LINE_SIZE, opt->socket_id);
536bbd272edSSrikanth Yalavarthi if (test_inference == NULL) {
537bbd272edSSrikanth Yalavarthi ml_err("failed to allocate memory for test_model");
538bbd272edSSrikanth Yalavarthi ret = -ENOMEM;
539bbd272edSSrikanth Yalavarthi goto error;
540bbd272edSSrikanth Yalavarthi }
541bbd272edSSrikanth Yalavarthi test->test_priv = test_inference;
542bbd272edSSrikanth Yalavarthi t = ml_test_priv(test);
543bbd272edSSrikanth Yalavarthi
544bbd272edSSrikanth Yalavarthi t->nb_used = 0;
545da679339SSrikanth Yalavarthi t->nb_valid = 0;
546bbd272edSSrikanth Yalavarthi t->cmn.result = ML_TEST_FAILED;
547bbd272edSSrikanth Yalavarthi t->cmn.opt = opt;
548bbd272edSSrikanth Yalavarthi memset(t->error_count, 0, RTE_MAX_LCORE * sizeof(uint64_t));
549bbd272edSSrikanth Yalavarthi
550bbd272edSSrikanth Yalavarthi /* get device info */
551bbd272edSSrikanth Yalavarthi ret = rte_ml_dev_info_get(opt->dev_id, &t->cmn.dev_info);
552bbd272edSSrikanth Yalavarthi if (ret < 0) {
553bbd272edSSrikanth Yalavarthi ml_err("failed to get device info");
554bbd272edSSrikanth Yalavarthi goto error;
555bbd272edSSrikanth Yalavarthi }
556bbd272edSSrikanth Yalavarthi
55739890f07SSrikanth Yalavarthi if (opt->burst_size == 1) {
558bbd272edSSrikanth Yalavarthi t->enqueue = ml_enqueue_single;
559bbd272edSSrikanth Yalavarthi t->dequeue = ml_dequeue_single;
56039890f07SSrikanth Yalavarthi } else {
56139890f07SSrikanth Yalavarthi t->enqueue = ml_enqueue_burst;
56239890f07SSrikanth Yalavarthi t->dequeue = ml_dequeue_burst;
56339890f07SSrikanth Yalavarthi }
564bbd272edSSrikanth Yalavarthi
565bbd272edSSrikanth Yalavarthi /* set model initial state */
566bbd272edSSrikanth Yalavarthi for (i = 0; i < opt->nb_filelist; i++)
567bbd272edSSrikanth Yalavarthi t->model[i].state = MODEL_INITIAL;
568bbd272edSSrikanth Yalavarthi
56939890f07SSrikanth Yalavarthi for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
57039890f07SSrikanth Yalavarthi t->args[lcore_id].enq_ops = rte_zmalloc_socket(
57139890f07SSrikanth Yalavarthi "ml_test_enq_ops", opt->burst_size * sizeof(struct rte_ml_op *),
57239890f07SSrikanth Yalavarthi RTE_CACHE_LINE_SIZE, opt->socket_id);
57339890f07SSrikanth Yalavarthi t->args[lcore_id].deq_ops = rte_zmalloc_socket(
57439890f07SSrikanth Yalavarthi "ml_test_deq_ops", opt->burst_size * sizeof(struct rte_ml_op *),
57539890f07SSrikanth Yalavarthi RTE_CACHE_LINE_SIZE, opt->socket_id);
57639890f07SSrikanth Yalavarthi t->args[lcore_id].reqs = rte_zmalloc_socket(
57739890f07SSrikanth Yalavarthi "ml_test_requests", opt->burst_size * sizeof(struct ml_request *),
57839890f07SSrikanth Yalavarthi RTE_CACHE_LINE_SIZE, opt->socket_id);
57939890f07SSrikanth Yalavarthi }
58039890f07SSrikanth Yalavarthi
5815a82bc33SSrikanth Yalavarthi for (i = 0; i < RTE_MAX_LCORE; i++) {
5825a82bc33SSrikanth Yalavarthi t->args[i].start_cycles = 0;
5835a82bc33SSrikanth Yalavarthi t->args[i].end_cycles = 0;
5845a82bc33SSrikanth Yalavarthi }
5855a82bc33SSrikanth Yalavarthi
586bbd272edSSrikanth Yalavarthi return 0;
587bbd272edSSrikanth Yalavarthi
588bbd272edSSrikanth Yalavarthi error:
589bbd272edSSrikanth Yalavarthi rte_free(test_inference);
590bbd272edSSrikanth Yalavarthi
591bbd272edSSrikanth Yalavarthi return ret;
592bbd272edSSrikanth Yalavarthi }
593bbd272edSSrikanth Yalavarthi
594bbd272edSSrikanth Yalavarthi void
test_inference_destroy(struct ml_test * test,struct ml_options * opt)595bbd272edSSrikanth Yalavarthi test_inference_destroy(struct ml_test *test, struct ml_options *opt)
596bbd272edSSrikanth Yalavarthi {
597bbd272edSSrikanth Yalavarthi struct test_inference *t;
59824364292SSrikanth Yalavarthi uint32_t lcore_id;
599bbd272edSSrikanth Yalavarthi
600bbd272edSSrikanth Yalavarthi RTE_SET_USED(opt);
601bbd272edSSrikanth Yalavarthi
602bbd272edSSrikanth Yalavarthi t = ml_test_priv(test);
60324364292SSrikanth Yalavarthi
60424364292SSrikanth Yalavarthi for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
60524364292SSrikanth Yalavarthi rte_free(t->args[lcore_id].enq_ops);
60624364292SSrikanth Yalavarthi rte_free(t->args[lcore_id].deq_ops);
60724364292SSrikanth Yalavarthi rte_free(t->args[lcore_id].reqs);
60824364292SSrikanth Yalavarthi }
60924364292SSrikanth Yalavarthi
610bbd272edSSrikanth Yalavarthi rte_free(t);
611bbd272edSSrikanth Yalavarthi }
612bbd272edSSrikanth Yalavarthi
613bbd272edSSrikanth Yalavarthi int
ml_inference_mldev_setup(struct ml_test * test,struct ml_options * opt)614bbd272edSSrikanth Yalavarthi ml_inference_mldev_setup(struct ml_test *test, struct ml_options *opt)
615bbd272edSSrikanth Yalavarthi {
616bbd272edSSrikanth Yalavarthi struct rte_ml_dev_qp_conf qp_conf;
617bbd272edSSrikanth Yalavarthi struct test_inference *t;
618c0e87165SSrikanth Yalavarthi uint16_t qp_id;
619bbd272edSSrikanth Yalavarthi int ret;
620bbd272edSSrikanth Yalavarthi
621bbd272edSSrikanth Yalavarthi t = ml_test_priv(test);
622bbd272edSSrikanth Yalavarthi
623c0e87165SSrikanth Yalavarthi RTE_SET_USED(t);
624c0e87165SSrikanth Yalavarthi
625bbd272edSSrikanth Yalavarthi ret = ml_test_device_configure(test, opt);
626bbd272edSSrikanth Yalavarthi if (ret != 0)
627bbd272edSSrikanth Yalavarthi return ret;
628bbd272edSSrikanth Yalavarthi
629bbd272edSSrikanth Yalavarthi /* setup queue pairs */
630c0e87165SSrikanth Yalavarthi qp_conf.nb_desc = opt->queue_size;
631bbd272edSSrikanth Yalavarthi qp_conf.cb = NULL;
632bbd272edSSrikanth Yalavarthi
633c0e87165SSrikanth Yalavarthi for (qp_id = 0; qp_id < opt->queue_pairs; qp_id++) {
634c0e87165SSrikanth Yalavarthi qp_conf.nb_desc = opt->queue_size;
635c0e87165SSrikanth Yalavarthi qp_conf.cb = NULL;
636c0e87165SSrikanth Yalavarthi
637c0e87165SSrikanth Yalavarthi ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, opt->socket_id);
638bbd272edSSrikanth Yalavarthi if (ret != 0) {
639bbd272edSSrikanth Yalavarthi ml_err("Failed to setup ml device queue-pair, dev_id = %d, qp_id = %u\n",
640c0e87165SSrikanth Yalavarthi opt->dev_id, qp_id);
641c0e87165SSrikanth Yalavarthi return ret;
642c0e87165SSrikanth Yalavarthi }
643bbd272edSSrikanth Yalavarthi }
644bbd272edSSrikanth Yalavarthi
645bbd272edSSrikanth Yalavarthi ret = ml_test_device_start(test, opt);
646bbd272edSSrikanth Yalavarthi if (ret != 0)
647bbd272edSSrikanth Yalavarthi goto error;
648bbd272edSSrikanth Yalavarthi
649bbd272edSSrikanth Yalavarthi return 0;
650bbd272edSSrikanth Yalavarthi
651bbd272edSSrikanth Yalavarthi error:
652bbd272edSSrikanth Yalavarthi ml_test_device_close(test, opt);
653bbd272edSSrikanth Yalavarthi
654bbd272edSSrikanth Yalavarthi return ret;
655bbd272edSSrikanth Yalavarthi }
656bbd272edSSrikanth Yalavarthi
657bbd272edSSrikanth Yalavarthi int
ml_inference_mldev_destroy(struct ml_test * test,struct ml_options * opt)658bbd272edSSrikanth Yalavarthi ml_inference_mldev_destroy(struct ml_test *test, struct ml_options *opt)
659bbd272edSSrikanth Yalavarthi {
660bbd272edSSrikanth Yalavarthi int ret;
661bbd272edSSrikanth Yalavarthi
662bbd272edSSrikanth Yalavarthi ret = ml_test_device_stop(test, opt);
663bbd272edSSrikanth Yalavarthi if (ret != 0)
664bbd272edSSrikanth Yalavarthi goto error;
665bbd272edSSrikanth Yalavarthi
666bbd272edSSrikanth Yalavarthi ret = ml_test_device_close(test, opt);
667bbd272edSSrikanth Yalavarthi if (ret != 0)
668bbd272edSSrikanth Yalavarthi return ret;
669bbd272edSSrikanth Yalavarthi
670bbd272edSSrikanth Yalavarthi return 0;
671bbd272edSSrikanth Yalavarthi
672bbd272edSSrikanth Yalavarthi error:
673bbd272edSSrikanth Yalavarthi ml_test_device_close(test, opt);
674bbd272edSSrikanth Yalavarthi
675bbd272edSSrikanth Yalavarthi return ret;
676bbd272edSSrikanth Yalavarthi }
677bbd272edSSrikanth Yalavarthi
678bbd272edSSrikanth Yalavarthi /* Callback for IO pool create. This function would compute the fields of ml_request
679bbd272edSSrikanth Yalavarthi * structure and prepare the quantized input data.
680bbd272edSSrikanth Yalavarthi */
681bbd272edSSrikanth Yalavarthi static void
ml_request_initialize(struct rte_mempool * mp,void * opaque,void * obj,unsigned int obj_idx)682bbd272edSSrikanth Yalavarthi ml_request_initialize(struct rte_mempool *mp, void *opaque, void *obj, unsigned int obj_idx)
683bbd272edSSrikanth Yalavarthi {
684bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)opaque);
685bbd272edSSrikanth Yalavarthi struct ml_request *req = (struct ml_request *)obj;
68624364292SSrikanth Yalavarthi struct rte_ml_buff_seg dbuff_seg[ML_TEST_MAX_IO_SIZE];
68724364292SSrikanth Yalavarthi struct rte_ml_buff_seg qbuff_seg[ML_TEST_MAX_IO_SIZE];
68824364292SSrikanth Yalavarthi struct rte_ml_buff_seg *q_segs[ML_TEST_MAX_IO_SIZE];
68924364292SSrikanth Yalavarthi struct rte_ml_buff_seg *d_segs[ML_TEST_MAX_IO_SIZE];
69024364292SSrikanth Yalavarthi uint64_t offset;
69124364292SSrikanth Yalavarthi uint64_t bufsz;
69224364292SSrikanth Yalavarthi uint32_t i;
693bbd272edSSrikanth Yalavarthi
694bbd272edSSrikanth Yalavarthi RTE_SET_USED(mp);
695bbd272edSSrikanth Yalavarthi RTE_SET_USED(obj_idx);
696bbd272edSSrikanth Yalavarthi
697bbd272edSSrikanth Yalavarthi req->input = (uint8_t *)obj +
69824364292SSrikanth Yalavarthi RTE_ALIGN_CEIL(sizeof(struct ml_request), t->cmn.dev_info.align_size);
69924364292SSrikanth Yalavarthi req->output =
70024364292SSrikanth Yalavarthi req->input + RTE_ALIGN_CEIL(t->model[t->fid].inp_qsize, t->cmn.dev_info.align_size);
701bbd272edSSrikanth Yalavarthi req->niters = 0;
702bbd272edSSrikanth Yalavarthi
70324364292SSrikanth Yalavarthi if (t->model[t->fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED) {
70424364292SSrikanth Yalavarthi dbuff_seg[0].addr = t->model[t->fid].input;
70524364292SSrikanth Yalavarthi dbuff_seg[0].iova_addr = rte_mem_virt2iova(t->model[t->fid].input);
70624364292SSrikanth Yalavarthi dbuff_seg[0].length = t->model[t->fid].inp_dsize;
70724364292SSrikanth Yalavarthi dbuff_seg[0].next = NULL;
70824364292SSrikanth Yalavarthi d_segs[0] = &dbuff_seg[0];
70924364292SSrikanth Yalavarthi
71024364292SSrikanth Yalavarthi qbuff_seg[0].addr = req->input;
71124364292SSrikanth Yalavarthi qbuff_seg[0].iova_addr = rte_mem_virt2iova(req->input);
71224364292SSrikanth Yalavarthi qbuff_seg[0].length = t->model[t->fid].inp_qsize;
71324364292SSrikanth Yalavarthi qbuff_seg[0].next = NULL;
71424364292SSrikanth Yalavarthi q_segs[0] = &qbuff_seg[0];
71524364292SSrikanth Yalavarthi } else {
71624364292SSrikanth Yalavarthi offset = 0;
71724364292SSrikanth Yalavarthi for (i = 0; i < t->model[t->fid].info.nb_inputs; i++) {
71824364292SSrikanth Yalavarthi bufsz = t->model[t->fid].info.input_info[i].nb_elements * sizeof(float);
71924364292SSrikanth Yalavarthi dbuff_seg[i].addr = t->model[t->fid].input + offset;
72024364292SSrikanth Yalavarthi dbuff_seg[i].iova_addr = rte_mem_virt2iova(t->model[t->fid].input + offset);
72124364292SSrikanth Yalavarthi dbuff_seg[i].length = bufsz;
72224364292SSrikanth Yalavarthi dbuff_seg[i].next = NULL;
72324364292SSrikanth Yalavarthi d_segs[i] = &dbuff_seg[i];
72424364292SSrikanth Yalavarthi offset += bufsz;
72524364292SSrikanth Yalavarthi }
72624364292SSrikanth Yalavarthi
72724364292SSrikanth Yalavarthi offset = 0;
72824364292SSrikanth Yalavarthi for (i = 0; i < t->model[t->fid].info.nb_inputs; i++) {
72924364292SSrikanth Yalavarthi bufsz = RTE_ALIGN_CEIL(t->model[t->fid].info.input_info[i].size,
73024364292SSrikanth Yalavarthi t->cmn.dev_info.align_size);
73124364292SSrikanth Yalavarthi qbuff_seg[i].addr = req->input + offset;
73224364292SSrikanth Yalavarthi qbuff_seg[i].iova_addr = rte_mem_virt2iova(req->input + offset);
73324364292SSrikanth Yalavarthi qbuff_seg[i].length = bufsz;
73424364292SSrikanth Yalavarthi qbuff_seg[i].next = NULL;
73524364292SSrikanth Yalavarthi q_segs[i] = &qbuff_seg[i];
73624364292SSrikanth Yalavarthi offset += bufsz;
73724364292SSrikanth Yalavarthi }
73824364292SSrikanth Yalavarthi }
73924364292SSrikanth Yalavarthi
740bbd272edSSrikanth Yalavarthi /* quantize data */
74124364292SSrikanth Yalavarthi rte_ml_io_quantize(t->cmn.opt->dev_id, t->model[t->fid].id, d_segs, q_segs);
742bbd272edSSrikanth Yalavarthi }
743bbd272edSSrikanth Yalavarthi
744bbd272edSSrikanth Yalavarthi int
ml_inference_iomem_setup(struct ml_test * test,struct ml_options * opt,uint16_t fid)745bbd272edSSrikanth Yalavarthi ml_inference_iomem_setup(struct ml_test *test, struct ml_options *opt, uint16_t fid)
746bbd272edSSrikanth Yalavarthi {
747bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test);
748bbd272edSSrikanth Yalavarthi char mz_name[RTE_MEMZONE_NAMESIZE];
749bbd272edSSrikanth Yalavarthi char mp_name[RTE_MEMPOOL_NAMESIZE];
750bbd272edSSrikanth Yalavarthi const struct rte_memzone *mz;
751bbd272edSSrikanth Yalavarthi uint64_t nb_buffers;
752fccf444cSSrikanth Yalavarthi char *buffer = NULL;
753bbd272edSSrikanth Yalavarthi uint32_t buff_size;
754bbd272edSSrikanth Yalavarthi uint32_t mz_size;
755fccf444cSSrikanth Yalavarthi size_t fsize;
75624364292SSrikanth Yalavarthi uint32_t i;
757bbd272edSSrikanth Yalavarthi int ret;
758bbd272edSSrikanth Yalavarthi
759bbd272edSSrikanth Yalavarthi /* get input buffer size */
76024364292SSrikanth Yalavarthi t->model[fid].inp_qsize = 0;
76124364292SSrikanth Yalavarthi for (i = 0; i < t->model[fid].info.nb_inputs; i++) {
76224364292SSrikanth Yalavarthi if (t->model[fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED)
76324364292SSrikanth Yalavarthi t->model[fid].inp_qsize += t->model[fid].info.input_info[i].size;
76424364292SSrikanth Yalavarthi else
76524364292SSrikanth Yalavarthi t->model[fid].inp_qsize += RTE_ALIGN_CEIL(
76624364292SSrikanth Yalavarthi t->model[fid].info.input_info[i].size, t->cmn.dev_info.align_size);
767bbd272edSSrikanth Yalavarthi }
768bbd272edSSrikanth Yalavarthi
769bbd272edSSrikanth Yalavarthi /* get output buffer size */
77024364292SSrikanth Yalavarthi t->model[fid].out_qsize = 0;
77124364292SSrikanth Yalavarthi for (i = 0; i < t->model[fid].info.nb_outputs; i++) {
77224364292SSrikanth Yalavarthi if (t->model[fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED)
77324364292SSrikanth Yalavarthi t->model[fid].out_qsize += t->model[fid].info.output_info[i].size;
77424364292SSrikanth Yalavarthi else
77524364292SSrikanth Yalavarthi t->model[fid].out_qsize += RTE_ALIGN_CEIL(
77624364292SSrikanth Yalavarthi t->model[fid].info.output_info[i].size, t->cmn.dev_info.align_size);
777bbd272edSSrikanth Yalavarthi }
778bbd272edSSrikanth Yalavarthi
77924364292SSrikanth Yalavarthi t->model[fid].inp_dsize = 0;
780671e9c20SAnup Prabhu for (i = 0; i < t->model[fid].info.nb_inputs; i++) {
781671e9c20SAnup Prabhu if (opt->quantized_io)
782671e9c20SAnup Prabhu t->model[fid].inp_dsize += t->model[fid].info.input_info[i].size;
783671e9c20SAnup Prabhu else
78424364292SSrikanth Yalavarthi t->model[fid].inp_dsize +=
78524364292SSrikanth Yalavarthi t->model[fid].info.input_info[i].nb_elements * sizeof(float);
786671e9c20SAnup Prabhu }
78724364292SSrikanth Yalavarthi
78824364292SSrikanth Yalavarthi t->model[fid].out_dsize = 0;
789671e9c20SAnup Prabhu for (i = 0; i < t->model[fid].info.nb_outputs; i++) {
790671e9c20SAnup Prabhu if (opt->quantized_io)
791671e9c20SAnup Prabhu t->model[fid].out_dsize += t->model[fid].info.output_info[i].size;
792671e9c20SAnup Prabhu else
79324364292SSrikanth Yalavarthi t->model[fid].out_dsize +=
79424364292SSrikanth Yalavarthi t->model[fid].info.output_info[i].nb_elements * sizeof(float);
795671e9c20SAnup Prabhu }
79624364292SSrikanth Yalavarthi
797bbd272edSSrikanth Yalavarthi /* allocate buffer for user data */
798bbd272edSSrikanth Yalavarthi mz_size = t->model[fid].inp_dsize + t->model[fid].out_dsize;
799da679339SSrikanth Yalavarthi if (strcmp(opt->filelist[fid].reference, "\0") != 0)
800da679339SSrikanth Yalavarthi mz_size += t->model[fid].out_dsize;
801da679339SSrikanth Yalavarthi
802bbd272edSSrikanth Yalavarthi sprintf(mz_name, "ml_user_data_%d", fid);
803bbd272edSSrikanth Yalavarthi mz = rte_memzone_reserve(mz_name, mz_size, opt->socket_id, 0);
804bbd272edSSrikanth Yalavarthi if (mz == NULL) {
805bbd272edSSrikanth Yalavarthi ml_err("Memzone allocation failed for ml_user_data\n");
806bbd272edSSrikanth Yalavarthi ret = -ENOMEM;
807bbd272edSSrikanth Yalavarthi goto error;
808bbd272edSSrikanth Yalavarthi }
809bbd272edSSrikanth Yalavarthi
810bbd272edSSrikanth Yalavarthi t->model[fid].input = mz->addr;
811bbd272edSSrikanth Yalavarthi t->model[fid].output = t->model[fid].input + t->model[fid].inp_dsize;
812da679339SSrikanth Yalavarthi if (strcmp(opt->filelist[fid].reference, "\0") != 0)
813da679339SSrikanth Yalavarthi t->model[fid].reference = t->model[fid].output + t->model[fid].out_dsize;
814da679339SSrikanth Yalavarthi else
815da679339SSrikanth Yalavarthi t->model[fid].reference = NULL;
816bbd272edSSrikanth Yalavarthi
817bbd272edSSrikanth Yalavarthi /* load input file */
818fccf444cSSrikanth Yalavarthi ret = ml_read_file(opt->filelist[fid].input, &fsize, &buffer);
819fccf444cSSrikanth Yalavarthi if (ret != 0)
820bbd272edSSrikanth Yalavarthi goto error;
821bbd272edSSrikanth Yalavarthi
822fccf444cSSrikanth Yalavarthi if (fsize == t->model[fid].inp_dsize) {
823fccf444cSSrikanth Yalavarthi rte_memcpy(t->model[fid].input, buffer, fsize);
824fccf444cSSrikanth Yalavarthi free(buffer);
825fccf444cSSrikanth Yalavarthi } else {
826fccf444cSSrikanth Yalavarthi ml_err("Invalid input file, size = %zu (expected size = %" PRIu64 ")\n", fsize,
827bbd272edSSrikanth Yalavarthi t->model[fid].inp_dsize);
828bbd272edSSrikanth Yalavarthi ret = -EINVAL;
829*854f380fSSrikanth Yalavarthi free(buffer);
830bbd272edSSrikanth Yalavarthi goto error;
831bbd272edSSrikanth Yalavarthi }
832bbd272edSSrikanth Yalavarthi
833da679339SSrikanth Yalavarthi /* load reference file */
834fccf444cSSrikanth Yalavarthi buffer = NULL;
835da679339SSrikanth Yalavarthi if (t->model[fid].reference != NULL) {
836fccf444cSSrikanth Yalavarthi ret = ml_read_file(opt->filelist[fid].reference, &fsize, &buffer);
837fccf444cSSrikanth Yalavarthi if (ret != 0)
838da679339SSrikanth Yalavarthi goto error;
839da679339SSrikanth Yalavarthi
840fccf444cSSrikanth Yalavarthi if (fsize == t->model[fid].out_dsize) {
841fccf444cSSrikanth Yalavarthi rte_memcpy(t->model[fid].reference, buffer, fsize);
842fccf444cSSrikanth Yalavarthi free(buffer);
843fccf444cSSrikanth Yalavarthi } else {
844fccf444cSSrikanth Yalavarthi ml_err("Invalid reference file, size = %zu (expected size = %" PRIu64 ")\n",
845fccf444cSSrikanth Yalavarthi fsize, t->model[fid].out_dsize);
846fccf444cSSrikanth Yalavarthi ret = -EINVAL;
847*854f380fSSrikanth Yalavarthi free(buffer);
848da679339SSrikanth Yalavarthi goto error;
849da679339SSrikanth Yalavarthi }
850da679339SSrikanth Yalavarthi }
851da679339SSrikanth Yalavarthi
852bbd272edSSrikanth Yalavarthi /* create mempool for quantized input and output buffers. ml_request_initialize is
853bbd272edSSrikanth Yalavarthi * used as a callback for object creation.
854bbd272edSSrikanth Yalavarthi */
85524364292SSrikanth Yalavarthi buff_size = RTE_ALIGN_CEIL(sizeof(struct ml_request), t->cmn.dev_info.align_size) +
85624364292SSrikanth Yalavarthi RTE_ALIGN_CEIL(t->model[fid].inp_qsize, t->cmn.dev_info.align_size) +
85724364292SSrikanth Yalavarthi RTE_ALIGN_CEIL(t->model[fid].out_qsize, t->cmn.dev_info.align_size);
858bbd272edSSrikanth Yalavarthi nb_buffers = RTE_MIN((uint64_t)ML_TEST_MAX_POOL_SIZE, opt->repetitions);
859bbd272edSSrikanth Yalavarthi
860bbd272edSSrikanth Yalavarthi t->fid = fid;
861bbd272edSSrikanth Yalavarthi sprintf(mp_name, "ml_io_pool_%d", fid);
862bbd272edSSrikanth Yalavarthi t->model[fid].io_pool = rte_mempool_create(mp_name, nb_buffers, buff_size, 0, 0, NULL, NULL,
863bbd272edSSrikanth Yalavarthi ml_request_initialize, test, opt->socket_id, 0);
864bbd272edSSrikanth Yalavarthi if (t->model[fid].io_pool == NULL) {
865bbd272edSSrikanth Yalavarthi ml_err("Failed to create io pool : %s\n", "ml_io_pool");
866bbd272edSSrikanth Yalavarthi ret = -ENOMEM;
867bbd272edSSrikanth Yalavarthi goto error;
868bbd272edSSrikanth Yalavarthi }
869bbd272edSSrikanth Yalavarthi
870bbd272edSSrikanth Yalavarthi return 0;
871bbd272edSSrikanth Yalavarthi
872bbd272edSSrikanth Yalavarthi error:
873bbd272edSSrikanth Yalavarthi rte_memzone_free(mz);
874bbd272edSSrikanth Yalavarthi
875bbd272edSSrikanth Yalavarthi if (t->model[fid].io_pool != NULL) {
876bbd272edSSrikanth Yalavarthi rte_mempool_free(t->model[fid].io_pool);
877bbd272edSSrikanth Yalavarthi t->model[fid].io_pool = NULL;
878bbd272edSSrikanth Yalavarthi }
879bbd272edSSrikanth Yalavarthi
880bbd272edSSrikanth Yalavarthi return ret;
881bbd272edSSrikanth Yalavarthi }
882bbd272edSSrikanth Yalavarthi
883bbd272edSSrikanth Yalavarthi void
ml_inference_iomem_destroy(struct ml_test * test,struct ml_options * opt,uint16_t fid)884bbd272edSSrikanth Yalavarthi ml_inference_iomem_destroy(struct ml_test *test, struct ml_options *opt, uint16_t fid)
885bbd272edSSrikanth Yalavarthi {
886bbd272edSSrikanth Yalavarthi char mz_name[RTE_MEMZONE_NAMESIZE];
887bbd272edSSrikanth Yalavarthi char mp_name[RTE_MEMPOOL_NAMESIZE];
888bbd272edSSrikanth Yalavarthi const struct rte_memzone *mz;
889bbd272edSSrikanth Yalavarthi struct rte_mempool *mp;
890bbd272edSSrikanth Yalavarthi
891bbd272edSSrikanth Yalavarthi RTE_SET_USED(test);
892bbd272edSSrikanth Yalavarthi RTE_SET_USED(opt);
893bbd272edSSrikanth Yalavarthi
894bbd272edSSrikanth Yalavarthi /* release user data memzone */
895bbd272edSSrikanth Yalavarthi sprintf(mz_name, "ml_user_data_%d", fid);
896bbd272edSSrikanth Yalavarthi mz = rte_memzone_lookup(mz_name);
897bbd272edSSrikanth Yalavarthi rte_memzone_free(mz);
898bbd272edSSrikanth Yalavarthi
899bbd272edSSrikanth Yalavarthi /* destroy io pool */
900bbd272edSSrikanth Yalavarthi sprintf(mp_name, "ml_io_pool_%d", fid);
901bbd272edSSrikanth Yalavarthi mp = rte_mempool_lookup(mp_name);
902bbd272edSSrikanth Yalavarthi rte_mempool_free(mp);
903bbd272edSSrikanth Yalavarthi }
904bbd272edSSrikanth Yalavarthi
905bbd272edSSrikanth Yalavarthi int
ml_inference_mem_setup(struct ml_test * test,struct ml_options * opt)906bbd272edSSrikanth Yalavarthi ml_inference_mem_setup(struct ml_test *test, struct ml_options *opt)
907bbd272edSSrikanth Yalavarthi {
908bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test);
909bbd272edSSrikanth Yalavarthi
910bbd272edSSrikanth Yalavarthi /* create op pool */
911bbd272edSSrikanth Yalavarthi t->op_pool = rte_ml_op_pool_create("ml_test_op_pool", ML_TEST_MAX_POOL_SIZE, 0, 0,
912bbd272edSSrikanth Yalavarthi opt->socket_id);
913bbd272edSSrikanth Yalavarthi if (t->op_pool == NULL) {
914bbd272edSSrikanth Yalavarthi ml_err("Failed to create op pool : %s\n", "ml_op_pool");
915bbd272edSSrikanth Yalavarthi return -ENOMEM;
916bbd272edSSrikanth Yalavarthi }
917bbd272edSSrikanth Yalavarthi
91824364292SSrikanth Yalavarthi /* create buf_segs pool of with element of uint8_t. external buffers are attached to the
91924364292SSrikanth Yalavarthi * buf_segs while queuing inference requests.
92024364292SSrikanth Yalavarthi */
92124364292SSrikanth Yalavarthi t->buf_seg_pool = rte_mempool_create("ml_test_mbuf_pool", ML_TEST_MAX_POOL_SIZE * 2,
92224364292SSrikanth Yalavarthi sizeof(struct rte_ml_buff_seg), 0, 0, NULL, NULL, NULL,
92324364292SSrikanth Yalavarthi NULL, opt->socket_id, 0);
92424364292SSrikanth Yalavarthi if (t->buf_seg_pool == NULL) {
92524364292SSrikanth Yalavarthi ml_err("Failed to create buf_segs pool : %s\n", "ml_test_mbuf_pool");
92624364292SSrikanth Yalavarthi rte_ml_op_pool_free(t->op_pool);
92724364292SSrikanth Yalavarthi return -ENOMEM;
92824364292SSrikanth Yalavarthi }
92924364292SSrikanth Yalavarthi
930bbd272edSSrikanth Yalavarthi return 0;
931bbd272edSSrikanth Yalavarthi }
932bbd272edSSrikanth Yalavarthi
933bbd272edSSrikanth Yalavarthi void
ml_inference_mem_destroy(struct ml_test * test,struct ml_options * opt)934bbd272edSSrikanth Yalavarthi ml_inference_mem_destroy(struct ml_test *test, struct ml_options *opt)
935bbd272edSSrikanth Yalavarthi {
936bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test);
937bbd272edSSrikanth Yalavarthi
938bbd272edSSrikanth Yalavarthi RTE_SET_USED(opt);
939bbd272edSSrikanth Yalavarthi
940bbd272edSSrikanth Yalavarthi /* release op pool */
941bbd272edSSrikanth Yalavarthi rte_mempool_free(t->op_pool);
94224364292SSrikanth Yalavarthi
94324364292SSrikanth Yalavarthi /* release buf_segs pool */
94424364292SSrikanth Yalavarthi rte_mempool_free(t->buf_seg_pool);
945bbd272edSSrikanth Yalavarthi }
946bbd272edSSrikanth Yalavarthi
947da679339SSrikanth Yalavarthi static bool
ml_inference_validation(struct ml_test * test,struct ml_request * req)948da679339SSrikanth Yalavarthi ml_inference_validation(struct ml_test *test, struct ml_request *req)
949da679339SSrikanth Yalavarthi {
950da679339SSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)test);
951da679339SSrikanth Yalavarthi struct ml_model *model;
9526ebb6f98SSrikanth Yalavarthi float *reference;
9536ebb6f98SSrikanth Yalavarthi float *output;
9546ebb6f98SSrikanth Yalavarthi float deviation;
955da679339SSrikanth Yalavarthi bool match;
956da679339SSrikanth Yalavarthi uint32_t i;
957da679339SSrikanth Yalavarthi uint32_t j;
958da679339SSrikanth Yalavarthi
959da679339SSrikanth Yalavarthi model = &t->model[req->fid];
960da679339SSrikanth Yalavarthi
961da679339SSrikanth Yalavarthi /* compare crc when tolerance is 0 */
962da679339SSrikanth Yalavarthi if (t->cmn.opt->tolerance == 0.0) {
963da679339SSrikanth Yalavarthi match = (rte_hash_crc(model->output, model->out_dsize, 0) ==
964da679339SSrikanth Yalavarthi rte_hash_crc(model->reference, model->out_dsize, 0));
965da679339SSrikanth Yalavarthi } else {
9666ebb6f98SSrikanth Yalavarthi output = (float *)model->output;
9676ebb6f98SSrikanth Yalavarthi reference = (float *)model->reference;
968da679339SSrikanth Yalavarthi
969da679339SSrikanth Yalavarthi i = 0;
970da679339SSrikanth Yalavarthi next_output:
971da679339SSrikanth Yalavarthi j = 0;
972da679339SSrikanth Yalavarthi next_element:
973da679339SSrikanth Yalavarthi match = false;
97424364292SSrikanth Yalavarthi if ((*reference == 0) && (*output == 0))
97524364292SSrikanth Yalavarthi deviation = 0;
97624364292SSrikanth Yalavarthi else
97724364292SSrikanth Yalavarthi deviation = 100 * fabs(*output - *reference) / fabs(*reference);
9786ebb6f98SSrikanth Yalavarthi if (deviation <= t->cmn.opt->tolerance)
979da679339SSrikanth Yalavarthi match = true;
9806ebb6f98SSrikanth Yalavarthi else
9816ebb6f98SSrikanth Yalavarthi ml_err("id = %d, element = %d, output = %f, reference = %f, deviation = %f %%\n",
9826ebb6f98SSrikanth Yalavarthi i, j, *output, *reference, deviation);
983da679339SSrikanth Yalavarthi
9846ebb6f98SSrikanth Yalavarthi output++;
9856ebb6f98SSrikanth Yalavarthi reference++;
986da679339SSrikanth Yalavarthi
987da679339SSrikanth Yalavarthi if (!match)
988da679339SSrikanth Yalavarthi goto done;
9896ebb6f98SSrikanth Yalavarthi
990da679339SSrikanth Yalavarthi j++;
9916ebb6f98SSrikanth Yalavarthi if (j < model->info.output_info[i].nb_elements)
992da679339SSrikanth Yalavarthi goto next_element;
993da679339SSrikanth Yalavarthi
994da679339SSrikanth Yalavarthi i++;
995da679339SSrikanth Yalavarthi if (i < model->info.nb_outputs)
996da679339SSrikanth Yalavarthi goto next_output;
997da679339SSrikanth Yalavarthi }
998da679339SSrikanth Yalavarthi done:
999da679339SSrikanth Yalavarthi return match;
1000da679339SSrikanth Yalavarthi }
1001da679339SSrikanth Yalavarthi
1002bbd272edSSrikanth Yalavarthi /* Callback for mempool object iteration. This call would dequantize output data. */
1003bbd272edSSrikanth Yalavarthi static void
ml_request_finish(struct rte_mempool * mp,void * opaque,void * obj,unsigned int obj_idx)1004bbd272edSSrikanth Yalavarthi ml_request_finish(struct rte_mempool *mp, void *opaque, void *obj, unsigned int obj_idx)
1005bbd272edSSrikanth Yalavarthi {
1006bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)opaque);
1007bbd272edSSrikanth Yalavarthi struct ml_request *req = (struct ml_request *)obj;
1008bbd272edSSrikanth Yalavarthi struct ml_model *model = &t->model[req->fid];
1009da679339SSrikanth Yalavarthi bool error = false;
10108cb22a54SDavid Marchand char *dump_path;
1011bbd272edSSrikanth Yalavarthi
101224364292SSrikanth Yalavarthi struct rte_ml_buff_seg qbuff_seg[ML_TEST_MAX_IO_SIZE];
101324364292SSrikanth Yalavarthi struct rte_ml_buff_seg dbuff_seg[ML_TEST_MAX_IO_SIZE];
101424364292SSrikanth Yalavarthi struct rte_ml_buff_seg *q_segs[ML_TEST_MAX_IO_SIZE];
101524364292SSrikanth Yalavarthi struct rte_ml_buff_seg *d_segs[ML_TEST_MAX_IO_SIZE];
101624364292SSrikanth Yalavarthi uint64_t offset;
101724364292SSrikanth Yalavarthi uint64_t bufsz;
101824364292SSrikanth Yalavarthi uint32_t i;
101924364292SSrikanth Yalavarthi
1020bbd272edSSrikanth Yalavarthi RTE_SET_USED(mp);
1021bbd272edSSrikanth Yalavarthi
1022bbd272edSSrikanth Yalavarthi if (req->niters == 0)
1023bbd272edSSrikanth Yalavarthi return;
1024bbd272edSSrikanth Yalavarthi
1025bbd272edSSrikanth Yalavarthi t->nb_used++;
102624364292SSrikanth Yalavarthi
102724364292SSrikanth Yalavarthi if (t->model[req->fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED) {
102824364292SSrikanth Yalavarthi qbuff_seg[0].addr = req->output;
102924364292SSrikanth Yalavarthi qbuff_seg[0].iova_addr = rte_mem_virt2iova(req->output);
103024364292SSrikanth Yalavarthi qbuff_seg[0].length = t->model[req->fid].out_qsize;
103124364292SSrikanth Yalavarthi qbuff_seg[0].next = NULL;
103224364292SSrikanth Yalavarthi q_segs[0] = &qbuff_seg[0];
103324364292SSrikanth Yalavarthi
103424364292SSrikanth Yalavarthi dbuff_seg[0].addr = model->output;
103524364292SSrikanth Yalavarthi dbuff_seg[0].iova_addr = rte_mem_virt2iova(model->output);
103624364292SSrikanth Yalavarthi dbuff_seg[0].length = t->model[req->fid].out_dsize;
103724364292SSrikanth Yalavarthi dbuff_seg[0].next = NULL;
103824364292SSrikanth Yalavarthi d_segs[0] = &dbuff_seg[0];
103924364292SSrikanth Yalavarthi } else {
104024364292SSrikanth Yalavarthi offset = 0;
104124364292SSrikanth Yalavarthi for (i = 0; i < t->model[req->fid].info.nb_outputs; i++) {
104224364292SSrikanth Yalavarthi bufsz = RTE_ALIGN_CEIL(t->model[req->fid].info.output_info[i].size,
104324364292SSrikanth Yalavarthi t->cmn.dev_info.align_size);
104424364292SSrikanth Yalavarthi qbuff_seg[i].addr = req->output + offset;
104524364292SSrikanth Yalavarthi qbuff_seg[i].iova_addr = rte_mem_virt2iova(req->output + offset);
104624364292SSrikanth Yalavarthi qbuff_seg[i].length = bufsz;
104724364292SSrikanth Yalavarthi qbuff_seg[i].next = NULL;
104824364292SSrikanth Yalavarthi q_segs[i] = &qbuff_seg[i];
104924364292SSrikanth Yalavarthi offset += bufsz;
105024364292SSrikanth Yalavarthi }
105124364292SSrikanth Yalavarthi
105224364292SSrikanth Yalavarthi offset = 0;
105324364292SSrikanth Yalavarthi for (i = 0; i < t->model[req->fid].info.nb_outputs; i++) {
105424364292SSrikanth Yalavarthi bufsz = t->model[req->fid].info.output_info[i].nb_elements * sizeof(float);
105524364292SSrikanth Yalavarthi dbuff_seg[i].addr = model->output + offset;
105624364292SSrikanth Yalavarthi dbuff_seg[i].iova_addr = rte_mem_virt2iova(model->output + offset);
105724364292SSrikanth Yalavarthi dbuff_seg[i].length = bufsz;
105824364292SSrikanth Yalavarthi dbuff_seg[i].next = NULL;
105924364292SSrikanth Yalavarthi d_segs[i] = &dbuff_seg[i];
106024364292SSrikanth Yalavarthi offset += bufsz;
106124364292SSrikanth Yalavarthi }
106224364292SSrikanth Yalavarthi }
106324364292SSrikanth Yalavarthi
106424364292SSrikanth Yalavarthi rte_ml_io_dequantize(t->cmn.opt->dev_id, model->id, q_segs, d_segs);
1065da679339SSrikanth Yalavarthi
106672d0f9f8SSrikanth Yalavarthi if (model->reference == NULL)
1067da679339SSrikanth Yalavarthi goto dump_output_pass;
1068da679339SSrikanth Yalavarthi
1069da679339SSrikanth Yalavarthi if (!ml_inference_validation(opaque, req))
1070da679339SSrikanth Yalavarthi goto dump_output_fail;
1071da679339SSrikanth Yalavarthi else
1072da679339SSrikanth Yalavarthi goto dump_output_pass;
1073da679339SSrikanth Yalavarthi
1074da679339SSrikanth Yalavarthi dump_output_pass:
1075da679339SSrikanth Yalavarthi if (obj_idx == 0) {
1076da679339SSrikanth Yalavarthi /* write quantized output */
10778cb22a54SDavid Marchand if (asprintf(&dump_path, "%s.q", t->cmn.opt->filelist[req->fid].output) == -1)
10788cb22a54SDavid Marchand return;
10798cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, req->output, model->out_qsize, error);
10808cb22a54SDavid Marchand free(dump_path);
1081da679339SSrikanth Yalavarthi if (error)
1082da679339SSrikanth Yalavarthi return;
1083da679339SSrikanth Yalavarthi
1084da679339SSrikanth Yalavarthi /* write dequantized output */
10858cb22a54SDavid Marchand if (asprintf(&dump_path, "%s", t->cmn.opt->filelist[req->fid].output) == -1)
10868cb22a54SDavid Marchand return;
10878cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, model->output, model->out_dsize, error);
10888cb22a54SDavid Marchand free(dump_path);
1089da679339SSrikanth Yalavarthi if (error)
1090da679339SSrikanth Yalavarthi return;
1091da679339SSrikanth Yalavarthi }
109272d0f9f8SSrikanth Yalavarthi t->nb_valid++;
1093da679339SSrikanth Yalavarthi
1094da679339SSrikanth Yalavarthi return;
1095da679339SSrikanth Yalavarthi
1096da679339SSrikanth Yalavarthi dump_output_fail:
1097da679339SSrikanth Yalavarthi if (t->cmn.opt->debug) {
1098da679339SSrikanth Yalavarthi /* dump quantized output buffer */
10998cb22a54SDavid Marchand if (asprintf(&dump_path, "%s.q.%u", t->cmn.opt->filelist[req->fid].output,
11008cb22a54SDavid Marchand obj_idx) == -1)
11018cb22a54SDavid Marchand return;
11028cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, req->output, model->out_qsize, error);
11038cb22a54SDavid Marchand free(dump_path);
1104da679339SSrikanth Yalavarthi if (error)
1105da679339SSrikanth Yalavarthi return;
1106da679339SSrikanth Yalavarthi
1107da679339SSrikanth Yalavarthi /* dump dequantized output buffer */
11085d41169bSSrikanth Yalavarthi if (asprintf(&dump_path, "%s.%u", t->cmn.opt->filelist[req->fid].output, obj_idx) ==
11095d41169bSSrikanth Yalavarthi -1)
11108cb22a54SDavid Marchand return;
11118cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, model->output, model->out_dsize, error);
11128cb22a54SDavid Marchand free(dump_path);
1113da679339SSrikanth Yalavarthi if (error)
1114da679339SSrikanth Yalavarthi return;
1115da679339SSrikanth Yalavarthi }
1116bbd272edSSrikanth Yalavarthi }
1117bbd272edSSrikanth Yalavarthi
1118bbd272edSSrikanth Yalavarthi int
ml_inference_result(struct ml_test * test,struct ml_options * opt,uint16_t fid)1119bbd272edSSrikanth Yalavarthi ml_inference_result(struct ml_test *test, struct ml_options *opt, uint16_t fid)
1120bbd272edSSrikanth Yalavarthi {
1121bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test);
1122bbd272edSSrikanth Yalavarthi uint64_t error_count = 0;
1123bbd272edSSrikanth Yalavarthi uint32_t i;
1124bbd272edSSrikanth Yalavarthi
1125bbd272edSSrikanth Yalavarthi RTE_SET_USED(opt);
1126bbd272edSSrikanth Yalavarthi
1127bbd272edSSrikanth Yalavarthi /* check for errors */
1128bbd272edSSrikanth Yalavarthi for (i = 0; i < RTE_MAX_LCORE; i++)
1129bbd272edSSrikanth Yalavarthi error_count += t->error_count[i];
1130bbd272edSSrikanth Yalavarthi
1131bbd272edSSrikanth Yalavarthi rte_mempool_obj_iter(t->model[fid].io_pool, ml_request_finish, test);
1132bbd272edSSrikanth Yalavarthi
1133da679339SSrikanth Yalavarthi if ((t->nb_used == t->nb_valid) && (error_count == 0))
1134bbd272edSSrikanth Yalavarthi t->cmn.result = ML_TEST_SUCCESS;
1135bbd272edSSrikanth Yalavarthi else
1136bbd272edSSrikanth Yalavarthi t->cmn.result = ML_TEST_FAILED;
1137bbd272edSSrikanth Yalavarthi
1138bbd272edSSrikanth Yalavarthi return t->cmn.result;
1139bbd272edSSrikanth Yalavarthi }
1140bbd272edSSrikanth Yalavarthi
1141bbd272edSSrikanth Yalavarthi int
ml_inference_launch_cores(struct ml_test * test,struct ml_options * opt,uint16_t start_fid,uint16_t end_fid)1142bbd272edSSrikanth Yalavarthi ml_inference_launch_cores(struct ml_test *test, struct ml_options *opt, uint16_t start_fid,
1143bbd272edSSrikanth Yalavarthi uint16_t end_fid)
1144bbd272edSSrikanth Yalavarthi {
1145bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test);
1146bbd272edSSrikanth Yalavarthi uint32_t lcore_id;
1147c0e87165SSrikanth Yalavarthi uint32_t nb_reqs;
1148bbd272edSSrikanth Yalavarthi uint32_t id = 0;
1149c0e87165SSrikanth Yalavarthi uint32_t qp_id;
1150c0e87165SSrikanth Yalavarthi
1151c0e87165SSrikanth Yalavarthi nb_reqs = opt->repetitions / opt->queue_pairs;
1152bbd272edSSrikanth Yalavarthi
1153bbd272edSSrikanth Yalavarthi RTE_LCORE_FOREACH_WORKER(lcore_id)
1154bbd272edSSrikanth Yalavarthi {
1155c0e87165SSrikanth Yalavarthi if (id >= opt->queue_pairs * 2)
1156bbd272edSSrikanth Yalavarthi break;
1157bbd272edSSrikanth Yalavarthi
1158c0e87165SSrikanth Yalavarthi qp_id = id / 2;
1159c0e87165SSrikanth Yalavarthi t->args[lcore_id].qp_id = qp_id;
1160c0e87165SSrikanth Yalavarthi t->args[lcore_id].nb_reqs = nb_reqs;
1161c0e87165SSrikanth Yalavarthi if (qp_id == 0)
1162c0e87165SSrikanth Yalavarthi t->args[lcore_id].nb_reqs += opt->repetitions - nb_reqs * opt->queue_pairs;
1163c0e87165SSrikanth Yalavarthi
1164c0e87165SSrikanth Yalavarthi if (t->args[lcore_id].nb_reqs == 0) {
1165c0e87165SSrikanth Yalavarthi id++;
1166c0e87165SSrikanth Yalavarthi break;
1167c0e87165SSrikanth Yalavarthi }
1168c0e87165SSrikanth Yalavarthi
1169bbd272edSSrikanth Yalavarthi t->args[lcore_id].start_fid = start_fid;
1170bbd272edSSrikanth Yalavarthi t->args[lcore_id].end_fid = end_fid;
1171bbd272edSSrikanth Yalavarthi
1172bbd272edSSrikanth Yalavarthi if (id % 2 == 0)
1173bbd272edSSrikanth Yalavarthi rte_eal_remote_launch(t->enqueue, test, lcore_id);
1174bbd272edSSrikanth Yalavarthi else
1175bbd272edSSrikanth Yalavarthi rte_eal_remote_launch(t->dequeue, test, lcore_id);
1176bbd272edSSrikanth Yalavarthi
1177bbd272edSSrikanth Yalavarthi id++;
1178bbd272edSSrikanth Yalavarthi }
1179bbd272edSSrikanth Yalavarthi
1180bbd272edSSrikanth Yalavarthi return 0;
1181bbd272edSSrikanth Yalavarthi }
1182