1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
//**************************************************************************
// Median filter bencmark
//--------------------------------------------------------------------------
//
// This benchmark performs a 1D three element median filter. The
// input data (and reference data) should be generated using the
// median_gendata.pl perl script and dumped to a file named
// dataset1.h You should not change anything except the
// HOST_DEBUG and PREALLOCATE macros for your timing run.
#include "median.h"
int ncores = 1;
#include "util.h"
//--------------------------------------------------------------------------
// Macros
// Set HOST_DEBUG to 1 if you are going to compile this for a host
// machine (ie Athena/Linux) for debug purposes and set HOST_DEBUG
// to 0 if you are compiling with the smips-gcc toolchain.
#ifndef HOST_DEBUG
#define HOST_DEBUG 0
#endif
// Set PREALLOCATE to 1 if you want to preallocate the benchmark
// function before starting stats. If you have instruction/data
// caches and you don't want to count the overhead of misses, then
// you will need to use preallocation.
#ifndef PREALLOCATE
#define PREALLOCATE 0
#endif
// Set SET_STATS to 1 if you want to carve out the piece that actually
// does the computation.
#ifndef SET_STATS
#define SET_STATS 0
#endif
//--------------------------------------------------------------------------
// Input/Reference Data
#include "dataset1.h"
//--------------------------------------------------------------------------
// Helper functions
int verify( int n, int test[], int correct[] )
{
int i;
for ( i = 0; i < n; i++ ) {
if ( test[i] != correct[i] ) {
return 2;
}
}
return 1;
}
#if HOST_DEBUG
void printArray( char name[], int n, int arr[] )
{
int i;
printf( " %10s :", name );
for ( i = 0; i < n; i++ )
printf( " %3d ", arr[i] );
printf( "\n" );
}
#endif
void setStats( int enable )
{
#if ( !HOST_DEBUG && SET_STATS )
asm( "mtpcr %0, cr10" : : "r" (enable) );
#endif
}
//--------------------------------------------------------------------------
// Main
int main( int argc, char* argv[] )
{
int results_data[DATA_SIZE];
// Output the input array
#if HOST_DEBUG
printArray( "input", DATA_SIZE, input_data );
printArray( "verify", DATA_SIZE, verify_data );
#endif
// If needed we preallocate everything in the caches
#if ( !HOST_DEBUG && PREALLOCATE )
median( DATA_SIZE, input_data, results_data );
#endif
// Do the filter
#if HOST_DEBUG
median( DATA_SIZE, input_data, results_data );
#else
setStats(1);
median( DATA_SIZE, input_data, results_data );
setStats(0);
#endif
// Print out the results
#if HOST_DEBUG
printArray( "results", DATA_SIZE, results_data );
#endif
// Check the results
finishTest(verify( DATA_SIZE, results_data, verify_data ));
}
|