xref: /dpdk/app/test-mldev/test_stats.c (revision 77fefa0a129e661caf0f3628f48204ed3886ab5f)
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