1*77fefa0aSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2*77fefa0aSSrikanth Yalavarthi * Copyright (c) 2023 Marvell.
3*77fefa0aSSrikanth Yalavarthi */
4*77fefa0aSSrikanth Yalavarthi
5*77fefa0aSSrikanth Yalavarthi #include "test_stats.h"
6*77fefa0aSSrikanth Yalavarthi #include "test_inference_common.h"
7*77fefa0aSSrikanth Yalavarthi #include "test_model_ops.h"
8*77fefa0aSSrikanth Yalavarthi
9*77fefa0aSSrikanth Yalavarthi int
ml_stats_get(struct ml_test * test,struct ml_options * opt,enum rte_ml_dev_xstats_mode mode,int32_t fid)10*77fefa0aSSrikanth Yalavarthi ml_stats_get(struct ml_test *test, struct ml_options *opt, enum rte_ml_dev_xstats_mode mode,
11*77fefa0aSSrikanth Yalavarthi int32_t fid)
12*77fefa0aSSrikanth Yalavarthi {
13*77fefa0aSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
14*77fefa0aSSrikanth Yalavarthi int32_t model_id;
15*77fefa0aSSrikanth Yalavarthi int ret;
16*77fefa0aSSrikanth Yalavarthi int i;
17*77fefa0aSSrikanth Yalavarthi
18*77fefa0aSSrikanth Yalavarthi if (!opt->stats)
19*77fefa0aSSrikanth Yalavarthi return 0;
20*77fefa0aSSrikanth Yalavarthi
21*77fefa0aSSrikanth Yalavarthi if (mode == RTE_ML_DEV_XSTATS_MODEL)
22*77fefa0aSSrikanth Yalavarthi model_id = ((struct test_inference *)t)->model[fid].id;
23*77fefa0aSSrikanth Yalavarthi else
24*77fefa0aSSrikanth Yalavarthi model_id = -1;
25*77fefa0aSSrikanth Yalavarthi
26*77fefa0aSSrikanth Yalavarthi /* get xstats size */
27*77fefa0aSSrikanth Yalavarthi t->xstats_size = rte_ml_dev_xstats_names_get(opt->dev_id, mode, model_id, NULL, 0);
28*77fefa0aSSrikanth Yalavarthi if (t->xstats_size > 0) {
29*77fefa0aSSrikanth Yalavarthi /* allocate for xstats_map and values */
30*77fefa0aSSrikanth Yalavarthi t->xstats_map = rte_malloc(
31*77fefa0aSSrikanth Yalavarthi "ml_xstats_map", t->xstats_size * sizeof(struct rte_ml_dev_xstats_map), 0);
32*77fefa0aSSrikanth Yalavarthi if (t->xstats_map == NULL) {
33*77fefa0aSSrikanth Yalavarthi ret = -ENOMEM;
34*77fefa0aSSrikanth Yalavarthi goto error;
35*77fefa0aSSrikanth Yalavarthi }
36*77fefa0aSSrikanth Yalavarthi
37*77fefa0aSSrikanth Yalavarthi t->xstats_values =
38*77fefa0aSSrikanth Yalavarthi rte_malloc("ml_xstats_values", t->xstats_size * sizeof(uint64_t), 0);
39*77fefa0aSSrikanth Yalavarthi if (t->xstats_values == NULL) {
40*77fefa0aSSrikanth Yalavarthi ret = -ENOMEM;
41*77fefa0aSSrikanth Yalavarthi goto error;
42*77fefa0aSSrikanth Yalavarthi }
43*77fefa0aSSrikanth Yalavarthi
44*77fefa0aSSrikanth Yalavarthi ret = rte_ml_dev_xstats_names_get(opt->dev_id, mode, model_id, t->xstats_map,
45*77fefa0aSSrikanth Yalavarthi t->xstats_size);
46*77fefa0aSSrikanth Yalavarthi if (ret != t->xstats_size) {
47*77fefa0aSSrikanth Yalavarthi printf("Unable to get xstats names, ret = %d\n", ret);
48*77fefa0aSSrikanth Yalavarthi ret = -1;
49*77fefa0aSSrikanth Yalavarthi goto error;
50*77fefa0aSSrikanth Yalavarthi }
51*77fefa0aSSrikanth Yalavarthi
52*77fefa0aSSrikanth Yalavarthi for (i = 0; i < t->xstats_size; i++)
53*77fefa0aSSrikanth Yalavarthi rte_ml_dev_xstats_get(opt->dev_id, mode, model_id, &t->xstats_map[i].id,
54*77fefa0aSSrikanth Yalavarthi &t->xstats_values[i], 1);
55*77fefa0aSSrikanth Yalavarthi }
56*77fefa0aSSrikanth Yalavarthi
57*77fefa0aSSrikanth Yalavarthi /* print xstats*/
58*77fefa0aSSrikanth Yalavarthi printf("\n");
59*77fefa0aSSrikanth Yalavarthi ml_print_line(80);
60*77fefa0aSSrikanth Yalavarthi if (mode == RTE_ML_DEV_XSTATS_MODEL)
61*77fefa0aSSrikanth Yalavarthi printf(" Model Statistics: %s\n",
62*77fefa0aSSrikanth Yalavarthi ((struct test_inference *)t)->model[fid].info.name);
63*77fefa0aSSrikanth Yalavarthi else
64*77fefa0aSSrikanth Yalavarthi printf(" Device Statistics\n");
65*77fefa0aSSrikanth Yalavarthi ml_print_line(80);
66*77fefa0aSSrikanth Yalavarthi for (i = 0; i < t->xstats_size; i++)
67*77fefa0aSSrikanth Yalavarthi printf(" %-64s = %" PRIu64 "\n", t->xstats_map[i].name, t->xstats_values[i]);
68*77fefa0aSSrikanth Yalavarthi ml_print_line(80);
69*77fefa0aSSrikanth Yalavarthi
70*77fefa0aSSrikanth Yalavarthi rte_free(t->xstats_map);
71*77fefa0aSSrikanth Yalavarthi rte_free(t->xstats_values);
72*77fefa0aSSrikanth Yalavarthi
73*77fefa0aSSrikanth Yalavarthi return 0;
74*77fefa0aSSrikanth Yalavarthi
75*77fefa0aSSrikanth Yalavarthi error:
76*77fefa0aSSrikanth Yalavarthi rte_free(t->xstats_map);
77*77fefa0aSSrikanth Yalavarthi rte_free(t->xstats_values);
78*77fefa0aSSrikanth Yalavarthi
79*77fefa0aSSrikanth Yalavarthi return ret;
80*77fefa0aSSrikanth Yalavarthi }
81*77fefa0aSSrikanth Yalavarthi
82*77fefa0aSSrikanth Yalavarthi int
ml_throughput_get(struct ml_test * test,struct ml_options * opt)83*77fefa0aSSrikanth Yalavarthi ml_throughput_get(struct ml_test *test, struct ml_options *opt)
84*77fefa0aSSrikanth Yalavarthi {
85*77fefa0aSSrikanth Yalavarthi struct test_inference *t = ml_test_priv(test);
86*77fefa0aSSrikanth Yalavarthi uint64_t total_cycles = 0;
87*77fefa0aSSrikanth Yalavarthi uint32_t nb_filelist;
88*77fefa0aSSrikanth Yalavarthi uint64_t throughput;
89*77fefa0aSSrikanth Yalavarthi uint64_t avg_e2e;
90*77fefa0aSSrikanth Yalavarthi uint32_t qp_id;
91*77fefa0aSSrikanth Yalavarthi uint64_t freq;
92*77fefa0aSSrikanth Yalavarthi
93*77fefa0aSSrikanth Yalavarthi if (!opt->stats)
94*77fefa0aSSrikanth Yalavarthi return 0;
95*77fefa0aSSrikanth Yalavarthi
96*77fefa0aSSrikanth Yalavarthi /* print inference throughput */
97*77fefa0aSSrikanth Yalavarthi if (strcmp(opt->test_name, "inference_ordered") == 0)
98*77fefa0aSSrikanth Yalavarthi nb_filelist = 1;
99*77fefa0aSSrikanth Yalavarthi else
100*77fefa0aSSrikanth Yalavarthi nb_filelist = opt->nb_filelist;
101*77fefa0aSSrikanth Yalavarthi
102*77fefa0aSSrikanth Yalavarthi /* Print model end-to-end latency and throughput */
103*77fefa0aSSrikanth Yalavarthi freq = rte_get_tsc_hz();
104*77fefa0aSSrikanth Yalavarthi for (qp_id = 0; qp_id < RTE_MAX_LCORE; qp_id++)
105*77fefa0aSSrikanth Yalavarthi total_cycles += t->args[qp_id].end_cycles - t->args[qp_id].start_cycles;
106*77fefa0aSSrikanth Yalavarthi
107*77fefa0aSSrikanth Yalavarthi avg_e2e = total_cycles / (opt->repetitions * nb_filelist);
108*77fefa0aSSrikanth Yalavarthi if (freq == 0) {
109*77fefa0aSSrikanth Yalavarthi printf(" %-64s = %" PRIu64 "\n", "Average End-to-End Latency (cycles)", avg_e2e);
110*77fefa0aSSrikanth Yalavarthi } else {
111*77fefa0aSSrikanth Yalavarthi avg_e2e = (avg_e2e * NS_PER_S) / freq;
112*77fefa0aSSrikanth Yalavarthi printf(" %-64s = %" PRIu64 "\n", "Average End-to-End Latency (ns)", avg_e2e);
113*77fefa0aSSrikanth Yalavarthi }
114*77fefa0aSSrikanth Yalavarthi
115*77fefa0aSSrikanth Yalavarthi /* Print model throughput */
116*77fefa0aSSrikanth Yalavarthi if (freq == 0) {
117*77fefa0aSSrikanth Yalavarthi throughput = 1000000 / avg_e2e;
118*77fefa0aSSrikanth Yalavarthi printf(" %-64s = %" PRIu64 "\n", "Average Throughput (inferences / million cycles)",
119*77fefa0aSSrikanth Yalavarthi throughput);
120*77fefa0aSSrikanth Yalavarthi } else {
121*77fefa0aSSrikanth Yalavarthi throughput = freq / avg_e2e;
122*77fefa0aSSrikanth Yalavarthi printf(" %-64s = %" PRIu64 "\n", "Average Throughput (inferences / second)",
123*77fefa0aSSrikanth Yalavarthi throughput);
124*77fefa0aSSrikanth Yalavarthi }
125*77fefa0aSSrikanth Yalavarthi
126*77fefa0aSSrikanth Yalavarthi ml_print_line(80);
127*77fefa0aSSrikanth Yalavarthi
128*77fefa0aSSrikanth Yalavarthi return 0;
129*77fefa0aSSrikanth Yalavarthi }
130