1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause 2*4418919fSjohnjiang * Copyright(c) 2019 Ericsson AB 3*4418919fSjohnjiang */ 4*4418919fSjohnjiang 5*4418919fSjohnjiang #include <inttypes.h> 6*4418919fSjohnjiang #include <stdio.h> 7*4418919fSjohnjiang 8*4418919fSjohnjiang #include <rte_common.h> 9*4418919fSjohnjiang #include <rte_cycles.h> 10*4418919fSjohnjiang #include <rte_random.h> 11*4418919fSjohnjiang 12*4418919fSjohnjiang #include "test.h" 13*4418919fSjohnjiang 14*4418919fSjohnjiang static volatile uint64_t vsum; 15*4418919fSjohnjiang 16*4418919fSjohnjiang #define ITERATIONS (100000000) 17*4418919fSjohnjiang 18*4418919fSjohnjiang #define BEST_CASE_BOUND (1<<16) 19*4418919fSjohnjiang #define WORST_CASE_BOUND (BEST_CASE_BOUND + 1) 20*4418919fSjohnjiang 21*4418919fSjohnjiang enum rand_type { 22*4418919fSjohnjiang rand_type_64, 23*4418919fSjohnjiang rand_type_bounded_best_case, 24*4418919fSjohnjiang rand_type_bounded_worst_case 25*4418919fSjohnjiang }; 26*4418919fSjohnjiang 27*4418919fSjohnjiang static const char * rand_type_desc(enum rand_type rand_type)28*4418919fSjohnjiangrand_type_desc(enum rand_type rand_type) 29*4418919fSjohnjiang { 30*4418919fSjohnjiang switch (rand_type) { 31*4418919fSjohnjiang case rand_type_64: 32*4418919fSjohnjiang return "Full 64-bit [rte_rand()]"; 33*4418919fSjohnjiang case rand_type_bounded_best_case: 34*4418919fSjohnjiang return "Bounded average best-case [rte_rand_max()]"; 35*4418919fSjohnjiang case rand_type_bounded_worst_case: 36*4418919fSjohnjiang return "Bounded average worst-case [rte_rand_max()]"; 37*4418919fSjohnjiang default: 38*4418919fSjohnjiang return NULL; 39*4418919fSjohnjiang } 40*4418919fSjohnjiang } 41*4418919fSjohnjiang 42*4418919fSjohnjiang static __rte_always_inline void test_rand_perf_type(enum rand_type rand_type)43*4418919fSjohnjiangtest_rand_perf_type(enum rand_type rand_type) 44*4418919fSjohnjiang { 45*4418919fSjohnjiang uint64_t start; 46*4418919fSjohnjiang uint32_t i; 47*4418919fSjohnjiang uint64_t end; 48*4418919fSjohnjiang uint64_t sum = 0; 49*4418919fSjohnjiang uint64_t op_latency; 50*4418919fSjohnjiang 51*4418919fSjohnjiang start = rte_rdtsc(); 52*4418919fSjohnjiang 53*4418919fSjohnjiang for (i = 0; i < ITERATIONS; i++) { 54*4418919fSjohnjiang switch (rand_type) { 55*4418919fSjohnjiang case rand_type_64: 56*4418919fSjohnjiang sum += rte_rand(); 57*4418919fSjohnjiang break; 58*4418919fSjohnjiang case rand_type_bounded_best_case: 59*4418919fSjohnjiang sum += rte_rand_max(BEST_CASE_BOUND); 60*4418919fSjohnjiang break; 61*4418919fSjohnjiang case rand_type_bounded_worst_case: 62*4418919fSjohnjiang sum += rte_rand_max(WORST_CASE_BOUND); 63*4418919fSjohnjiang break; 64*4418919fSjohnjiang } 65*4418919fSjohnjiang } 66*4418919fSjohnjiang 67*4418919fSjohnjiang end = rte_rdtsc(); 68*4418919fSjohnjiang 69*4418919fSjohnjiang /* to avoid an optimizing compiler removing the whole loop */ 70*4418919fSjohnjiang vsum = sum; 71*4418919fSjohnjiang 72*4418919fSjohnjiang op_latency = (end - start) / ITERATIONS; 73*4418919fSjohnjiang 74*4418919fSjohnjiang printf("%s: %"PRId64" TSC cycles/op\n", rand_type_desc(rand_type), 75*4418919fSjohnjiang op_latency); 76*4418919fSjohnjiang } 77*4418919fSjohnjiang 78*4418919fSjohnjiang static int test_rand_perf(void)79*4418919fSjohnjiangtest_rand_perf(void) 80*4418919fSjohnjiang { 81*4418919fSjohnjiang rte_srand(42); 82*4418919fSjohnjiang 83*4418919fSjohnjiang printf("Pseudo-random number generation latencies:\n"); 84*4418919fSjohnjiang 85*4418919fSjohnjiang test_rand_perf_type(rand_type_64); 86*4418919fSjohnjiang test_rand_perf_type(rand_type_bounded_best_case); 87*4418919fSjohnjiang test_rand_perf_type(rand_type_bounded_worst_case); 88*4418919fSjohnjiang 89*4418919fSjohnjiang return 0; 90*4418919fSjohnjiang } 91*4418919fSjohnjiang 92*4418919fSjohnjiang REGISTER_TEST_COMMAND(rand_perf_autotest, test_rand_perf); 93