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 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 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 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 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 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 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 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 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 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 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 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 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 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 if (mz != NULL) 874bbd272edSSrikanth Yalavarthi rte_memzone_free(mz); 875bbd272edSSrikanth Yalavarthi 876bbd272edSSrikanth Yalavarthi if (t->model[fid].io_pool != NULL) { 877bbd272edSSrikanth Yalavarthi rte_mempool_free(t->model[fid].io_pool); 878bbd272edSSrikanth Yalavarthi t->model[fid].io_pool = NULL; 879bbd272edSSrikanth Yalavarthi } 880bbd272edSSrikanth Yalavarthi 881bbd272edSSrikanth Yalavarthi return ret; 882bbd272edSSrikanth Yalavarthi } 883bbd272edSSrikanth Yalavarthi 884bbd272edSSrikanth Yalavarthi void 885bbd272edSSrikanth Yalavarthi ml_inference_iomem_destroy(struct ml_test *test, struct ml_options *opt, uint16_t fid) 886bbd272edSSrikanth Yalavarthi { 887bbd272edSSrikanth Yalavarthi char mz_name[RTE_MEMZONE_NAMESIZE]; 888bbd272edSSrikanth Yalavarthi char mp_name[RTE_MEMPOOL_NAMESIZE]; 889bbd272edSSrikanth Yalavarthi const struct rte_memzone *mz; 890bbd272edSSrikanth Yalavarthi struct rte_mempool *mp; 891bbd272edSSrikanth Yalavarthi 892bbd272edSSrikanth Yalavarthi RTE_SET_USED(test); 893bbd272edSSrikanth Yalavarthi RTE_SET_USED(opt); 894bbd272edSSrikanth Yalavarthi 895bbd272edSSrikanth Yalavarthi /* release user data memzone */ 896bbd272edSSrikanth Yalavarthi sprintf(mz_name, "ml_user_data_%d", fid); 897bbd272edSSrikanth Yalavarthi mz = rte_memzone_lookup(mz_name); 898bbd272edSSrikanth Yalavarthi if (mz != NULL) 899bbd272edSSrikanth Yalavarthi rte_memzone_free(mz); 900bbd272edSSrikanth Yalavarthi 901bbd272edSSrikanth Yalavarthi /* destroy io pool */ 902bbd272edSSrikanth Yalavarthi sprintf(mp_name, "ml_io_pool_%d", fid); 903bbd272edSSrikanth Yalavarthi mp = rte_mempool_lookup(mp_name); 904bbd272edSSrikanth Yalavarthi rte_mempool_free(mp); 905bbd272edSSrikanth Yalavarthi } 906bbd272edSSrikanth Yalavarthi 907bbd272edSSrikanth Yalavarthi int 908bbd272edSSrikanth Yalavarthi ml_inference_mem_setup(struct ml_test *test, struct ml_options *opt) 909bbd272edSSrikanth Yalavarthi { 910bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test); 911bbd272edSSrikanth Yalavarthi 912bbd272edSSrikanth Yalavarthi /* create op pool */ 913bbd272edSSrikanth Yalavarthi t->op_pool = rte_ml_op_pool_create("ml_test_op_pool", ML_TEST_MAX_POOL_SIZE, 0, 0, 914bbd272edSSrikanth Yalavarthi opt->socket_id); 915bbd272edSSrikanth Yalavarthi if (t->op_pool == NULL) { 916bbd272edSSrikanth Yalavarthi ml_err("Failed to create op pool : %s\n", "ml_op_pool"); 917bbd272edSSrikanth Yalavarthi return -ENOMEM; 918bbd272edSSrikanth Yalavarthi } 919bbd272edSSrikanth Yalavarthi 92024364292SSrikanth Yalavarthi /* create buf_segs pool of with element of uint8_t. external buffers are attached to the 92124364292SSrikanth Yalavarthi * buf_segs while queuing inference requests. 92224364292SSrikanth Yalavarthi */ 92324364292SSrikanth Yalavarthi t->buf_seg_pool = rte_mempool_create("ml_test_mbuf_pool", ML_TEST_MAX_POOL_SIZE * 2, 92424364292SSrikanth Yalavarthi sizeof(struct rte_ml_buff_seg), 0, 0, NULL, NULL, NULL, 92524364292SSrikanth Yalavarthi NULL, opt->socket_id, 0); 92624364292SSrikanth Yalavarthi if (t->buf_seg_pool == NULL) { 92724364292SSrikanth Yalavarthi ml_err("Failed to create buf_segs pool : %s\n", "ml_test_mbuf_pool"); 92824364292SSrikanth Yalavarthi rte_ml_op_pool_free(t->op_pool); 92924364292SSrikanth Yalavarthi return -ENOMEM; 93024364292SSrikanth Yalavarthi } 93124364292SSrikanth Yalavarthi 932bbd272edSSrikanth Yalavarthi return 0; 933bbd272edSSrikanth Yalavarthi } 934bbd272edSSrikanth Yalavarthi 935bbd272edSSrikanth Yalavarthi void 936bbd272edSSrikanth Yalavarthi ml_inference_mem_destroy(struct ml_test *test, struct ml_options *opt) 937bbd272edSSrikanth Yalavarthi { 938bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test); 939bbd272edSSrikanth Yalavarthi 940bbd272edSSrikanth Yalavarthi RTE_SET_USED(opt); 941bbd272edSSrikanth Yalavarthi 942bbd272edSSrikanth Yalavarthi /* release op pool */ 943bbd272edSSrikanth Yalavarthi rte_mempool_free(t->op_pool); 94424364292SSrikanth Yalavarthi 94524364292SSrikanth Yalavarthi /* release buf_segs pool */ 94624364292SSrikanth Yalavarthi rte_mempool_free(t->buf_seg_pool); 947bbd272edSSrikanth Yalavarthi } 948bbd272edSSrikanth Yalavarthi 949da679339SSrikanth Yalavarthi static bool 950da679339SSrikanth Yalavarthi ml_inference_validation(struct ml_test *test, struct ml_request *req) 951da679339SSrikanth Yalavarthi { 952da679339SSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)test); 953da679339SSrikanth Yalavarthi struct ml_model *model; 9546ebb6f98SSrikanth Yalavarthi float *reference; 9556ebb6f98SSrikanth Yalavarthi float *output; 9566ebb6f98SSrikanth Yalavarthi float deviation; 957da679339SSrikanth Yalavarthi bool match; 958da679339SSrikanth Yalavarthi uint32_t i; 959da679339SSrikanth Yalavarthi uint32_t j; 960da679339SSrikanth Yalavarthi 961da679339SSrikanth Yalavarthi model = &t->model[req->fid]; 962da679339SSrikanth Yalavarthi 963da679339SSrikanth Yalavarthi /* compare crc when tolerance is 0 */ 964da679339SSrikanth Yalavarthi if (t->cmn.opt->tolerance == 0.0) { 965da679339SSrikanth Yalavarthi match = (rte_hash_crc(model->output, model->out_dsize, 0) == 966da679339SSrikanth Yalavarthi rte_hash_crc(model->reference, model->out_dsize, 0)); 967da679339SSrikanth Yalavarthi } else { 9686ebb6f98SSrikanth Yalavarthi output = (float *)model->output; 9696ebb6f98SSrikanth Yalavarthi reference = (float *)model->reference; 970da679339SSrikanth Yalavarthi 971da679339SSrikanth Yalavarthi i = 0; 972da679339SSrikanth Yalavarthi next_output: 973da679339SSrikanth Yalavarthi j = 0; 974da679339SSrikanth Yalavarthi next_element: 975da679339SSrikanth Yalavarthi match = false; 97624364292SSrikanth Yalavarthi if ((*reference == 0) && (*output == 0)) 97724364292SSrikanth Yalavarthi deviation = 0; 97824364292SSrikanth Yalavarthi else 97924364292SSrikanth Yalavarthi deviation = 100 * fabs(*output - *reference) / fabs(*reference); 9806ebb6f98SSrikanth Yalavarthi if (deviation <= t->cmn.opt->tolerance) 981da679339SSrikanth Yalavarthi match = true; 9826ebb6f98SSrikanth Yalavarthi else 9836ebb6f98SSrikanth Yalavarthi ml_err("id = %d, element = %d, output = %f, reference = %f, deviation = %f %%\n", 9846ebb6f98SSrikanth Yalavarthi i, j, *output, *reference, deviation); 985da679339SSrikanth Yalavarthi 9866ebb6f98SSrikanth Yalavarthi output++; 9876ebb6f98SSrikanth Yalavarthi reference++; 988da679339SSrikanth Yalavarthi 989da679339SSrikanth Yalavarthi if (!match) 990da679339SSrikanth Yalavarthi goto done; 9916ebb6f98SSrikanth Yalavarthi 992da679339SSrikanth Yalavarthi j++; 9936ebb6f98SSrikanth Yalavarthi if (j < model->info.output_info[i].nb_elements) 994da679339SSrikanth Yalavarthi goto next_element; 995da679339SSrikanth Yalavarthi 996da679339SSrikanth Yalavarthi i++; 997da679339SSrikanth Yalavarthi if (i < model->info.nb_outputs) 998da679339SSrikanth Yalavarthi goto next_output; 999da679339SSrikanth Yalavarthi } 1000da679339SSrikanth Yalavarthi done: 1001da679339SSrikanth Yalavarthi return match; 1002da679339SSrikanth Yalavarthi } 1003da679339SSrikanth Yalavarthi 1004bbd272edSSrikanth Yalavarthi /* Callback for mempool object iteration. This call would dequantize output data. */ 1005bbd272edSSrikanth Yalavarthi static void 1006bbd272edSSrikanth Yalavarthi ml_request_finish(struct rte_mempool *mp, void *opaque, void *obj, unsigned int obj_idx) 1007bbd272edSSrikanth Yalavarthi { 1008bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv((struct ml_test *)opaque); 1009bbd272edSSrikanth Yalavarthi struct ml_request *req = (struct ml_request *)obj; 1010bbd272edSSrikanth Yalavarthi struct ml_model *model = &t->model[req->fid]; 1011da679339SSrikanth Yalavarthi bool error = false; 10128cb22a54SDavid Marchand char *dump_path; 1013bbd272edSSrikanth Yalavarthi 101424364292SSrikanth Yalavarthi struct rte_ml_buff_seg qbuff_seg[ML_TEST_MAX_IO_SIZE]; 101524364292SSrikanth Yalavarthi struct rte_ml_buff_seg dbuff_seg[ML_TEST_MAX_IO_SIZE]; 101624364292SSrikanth Yalavarthi struct rte_ml_buff_seg *q_segs[ML_TEST_MAX_IO_SIZE]; 101724364292SSrikanth Yalavarthi struct rte_ml_buff_seg *d_segs[ML_TEST_MAX_IO_SIZE]; 101824364292SSrikanth Yalavarthi uint64_t offset; 101924364292SSrikanth Yalavarthi uint64_t bufsz; 102024364292SSrikanth Yalavarthi uint32_t i; 102124364292SSrikanth Yalavarthi 1022bbd272edSSrikanth Yalavarthi RTE_SET_USED(mp); 1023bbd272edSSrikanth Yalavarthi 1024bbd272edSSrikanth Yalavarthi if (req->niters == 0) 1025bbd272edSSrikanth Yalavarthi return; 1026bbd272edSSrikanth Yalavarthi 1027bbd272edSSrikanth Yalavarthi t->nb_used++; 102824364292SSrikanth Yalavarthi 102924364292SSrikanth Yalavarthi if (t->model[req->fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED) { 103024364292SSrikanth Yalavarthi qbuff_seg[0].addr = req->output; 103124364292SSrikanth Yalavarthi qbuff_seg[0].iova_addr = rte_mem_virt2iova(req->output); 103224364292SSrikanth Yalavarthi qbuff_seg[0].length = t->model[req->fid].out_qsize; 103324364292SSrikanth Yalavarthi qbuff_seg[0].next = NULL; 103424364292SSrikanth Yalavarthi q_segs[0] = &qbuff_seg[0]; 103524364292SSrikanth Yalavarthi 103624364292SSrikanth Yalavarthi dbuff_seg[0].addr = model->output; 103724364292SSrikanth Yalavarthi dbuff_seg[0].iova_addr = rte_mem_virt2iova(model->output); 103824364292SSrikanth Yalavarthi dbuff_seg[0].length = t->model[req->fid].out_dsize; 103924364292SSrikanth Yalavarthi dbuff_seg[0].next = NULL; 104024364292SSrikanth Yalavarthi d_segs[0] = &dbuff_seg[0]; 104124364292SSrikanth Yalavarthi } else { 104224364292SSrikanth Yalavarthi offset = 0; 104324364292SSrikanth Yalavarthi for (i = 0; i < t->model[req->fid].info.nb_outputs; i++) { 104424364292SSrikanth Yalavarthi bufsz = RTE_ALIGN_CEIL(t->model[req->fid].info.output_info[i].size, 104524364292SSrikanth Yalavarthi t->cmn.dev_info.align_size); 104624364292SSrikanth Yalavarthi qbuff_seg[i].addr = req->output + offset; 104724364292SSrikanth Yalavarthi qbuff_seg[i].iova_addr = rte_mem_virt2iova(req->output + offset); 104824364292SSrikanth Yalavarthi qbuff_seg[i].length = bufsz; 104924364292SSrikanth Yalavarthi qbuff_seg[i].next = NULL; 105024364292SSrikanth Yalavarthi q_segs[i] = &qbuff_seg[i]; 105124364292SSrikanth Yalavarthi offset += bufsz; 105224364292SSrikanth Yalavarthi } 105324364292SSrikanth Yalavarthi 105424364292SSrikanth Yalavarthi offset = 0; 105524364292SSrikanth Yalavarthi for (i = 0; i < t->model[req->fid].info.nb_outputs; i++) { 105624364292SSrikanth Yalavarthi bufsz = t->model[req->fid].info.output_info[i].nb_elements * sizeof(float); 105724364292SSrikanth Yalavarthi dbuff_seg[i].addr = model->output + offset; 105824364292SSrikanth Yalavarthi dbuff_seg[i].iova_addr = rte_mem_virt2iova(model->output + offset); 105924364292SSrikanth Yalavarthi dbuff_seg[i].length = bufsz; 106024364292SSrikanth Yalavarthi dbuff_seg[i].next = NULL; 106124364292SSrikanth Yalavarthi d_segs[i] = &dbuff_seg[i]; 106224364292SSrikanth Yalavarthi offset += bufsz; 106324364292SSrikanth Yalavarthi } 106424364292SSrikanth Yalavarthi } 106524364292SSrikanth Yalavarthi 106624364292SSrikanth Yalavarthi rte_ml_io_dequantize(t->cmn.opt->dev_id, model->id, q_segs, d_segs); 1067da679339SSrikanth Yalavarthi 106872d0f9f8SSrikanth Yalavarthi if (model->reference == NULL) 1069da679339SSrikanth Yalavarthi goto dump_output_pass; 1070da679339SSrikanth Yalavarthi 1071da679339SSrikanth Yalavarthi if (!ml_inference_validation(opaque, req)) 1072da679339SSrikanth Yalavarthi goto dump_output_fail; 1073da679339SSrikanth Yalavarthi else 1074da679339SSrikanth Yalavarthi goto dump_output_pass; 1075da679339SSrikanth Yalavarthi 1076da679339SSrikanth Yalavarthi dump_output_pass: 1077da679339SSrikanth Yalavarthi if (obj_idx == 0) { 1078da679339SSrikanth Yalavarthi /* write quantized output */ 10798cb22a54SDavid Marchand if (asprintf(&dump_path, "%s.q", t->cmn.opt->filelist[req->fid].output) == -1) 10808cb22a54SDavid Marchand return; 10818cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, req->output, model->out_qsize, error); 10828cb22a54SDavid Marchand free(dump_path); 1083da679339SSrikanth Yalavarthi if (error) 1084da679339SSrikanth Yalavarthi return; 1085da679339SSrikanth Yalavarthi 1086da679339SSrikanth Yalavarthi /* write dequantized output */ 10878cb22a54SDavid Marchand if (asprintf(&dump_path, "%s", t->cmn.opt->filelist[req->fid].output) == -1) 10888cb22a54SDavid Marchand return; 10898cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, model->output, model->out_dsize, error); 10908cb22a54SDavid Marchand free(dump_path); 1091da679339SSrikanth Yalavarthi if (error) 1092da679339SSrikanth Yalavarthi return; 1093da679339SSrikanth Yalavarthi } 109472d0f9f8SSrikanth Yalavarthi t->nb_valid++; 1095da679339SSrikanth Yalavarthi 1096da679339SSrikanth Yalavarthi return; 1097da679339SSrikanth Yalavarthi 1098da679339SSrikanth Yalavarthi dump_output_fail: 1099da679339SSrikanth Yalavarthi if (t->cmn.opt->debug) { 1100da679339SSrikanth Yalavarthi /* dump quantized output buffer */ 11018cb22a54SDavid Marchand if (asprintf(&dump_path, "%s.q.%u", t->cmn.opt->filelist[req->fid].output, 11028cb22a54SDavid Marchand obj_idx) == -1) 11038cb22a54SDavid Marchand return; 11048cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, req->output, model->out_qsize, error); 11058cb22a54SDavid Marchand free(dump_path); 1106da679339SSrikanth Yalavarthi if (error) 1107da679339SSrikanth Yalavarthi return; 1108da679339SSrikanth Yalavarthi 1109da679339SSrikanth Yalavarthi /* dump dequantized output buffer */ 11105d41169bSSrikanth Yalavarthi if (asprintf(&dump_path, "%s.%u", t->cmn.opt->filelist[req->fid].output, obj_idx) == 11115d41169bSSrikanth Yalavarthi -1) 11128cb22a54SDavid Marchand return; 11138cb22a54SDavid Marchand ML_OPEN_WRITE_GET_ERR(dump_path, model->output, model->out_dsize, error); 11148cb22a54SDavid Marchand free(dump_path); 1115da679339SSrikanth Yalavarthi if (error) 1116da679339SSrikanth Yalavarthi return; 1117da679339SSrikanth Yalavarthi } 1118bbd272edSSrikanth Yalavarthi } 1119bbd272edSSrikanth Yalavarthi 1120bbd272edSSrikanth Yalavarthi int 1121bbd272edSSrikanth Yalavarthi ml_inference_result(struct ml_test *test, struct ml_options *opt, uint16_t fid) 1122bbd272edSSrikanth Yalavarthi { 1123bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test); 1124bbd272edSSrikanth Yalavarthi uint64_t error_count = 0; 1125bbd272edSSrikanth Yalavarthi uint32_t i; 1126bbd272edSSrikanth Yalavarthi 1127bbd272edSSrikanth Yalavarthi RTE_SET_USED(opt); 1128bbd272edSSrikanth Yalavarthi 1129bbd272edSSrikanth Yalavarthi /* check for errors */ 1130bbd272edSSrikanth Yalavarthi for (i = 0; i < RTE_MAX_LCORE; i++) 1131bbd272edSSrikanth Yalavarthi error_count += t->error_count[i]; 1132bbd272edSSrikanth Yalavarthi 1133bbd272edSSrikanth Yalavarthi rte_mempool_obj_iter(t->model[fid].io_pool, ml_request_finish, test); 1134bbd272edSSrikanth Yalavarthi 1135da679339SSrikanth Yalavarthi if ((t->nb_used == t->nb_valid) && (error_count == 0)) 1136bbd272edSSrikanth Yalavarthi t->cmn.result = ML_TEST_SUCCESS; 1137bbd272edSSrikanth Yalavarthi else 1138bbd272edSSrikanth Yalavarthi t->cmn.result = ML_TEST_FAILED; 1139bbd272edSSrikanth Yalavarthi 1140bbd272edSSrikanth Yalavarthi return t->cmn.result; 1141bbd272edSSrikanth Yalavarthi } 1142bbd272edSSrikanth Yalavarthi 1143bbd272edSSrikanth Yalavarthi int 1144bbd272edSSrikanth Yalavarthi ml_inference_launch_cores(struct ml_test *test, struct ml_options *opt, uint16_t start_fid, 1145bbd272edSSrikanth Yalavarthi uint16_t end_fid) 1146bbd272edSSrikanth Yalavarthi { 1147bbd272edSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test); 1148bbd272edSSrikanth Yalavarthi uint32_t lcore_id; 1149c0e87165SSrikanth Yalavarthi uint32_t nb_reqs; 1150bbd272edSSrikanth Yalavarthi uint32_t id = 0; 1151c0e87165SSrikanth Yalavarthi uint32_t qp_id; 1152c0e87165SSrikanth Yalavarthi 1153c0e87165SSrikanth Yalavarthi nb_reqs = opt->repetitions / opt->queue_pairs; 1154bbd272edSSrikanth Yalavarthi 1155bbd272edSSrikanth Yalavarthi RTE_LCORE_FOREACH_WORKER(lcore_id) 1156bbd272edSSrikanth Yalavarthi { 1157c0e87165SSrikanth Yalavarthi if (id >= opt->queue_pairs * 2) 1158bbd272edSSrikanth Yalavarthi break; 1159bbd272edSSrikanth Yalavarthi 1160c0e87165SSrikanth Yalavarthi qp_id = id / 2; 1161c0e87165SSrikanth Yalavarthi t->args[lcore_id].qp_id = qp_id; 1162c0e87165SSrikanth Yalavarthi t->args[lcore_id].nb_reqs = nb_reqs; 1163c0e87165SSrikanth Yalavarthi if (qp_id == 0) 1164c0e87165SSrikanth Yalavarthi t->args[lcore_id].nb_reqs += opt->repetitions - nb_reqs * opt->queue_pairs; 1165c0e87165SSrikanth Yalavarthi 1166c0e87165SSrikanth Yalavarthi if (t->args[lcore_id].nb_reqs == 0) { 1167c0e87165SSrikanth Yalavarthi id++; 1168c0e87165SSrikanth Yalavarthi break; 1169c0e87165SSrikanth Yalavarthi } 1170c0e87165SSrikanth Yalavarthi 1171bbd272edSSrikanth Yalavarthi t->args[lcore_id].start_fid = start_fid; 1172bbd272edSSrikanth Yalavarthi t->args[lcore_id].end_fid = end_fid; 1173bbd272edSSrikanth Yalavarthi 1174bbd272edSSrikanth Yalavarthi if (id % 2 == 0) 1175bbd272edSSrikanth Yalavarthi rte_eal_remote_launch(t->enqueue, test, lcore_id); 1176bbd272edSSrikanth Yalavarthi else 1177bbd272edSSrikanth Yalavarthi rte_eal_remote_launch(t->dequeue, test, lcore_id); 1178bbd272edSSrikanth Yalavarthi 1179bbd272edSSrikanth Yalavarthi id++; 1180bbd272edSSrikanth Yalavarthi } 1181bbd272edSSrikanth Yalavarthi 1182bbd272edSSrikanth Yalavarthi return 0; 1183bbd272edSSrikanth Yalavarthi } 1184