20 {
21
27
29 int l1_size,l2_size,l1_linesize,l2_linesize,l2_entries;
30 int arraysize;
32
33 double error;
35 double aSumm = 0.0;
36
38
40 printf("Testing the PAPI_L2_DCR event\n");
41 }
42
43
47 }
48
52 }
53
57 }
58
64
66 printf("\tDetected %dk L1 DCache, %dB linesize\n",
67 l1_size/1024,l1_linesize);
68 printf("\tDetected %dk L2 DCache, %dB linesize, %d entries\n",
69 l2_size/1024,l2_linesize,l2_entries);
70 }
71
72 arraysize=l2_size/sizeof(double);
73
75 printf("\tAllocating %zu bytes of memory (%d doubles)\n",
76 arraysize*sizeof(double),arraysize);
77 }
78
79 array=calloc(arraysize,
sizeof(
double));
81 test_fail(__FILE__,__LINE__,
"Can't allocate memory",0);
82 }
83
84
85
86
87
89 printf("\nWrite Test: Initializing an array of %d doubles:\n",
90 arraysize);
91 }
92
93 high=0; low=0;
total=0;
94
95 for(
i=0;
i<num_runs;
i++) {
96
99
101
103
106 "reading PAPI_L2_DCR",
retval );
107 }
108
112 }
113
114 average=(
total/num_runs);
115
116 expected=(arraysize/(l1_linesize/
sizeof(double)))/10;
117
119 printf("\tShould be low, as we only measure reads:\n\n");
120 }
121
123 printf("\tMeasured average of: %lld\n",average);
124 }
125
127 if (!
quiet) printf(
"Instruction count bigger than expected\n");
128 errors++;
129 }
130
131 if (!
quiet) printf(
"\n");
132
133
134
135
136
138 printf("\nRead Test: Summing an array of %d doubles:\n",
139 arraysize);
140 }
141
142 high=0; low=0;
total=0;
143
144 for(
i=0;
i<num_runs;
i++) {
145
148
150
152
155 "reading PAPI_L2_DCR",
retval );
156 }
157
161 }
162
163 average=(
total/num_runs);
164
165 expected=arraysize/(l1_linesize/
sizeof(double));
166
168 printf("\tShould be roughly "
169 "arraysize/L1_linesize/double_size (%d/%d/%zu): "
170 "%lld\n\n",
171 arraysize,l1_linesize,sizeof(double),
173 }
174
176
177 if ((error > 1.0) || (error<-1.0)) {
178 if (!
quiet) printf(
"Instruction count off by more than 1%%\n");
179 errors++;
180 }
181
183 printf("\n");
184 }
185
186
187 if (errors) {
188 test_warn( __FILE__, __LINE__,
"Error too high", 1 );
189 }
190
192
193 return 0;
194}
long long get_cachesize(int type)
long long get_linesize(int type)
long long get_entries(int type)
int cache_write_test(double *array, int size)
double cache_read_test(double *array, int size)
add PAPI preset or native hardware event by name to an EventSet
Create a new empty PAPI EventSet.
initialize the PAPI library.
Reset the hardware event counts in an event set.
Start counting hardware events in an event set.
Stop counting hardware events in an event set.
static int expected[NUM_THREADS]
double display_error(long long average, long long high, long long low, long long expected, int quiet)
static double array[ARRAYSIZE]
int tests_quiet(int argc, char **argv)
void PAPI_NORETURN test_fail(const char *file, int line, const char *call, int retval)
void PAPI_NORETURN test_pass(const char *filename)
void test_warn(const char *file, int line, const char *call, int retval)
void PAPI_NORETURN test_skip(const char *file, int line, const char *call, int retval)