xref: /dpdk/app/test/test_thash_perf.c (revision e0a8442ccd15bafbb7eb150c35331c8e3b828c53)
1239fffe0SVladimir Medvedkin /* SPDX-License-Identifier: BSD-3-Clause
2239fffe0SVladimir Medvedkin  * Copyright(c) 2021 Intel Corporation
3239fffe0SVladimir Medvedkin  */
4239fffe0SVladimir Medvedkin 
5239fffe0SVladimir Medvedkin #include <stdio.h>
6239fffe0SVladimir Medvedkin #include <stdint.h>
7239fffe0SVladimir Medvedkin #include <stdlib.h>
8239fffe0SVladimir Medvedkin #include <math.h>
9239fffe0SVladimir Medvedkin 
10239fffe0SVladimir Medvedkin #include <rte_cycles.h>
11239fffe0SVladimir Medvedkin #include <rte_malloc.h>
12239fffe0SVladimir Medvedkin #include <rte_random.h>
13239fffe0SVladimir Medvedkin #include <rte_thash.h>
14239fffe0SVladimir Medvedkin 
15239fffe0SVladimir Medvedkin #include "test.h"
16239fffe0SVladimir Medvedkin 
17239fffe0SVladimir Medvedkin #define ITERATIONS	(1 << 15)
18239fffe0SVladimir Medvedkin #define BATCH_SZ	(1 << 10)
19239fffe0SVladimir Medvedkin 
20239fffe0SVladimir Medvedkin #define IPV4_2_TUPLE_LEN	(8)
21239fffe0SVladimir Medvedkin #define IPV4_4_TUPLE_LEN	(12)
22239fffe0SVladimir Medvedkin #define IPV6_2_TUPLE_LEN	(32)
23239fffe0SVladimir Medvedkin #define IPV6_4_TUPLE_LEN	(36)
24239fffe0SVladimir Medvedkin 
25239fffe0SVladimir Medvedkin 
26239fffe0SVladimir Medvedkin static const uint8_t default_rss_key[] = {
27239fffe0SVladimir Medvedkin 	0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
28239fffe0SVladimir Medvedkin 	0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
29239fffe0SVladimir Medvedkin 	0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
30239fffe0SVladimir Medvedkin 	0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
31239fffe0SVladimir Medvedkin 	0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa,
32239fffe0SVladimir Medvedkin };
33239fffe0SVladimir Medvedkin 
34239fffe0SVladimir Medvedkin enum test_rss_type {
35239fffe0SVladimir Medvedkin 	TEST_SOFTRSS,
36239fffe0SVladimir Medvedkin 	TEST_SOFTRSS_BE,
37239fffe0SVladimir Medvedkin 	TEST_RSS_GFNI
38239fffe0SVladimir Medvedkin };
39239fffe0SVladimir Medvedkin 
40239fffe0SVladimir Medvedkin static inline uint64_t
run_rss_calc(uint32_t * tuples[BATCH_SZ],enum test_rss_type type,int len,const void * key)41239fffe0SVladimir Medvedkin run_rss_calc(uint32_t *tuples[BATCH_SZ], enum test_rss_type type, int len,
42239fffe0SVladimir Medvedkin 	const void *key)
43239fffe0SVladimir Medvedkin {
44239fffe0SVladimir Medvedkin 	int i, j;
45239fffe0SVladimir Medvedkin 	uint64_t start_tsc, end_tsc;
46239fffe0SVladimir Medvedkin 	volatile uint32_t hash = 0;
47239fffe0SVladimir Medvedkin 
48239fffe0SVladimir Medvedkin 	start_tsc = rte_rdtsc_precise();
49239fffe0SVladimir Medvedkin 	for (i = 0; i < ITERATIONS; i++) {
50239fffe0SVladimir Medvedkin 		for (j = 0; j < BATCH_SZ; j++) {
51239fffe0SVladimir Medvedkin 			if (type == TEST_SOFTRSS)
52239fffe0SVladimir Medvedkin 				hash ^= rte_softrss(tuples[j], len /
53239fffe0SVladimir Medvedkin 					sizeof(uint32_t), (const uint8_t *)key);
54239fffe0SVladimir Medvedkin 			else if (type == TEST_SOFTRSS_BE)
55239fffe0SVladimir Medvedkin 				hash ^= rte_softrss_be(tuples[j], len /
56239fffe0SVladimir Medvedkin 					sizeof(uint32_t), (const uint8_t *)key);
57239fffe0SVladimir Medvedkin 			else
58239fffe0SVladimir Medvedkin 				hash ^= rte_thash_gfni((const uint64_t *)key,
59239fffe0SVladimir Medvedkin 					(uint8_t *)tuples[j], len);
60239fffe0SVladimir Medvedkin 		}
61239fffe0SVladimir Medvedkin 	}
62239fffe0SVladimir Medvedkin 	end_tsc = rte_rdtsc_precise();
63239fffe0SVladimir Medvedkin 
646dfcdf8fSConor Walsh 	/* To avoid compiler warnings set hash to used. */
656dfcdf8fSConor Walsh 	RTE_SET_USED(hash);
666dfcdf8fSConor Walsh 
67239fffe0SVladimir Medvedkin 	return end_tsc - start_tsc;
68239fffe0SVladimir Medvedkin }
69239fffe0SVladimir Medvedkin 
70239fffe0SVladimir Medvedkin static inline uint64_t
run_rss_calc_bulk(uint32_t * tuples[BATCH_SZ],int len,const void * key)71239fffe0SVladimir Medvedkin run_rss_calc_bulk(uint32_t *tuples[BATCH_SZ], int len, const void *key)
72239fffe0SVladimir Medvedkin {
73239fffe0SVladimir Medvedkin 	int i;
74239fffe0SVladimir Medvedkin 	uint64_t start_tsc, end_tsc;
75239fffe0SVladimir Medvedkin 	uint32_t bulk_hash[BATCH_SZ] = { 0 };
76239fffe0SVladimir Medvedkin 
77239fffe0SVladimir Medvedkin 	start_tsc = rte_rdtsc_precise();
78239fffe0SVladimir Medvedkin 	for (i = 0; i < ITERATIONS; i++)
79239fffe0SVladimir Medvedkin 		rte_thash_gfni_bulk((const uint64_t *)key, len,
80239fffe0SVladimir Medvedkin 			(uint8_t **)tuples, bulk_hash, BATCH_SZ);
81239fffe0SVladimir Medvedkin 
82239fffe0SVladimir Medvedkin 	end_tsc = rte_rdtsc_precise();
83239fffe0SVladimir Medvedkin 
84239fffe0SVladimir Medvedkin 	return end_tsc - start_tsc;
85239fffe0SVladimir Medvedkin }
86239fffe0SVladimir Medvedkin 
87239fffe0SVladimir Medvedkin static void
run_thash_test(unsigned int tuple_len)88239fffe0SVladimir Medvedkin run_thash_test(unsigned int tuple_len)
89239fffe0SVladimir Medvedkin {
90239fffe0SVladimir Medvedkin 	uint32_t *tuples[BATCH_SZ];
91239fffe0SVladimir Medvedkin 	unsigned int i, j;
92239fffe0SVladimir Medvedkin 	uint32_t len = RTE_ALIGN_CEIL(tuple_len, sizeof(uint32_t));
93239fffe0SVladimir Medvedkin 	uint64_t tsc_diff;
94239fffe0SVladimir Medvedkin 
95239fffe0SVladimir Medvedkin 	for (i = 0; i < BATCH_SZ; i++) {
96239fffe0SVladimir Medvedkin 		tuples[i] = rte_zmalloc(NULL, len, 0);
97239fffe0SVladimir Medvedkin 		for (j = 0; j < len / sizeof(uint32_t); j++)
98239fffe0SVladimir Medvedkin 			tuples[i][j] = rte_rand();
99239fffe0SVladimir Medvedkin 	}
100239fffe0SVladimir Medvedkin 
101239fffe0SVladimir Medvedkin 	tsc_diff = run_rss_calc(tuples, TEST_SOFTRSS, len, default_rss_key);
102239fffe0SVladimir Medvedkin 	printf("Average rte_softrss() takes \t\t%.1f cycles for key len %d\n",
103239fffe0SVladimir Medvedkin 		(double)(tsc_diff) / (double)(ITERATIONS * BATCH_SZ), len);
104239fffe0SVladimir Medvedkin 
105239fffe0SVladimir Medvedkin 	tsc_diff = run_rss_calc(tuples, TEST_SOFTRSS_BE, len,
106239fffe0SVladimir Medvedkin 		default_rss_key);
107239fffe0SVladimir Medvedkin 	printf("Average rte_softrss_be() takes \t\t%.1f cycles for key len %d\n",
108239fffe0SVladimir Medvedkin 		(double)(tsc_diff) / (double)(ITERATIONS * BATCH_SZ), len);
109239fffe0SVladimir Medvedkin 
110239fffe0SVladimir Medvedkin 	if (!rte_thash_gfni_supported())
111239fffe0SVladimir Medvedkin 		return;
112239fffe0SVladimir Medvedkin 
113239fffe0SVladimir Medvedkin 	uint64_t rss_key_matrixes[RTE_DIM(default_rss_key)];
114239fffe0SVladimir Medvedkin 
115239fffe0SVladimir Medvedkin 	rte_thash_complete_matrix(rss_key_matrixes, default_rss_key,
116239fffe0SVladimir Medvedkin 		RTE_DIM(default_rss_key));
117239fffe0SVladimir Medvedkin 
118239fffe0SVladimir Medvedkin 	tsc_diff = run_rss_calc(tuples, TEST_RSS_GFNI, len, rss_key_matrixes);
119239fffe0SVladimir Medvedkin 	printf("Average rte_thash_gfni takes \t\t%.1f cycles for key len %d\n",
120239fffe0SVladimir Medvedkin 		(double)(tsc_diff) / (double)(ITERATIONS * BATCH_SZ), len);
121239fffe0SVladimir Medvedkin 
122239fffe0SVladimir Medvedkin 	tsc_diff = run_rss_calc_bulk(tuples, len, rss_key_matrixes);
123239fffe0SVladimir Medvedkin 	printf("Average rte_thash_gfni_bulk takes \t%.1f cycles for key len %d\n",
124239fffe0SVladimir Medvedkin 		(double)(tsc_diff) / (double)(ITERATIONS * BATCH_SZ), len);
125239fffe0SVladimir Medvedkin }
126239fffe0SVladimir Medvedkin 
127239fffe0SVladimir Medvedkin static int
test_thash_perf(void)128239fffe0SVladimir Medvedkin test_thash_perf(void)
129239fffe0SVladimir Medvedkin {
130239fffe0SVladimir Medvedkin 	run_thash_test(IPV4_2_TUPLE_LEN);
131239fffe0SVladimir Medvedkin 	run_thash_test(IPV4_4_TUPLE_LEN);
132239fffe0SVladimir Medvedkin 	run_thash_test(IPV6_2_TUPLE_LEN);
133239fffe0SVladimir Medvedkin 	run_thash_test(IPV6_4_TUPLE_LEN);
134239fffe0SVladimir Medvedkin 
135239fffe0SVladimir Medvedkin 	return 0;
136239fffe0SVladimir Medvedkin }
137239fffe0SVladimir Medvedkin 
138*e0a8442cSBruce Richardson REGISTER_PERF_TEST(thash_perf_autotest, test_thash_perf);
139