a4df38d718fad24dd35338bc34f103b7bb29a39a
[riscv-tests.git] / benchmarks / sort / sort_main.c
1 // ****************************************************************************
2 // sort benchmark from DARPA PERFECT TAV suite
3 // ----------------------------------------------------------------------------
4 #include "sort.h"
5 #include "util.h"
6 #include "dataset.h"
7
8 #define USE_RADIX_SORT
9
10 // Need 7 times the input size for: input data, indices,
11 // four copies, and buckets.
12 FAKE_MALLOC_INIT( (8 * DATA_SIZE_SORT), radix )
13
14 int main( int argc, char* argv[] )
15 {
16 int err;
17
18 int* index = fake_malloc_radix (sizeof(int) * DATA_SIZE_SORT);
19 for ( int i = 0; i < DATA_SIZE_SORT; i++ )
20 index[i] = i;
21
22 #ifdef PREALLOCATE
23 // Access every element of input_data_sort to make sure it's in cache
24 // (or at least that as much as possible of its beginning is).
25 float sum = 0;
26 for(int i = DATA_SIZE_SORT-1; i >= 0; i--) {
27 sum += input_data_sort[i];
28 }
29 if(sum < 0.1)
30 return 1;
31
32 const bool prealloc = true;
33 #else
34 const bool prealloc = false;
35 #endif
36
37 setStats(1);
38
39 #define read_csr_safe(reg) ({ long __tmp = 0; \
40 asm volatile ("csrr %0, " #reg : "+r"(__tmp)); \
41 __tmp; })
42
43
44 long cycles = read_csr_safe(cycle);
45 long instret = read_csr_safe(instret);
46
47 // Do sorting
48 #if defined(USE_N_SQUARED_SORT)
49 const char* algo = "N_SQUARED";
50 err = n_squared_sort ( input_data_sort, index, DATA_SIZE_SORT );
51 #elif defined(USE_RADIX_SORT)
52 const char* algo = "RADIX";
53 err = radix_sort_tuples ( (int *) input_data_sort, index, DATA_SIZE_SORT, RADIX_BITS );
54 #elif defined(USE_INSERTION_SORT)
55 const char* algo = "INSERTION";
56 err = insertion_sort ( input_data_sort, index, DATA_SIZE_SORT );
57 #else
58 const char* algo = "QUICKSORT";
59 err = quicksort ( input_data_sort, index, DATA_SIZE_SORT );
60 #endif
61
62 cycles = read_csr_safe(cycle) - cycles;
63 instret = read_csr_safe(instret) - instret;
64
65 setStats(0);
66
67 // Validate result
68 err = 0;
69 for(int i = 0; i < DATA_SIZE_SORT-1; i++)
70 {
71 if((unsigned int) input_data_sort[i] > (unsigned int) input_data_sort[i+1])
72 {
73 err = i;
74 for(int j = 0; j < DATA_SIZE_SORT; j++)
75 printf("%d:\t%d\n", j, input_data_sort[j]);
76 break;
77 }
78 }
79
80 /*printf("sort_cycles = %ld\n", cycles);
81 printf("sort_instret = %d\n", instret);
82 printf("sort_size = %d\n", DATA_SIZE_SORT);
83 printf("sort_algo = %s\n", algo);
84 printf("sort_radix_bits = %d\n", RADIX_BITS);
85 printf("sort_prealloc = %s\n", prealloc ? "true" : "false");
86 printf("sort_err = %d\n", err);
87 */
88
89 return err;
90 }
91
92
93