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