13f002f06SMattias Rönnblom /* SPDX-License-Identifier: BSD-3-Clause 23f002f06SMattias Rönnblom * Copyright(c) 2019 Ericsson AB 33f002f06SMattias Rönnblom */ 43f002f06SMattias Rönnblom 53f002f06SMattias Rönnblom #include <inttypes.h> 63f002f06SMattias Rönnblom #include <stdio.h> 73f002f06SMattias Rönnblom 83f002f06SMattias Rönnblom #include <rte_common.h> 93f002f06SMattias Rönnblom #include <rte_cycles.h> 103f002f06SMattias Rönnblom #include <rte_random.h> 113f002f06SMattias Rönnblom 123f002f06SMattias Rönnblom #include "test.h" 133f002f06SMattias Rönnblom 143f002f06SMattias Rönnblom static volatile uint64_t vsum; 153f002f06SMattias Rönnblom 163f002f06SMattias Rönnblom #define ITERATIONS (100000000) 173f002f06SMattias Rönnblom 185f4ed3f0SMattias Rönnblom #define BEST_CASE_BOUND (1<<16) 195f4ed3f0SMattias Rönnblom #define WORST_CASE_BOUND (BEST_CASE_BOUND + 1) 205f4ed3f0SMattias Rönnblom 213f002f06SMattias Rönnblom enum rand_type { 225f4ed3f0SMattias Rönnblom rand_type_64, 230cd10724SStephen Hemminger rand_type_float, 245f4ed3f0SMattias Rönnblom rand_type_bounded_best_case, 255f4ed3f0SMattias Rönnblom rand_type_bounded_worst_case 263f002f06SMattias Rönnblom }; 273f002f06SMattias Rönnblom 283f002f06SMattias Rönnblom static const char * rand_type_desc(enum rand_type rand_type)293f002f06SMattias Rönnblomrand_type_desc(enum rand_type rand_type) 303f002f06SMattias Rönnblom { 313f002f06SMattias Rönnblom switch (rand_type) { 323f002f06SMattias Rönnblom case rand_type_64: 333f002f06SMattias Rönnblom return "Full 64-bit [rte_rand()]"; 340cd10724SStephen Hemminger case rand_type_float: 350cd10724SStephen Hemminger return "Floating point [rte_drand()]"; 365f4ed3f0SMattias Rönnblom case rand_type_bounded_best_case: 375f4ed3f0SMattias Rönnblom return "Bounded average best-case [rte_rand_max()]"; 385f4ed3f0SMattias Rönnblom case rand_type_bounded_worst_case: 395f4ed3f0SMattias Rönnblom return "Bounded average worst-case [rte_rand_max()]"; 403f002f06SMattias Rönnblom default: 413f002f06SMattias Rönnblom return NULL; 423f002f06SMattias Rönnblom } 433f002f06SMattias Rönnblom } 443f002f06SMattias Rönnblom 453f002f06SMattias Rönnblom static __rte_always_inline void test_rand_perf_type(enum rand_type rand_type)463f002f06SMattias Rönnblomtest_rand_perf_type(enum rand_type rand_type) 473f002f06SMattias Rönnblom { 483f002f06SMattias Rönnblom uint64_t start; 493f002f06SMattias Rönnblom uint32_t i; 503f002f06SMattias Rönnblom uint64_t end; 513f002f06SMattias Rönnblom uint64_t sum = 0; 523f002f06SMattias Rönnblom uint64_t op_latency; 533f002f06SMattias Rönnblom 543f002f06SMattias Rönnblom start = rte_rdtsc(); 553f002f06SMattias Rönnblom 563f002f06SMattias Rönnblom for (i = 0; i < ITERATIONS; i++) { 573f002f06SMattias Rönnblom switch (rand_type) { 583f002f06SMattias Rönnblom case rand_type_64: 593f002f06SMattias Rönnblom sum += rte_rand(); 603f002f06SMattias Rönnblom break; 610cd10724SStephen Hemminger case rand_type_float: 620cd10724SStephen Hemminger sum += 1000. * rte_drand(); 630cd10724SStephen Hemminger break; 645f4ed3f0SMattias Rönnblom case rand_type_bounded_best_case: 655f4ed3f0SMattias Rönnblom sum += rte_rand_max(BEST_CASE_BOUND); 665f4ed3f0SMattias Rönnblom break; 675f4ed3f0SMattias Rönnblom case rand_type_bounded_worst_case: 685f4ed3f0SMattias Rönnblom sum += rte_rand_max(WORST_CASE_BOUND); 695f4ed3f0SMattias Rönnblom break; 703f002f06SMattias Rönnblom } 713f002f06SMattias Rönnblom } 723f002f06SMattias Rönnblom 733f002f06SMattias Rönnblom end = rte_rdtsc(); 743f002f06SMattias Rönnblom 753f002f06SMattias Rönnblom /* to avoid an optimizing compiler removing the whole loop */ 763f002f06SMattias Rönnblom vsum = sum; 773f002f06SMattias Rönnblom 783f002f06SMattias Rönnblom op_latency = (end - start) / ITERATIONS; 793f002f06SMattias Rönnblom 803f002f06SMattias Rönnblom printf("%s: %"PRId64" TSC cycles/op\n", rand_type_desc(rand_type), 813f002f06SMattias Rönnblom op_latency); 823f002f06SMattias Rönnblom } 833f002f06SMattias Rönnblom 843f002f06SMattias Rönnblom static int test_rand_perf(void)853f002f06SMattias Rönnblomtest_rand_perf(void) 863f002f06SMattias Rönnblom { 873f002f06SMattias Rönnblom rte_srand(42); 883f002f06SMattias Rönnblom 893f002f06SMattias Rönnblom printf("Pseudo-random number generation latencies:\n"); 903f002f06SMattias Rönnblom 913f002f06SMattias Rönnblom test_rand_perf_type(rand_type_64); 920cd10724SStephen Hemminger test_rand_perf_type(rand_type_float); 935f4ed3f0SMattias Rönnblom test_rand_perf_type(rand_type_bounded_best_case); 945f4ed3f0SMattias Rönnblom test_rand_perf_type(rand_type_bounded_worst_case); 953f002f06SMattias Rönnblom 963f002f06SMattias Rönnblom return 0; 973f002f06SMattias Rönnblom } 983f002f06SMattias Rönnblom 99*e0a8442cSBruce Richardson REGISTER_PERF_TEST(rand_perf_autotest, test_rand_perf); 100