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