xref: /dpdk/app/test/test_rand_perf.c (revision e0a8442ccd15bafbb7eb150c35331c8e3b828c53)
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önnblom rand_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önnblom test_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önnblom test_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