-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathreadingtests.cpp
88 lines (80 loc) · 2.1 KB
/
readingtests.cpp
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
#include "common.h"
int *a, *b, *c; // read from arrays
int sa, sb, sc;
const int ELEMENT_COUNT = 1 * 1024 * 1024;
void SetupValues() {
// fill with data
pcg32_random_t rng;
pcg32_srandom_r(&rng, 1234, 5678);
sa = sb = sc = 0;
for( int i = 0; i < ELEMENT_COUNT; ++i ) {
sa += a[i] = pcg32_random_r_range(&rng, 0, 255 );
sb += b[i] = pcg32_random_r_range(&rng, 0, 65535 );
sc += c[i] = pcg32_random_r_range(&rng, 0, 100 );
}
}
void Setup() {
Timer t;
// allocate arrays
a = (int*)aligned_alloc( 64, sizeof(int) * ELEMENT_COUNT );
b = (int*)aligned_alloc( 64, sizeof(int) * ELEMENT_COUNT );
c = (int*)aligned_alloc( 64, sizeof(int) * ELEMENT_COUNT );
SetupValues();
printf( "Setup took %fms\n", t.elapsed() );
}
bool SumReadingLinear( int *array, int expected_sum ) {
int sum = 0;
for( int i = 0; i < ELEMENT_COUNT; ++i ) {
sum += array[i];
}
return sum == expected_sum;
}
bool SumReadingBackwards( int *array, int expected_sum ) {
int sum = 0;
for( int i = ELEMENT_COUNT-1; i >= 0; --i ) {
sum += array[i];
}
return sum == expected_sum;
}
bool SumReadStriding( int *array, int expected_sum ) {
int sum = 0;
const int STRIDE = 16;
for( int j = 0; j < STRIDE; ++j ) {
for( int i = 0; i < ELEMENT_COUNT; i+=STRIDE ) {
sum += array[i];
}
}
return sum == expected_sum;
}
volatile int output_buffer;
void TestReadingBackwards( ) {
int success = 0;
success += SumReadingBackwards( a, sa );
success += SumReadingBackwards( b, sb );
success += SumReadingBackwards( c, sc );
output_buffer += success;
}
void TestReadingLinear() {
int success = 0;
success += SumReadingLinear( a, sa );
success += SumReadingLinear( b, sb );
success += SumReadingLinear( c, sc );
output_buffer += success;
}
void TestReadStriding() {
int success = 0;
success += SumReadStriding( a, sa );
success += SumReadStriding( b, sb );
success += SumReadStriding( c, sc );
output_buffer += success;
}
int main() {
Setup();
Test tests[] = {
(Test){ TestReadingBackwards, "Read Backwards" },
(Test){ TestReadingLinear, "Read Linear" },
(Test){ TestReadStriding, "Read Striding" },
};
RunTests( tests );
return 0;
}