Callback for mempool object iteration. This call would dequantize output data. */
| 1003 | |
| 1004 | /* Callback for mempool object iteration. This call would dequantize output data. */ |
| 1005 | static void |
| 1006 | ml_request_finish(struct rte_mempool *mp, void *opaque, void *obj, unsigned int obj_idx) |
| 1007 | { |
| 1008 | struct test_inference *t = ml_test_priv((struct ml_test *)opaque); |
| 1009 | struct ml_request *req = (struct ml_request *)obj; |
| 1010 | struct ml_model *model = &t->model[req->fid]; |
| 1011 | bool error = false; |
| 1012 | char *dump_path; |
| 1013 | |
| 1014 | struct rte_ml_buff_seg qbuff_seg[ML_TEST_MAX_IO_SIZE]; |
| 1015 | struct rte_ml_buff_seg dbuff_seg[ML_TEST_MAX_IO_SIZE]; |
| 1016 | struct rte_ml_buff_seg *q_segs[ML_TEST_MAX_IO_SIZE]; |
| 1017 | struct rte_ml_buff_seg *d_segs[ML_TEST_MAX_IO_SIZE]; |
| 1018 | uint64_t offset; |
| 1019 | uint64_t bufsz; |
| 1020 | uint32_t i; |
| 1021 | |
| 1022 | RTE_SET_USED(mp); |
| 1023 | |
| 1024 | if (req->niters == 0) |
| 1025 | return; |
| 1026 | |
| 1027 | t->nb_used++; |
| 1028 | |
| 1029 | if (t->model[req->fid].info.io_layout == RTE_ML_IO_LAYOUT_PACKED) { |
| 1030 | qbuff_seg[0].addr = req->output; |
| 1031 | qbuff_seg[0].iova_addr = rte_mem_virt2iova(req->output); |
| 1032 | qbuff_seg[0].length = t->model[req->fid].out_qsize; |
| 1033 | qbuff_seg[0].next = NULL; |
| 1034 | q_segs[0] = &qbuff_seg[0]; |
| 1035 | |
| 1036 | dbuff_seg[0].addr = model->output; |
| 1037 | dbuff_seg[0].iova_addr = rte_mem_virt2iova(model->output); |
| 1038 | dbuff_seg[0].length = t->model[req->fid].out_dsize; |
| 1039 | dbuff_seg[0].next = NULL; |
| 1040 | d_segs[0] = &dbuff_seg[0]; |
| 1041 | } else { |
| 1042 | offset = 0; |
| 1043 | for (i = 0; i < t->model[req->fid].info.nb_outputs; i++) { |
| 1044 | bufsz = RTE_ALIGN_CEIL(t->model[req->fid].info.output_info[i].size, |
| 1045 | t->cmn.dev_info.align_size); |
| 1046 | qbuff_seg[i].addr = req->output + offset; |
| 1047 | qbuff_seg[i].iova_addr = rte_mem_virt2iova(req->output + offset); |
| 1048 | qbuff_seg[i].length = bufsz; |
| 1049 | qbuff_seg[i].next = NULL; |
| 1050 | q_segs[i] = &qbuff_seg[i]; |
| 1051 | offset += bufsz; |
| 1052 | } |
| 1053 | |
| 1054 | offset = 0; |
| 1055 | for (i = 0; i < t->model[req->fid].info.nb_outputs; i++) { |
| 1056 | bufsz = t->model[req->fid].info.output_info[i].nb_elements * sizeof(float); |
| 1057 | dbuff_seg[i].addr = model->output + offset; |
| 1058 | dbuff_seg[i].iova_addr = rte_mem_virt2iova(model->output + offset); |
| 1059 | dbuff_seg[i].length = bufsz; |
| 1060 | dbuff_seg[i].next = NULL; |
| 1061 | d_segs[i] = &dbuff_seg[i]; |
| 1062 | offset += bufsz; |
nothing calls this directly
no test coverage detected