27 std::string success = std::get<0>(
res) ==
true ?
"PASSED" :
"FAILED";
28 printf(
"Test %d %s - Arch: %9.2f µs, Host: %9.2f µs\n", test_id, success.c_str(), std::get<1>(
res), std::get<2>(
res));
39typename std::enable_if<I == 0, std::tuple<bool, double, double>>::type
test(){
42 constexpr uint n_redu = 6;
44 volatile uint size = 1e8;
49 uint sum_arch[n_redu] = {};
50 uint sum_host[n_redu] = {};
53 clock_t arch_start = clock();
56 for(uint n = 0; n < n_redu; ++n)
59 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
62 clock_t host_start = clock();
63 for (uint
i = 0;
i < ni; ++
i)
64 for(uint n = 0; n < n_redu; ++n)
65 sum_host[n] += (n + 1);
66 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
69 std::vector<uint> v_arch(sum_arch, sum_arch + n_redu);
70 std::vector<uint> v_host(sum_host, sum_host + n_redu);
71 bool success = (v_arch == v_host) ?
true :
false;
74 return std::make_tuple(success, arch_time, host_time);
78typename std::enable_if<I == 1, std::tuple<bool, double, double>>::type
test(){
80 constexpr uint n_redu = 5;
81 volatile uint size = 1e6;
82 const uint ni = size, nj = size;
83 uint sum_arch[n_redu] = {1, 3, 5, 7, 9};
84 uint sum_host[n_redu] = {1, 3, 5, 7, 9};
86 clock_t arch_start = clock();
89 for(uint n = 0; n < n_redu; ++n)
92 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
94 clock_t host_start = clock();
95 for (uint
j = 0;
j < nj; ++
j)
96 for (uint
i = 0;
i < ni; ++
i)
97 for(uint n = 0; n < n_redu; ++n)
98 sum_host[n] += (n + 1);
99 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
101 std::vector<uint> v_arch(sum_arch, sum_arch + n_redu);
102 std::vector<uint> v_host(sum_host, sum_host + n_redu);
103 bool success = (v_arch == v_host) ?
true :
false;
105 return std::make_tuple(success, arch_time, host_time);
109typename std::enable_if<I == 2, std::tuple<bool, double, double>>::type
test(){
111 constexpr uint n_redu = 5;
112 volatile uint size = 1e6;
113 const uint ni = size, nj = size;
114 uint sum_arch[n_redu] = {11, 22, 33, 44, 55};
115 uint sum_host[n_redu] = {11, 22, 33, 44, 55};
117 clock_t arch_start = clock();
122 for(uint n = 0; n < n_redu; ++n)
123 lsum[n] += (n + val);
126 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
128 clock_t host_start = clock();
129 for (uint
j = 0;
j < nj; ++
j){
131 for (uint
i = 0;
i < ni; ++
i)
132 for(uint n = 0; n < n_redu; ++n)
133 sum_host[n] += (n + val);
135 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
137 std::vector<uint> v_arch(sum_arch, sum_arch + n_redu);
138 std::vector<uint> v_host(sum_host, sum_host + n_redu);
139 bool success = (v_arch == v_host) ?
true :
false;
141 return std::make_tuple(success, arch_time, host_time);
145typename std::enable_if<I == 3, std::tuple<bool, double, double>>::type
test(){
147 constexpr uint n_redu = 4;
148 volatile uint size = 5 * 1e3;
149 const uint ni = size, nj = size, nk = size;
150 std::vector<uint> sum_arch(n_redu, 0.0);
151 std::vector<uint> sum_host(n_redu, 0.0);
153 clock_t arch_start = clock();
156 for(uint n = 0; n < n_redu; ++n)
159 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
161 clock_t host_start = clock();
162 for (uint
k = 0;
k < nk; ++
k)
163 for (uint
j = 0;
j < nj; ++
j)
164 for (uint
i = 0;
i < ni; ++
i)
165 for(uint n = 0; n < n_redu; ++n)
166 sum_host[n] += (n + 1);
167 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
169 bool success = (sum_arch == sum_host) ?
true :
false;
171 return std::make_tuple(success, arch_time, host_time);
175typename std::enable_if<I == 4, std::tuple<bool, double, double>>::type
test(){
177 constexpr uint n_redu = 4;
178 volatile uint size = 5 * 1e3;
179 const uint ni = size, nj = size, nk = size;
180 std::vector<uint> sum_arch(n_redu, 0.0);
181 std::vector<uint> sum_host(n_redu, 0.0);
183 clock_t arch_start = clock();
188 for(uint n = 0; n < n_redu; ++n)
189 lsum[n] += (n + val);
192 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
194 clock_t host_start = clock();
195 for (uint
k = 0;
k < nk; ++
k){
197 for (uint
j = 0;
j < nj; ++
j)
198 for (uint
i = 0;
i < ni; ++
i)
199 for(uint n = 0; n < n_redu; ++n)
200 sum_host[n] += (n + val);
202 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
204 bool success = (sum_arch == sum_host) ?
true :
false;
206 return std::make_tuple(success, arch_time, host_time);
210typename std::enable_if<I == 5, std::tuple<bool, double, double>>::type
test(){
212 constexpr uint n_redu = 3;
213 volatile uint size = 1e3;
214 const uint ni = size, nj = size, nk = size, nl = size;
215 uint sum_arch[n_redu] = {};
216 uint sum_host[n_redu] = {};
218 clock_t arch_start = clock();
221 for(uint n = 0; n < n_redu; ++n)
224 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
226 clock_t host_start = clock();
227 for (uint l = 0; l < nl; ++l)
228 for (uint
k = 0;
k < nk; ++
k)
229 for (uint
j = 0;
j < nj; ++
j)
230 for (uint
i = 0;
i < ni; ++
i)
231 for(uint n = 0; n < n_redu; ++n)
232 sum_host[n] += (n + 1);
233 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
235 std::vector<uint> v_arch(sum_arch, sum_arch + n_redu);
236 std::vector<uint> v_host(sum_host, sum_host + n_redu);
237 bool success = (v_arch == v_host) ?
true :
false;
239 return std::make_tuple(success, arch_time, host_time);
243typename std::enable_if<I == 6, std::tuple<bool, double, double>>::type
test(){
245 constexpr uint n_redu = 3;
246 volatile uint size = 1e3;
247 const uint ni = size, nj = size, nk = size, nl = size;
248 uint sum_arch[n_redu] = {};
249 uint sum_host[n_redu] = {};
251 clock_t arch_start = clock();
256 for(uint n = 0; n < n_redu; ++n)
257 lsum[n] += (n + val);
260 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
262 clock_t host_start = clock();
263 for (uint l = 0; l < nl; ++l){
265 for (uint
k = 0;
k < nk; ++
k)
266 for (uint
j = 0;
j < nj; ++
j)
267 for (uint
i = 0;
i < ni; ++
i)
268 for(uint n = 0; n < n_redu; ++n)
269 sum_host[n] += (n + val);
271 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
273 std::vector<uint> v_arch(sum_arch, sum_arch + n_redu);
274 std::vector<uint> v_host(sum_host, sum_host + n_redu);
275 bool success = (v_arch == v_host) ?
true :
false;
277 return std::make_tuple(success, arch_time, host_time);
281typename std::enable_if<I == 7, std::tuple<bool, double, double>>::type
test(){
283 volatile uint size = 1e8;
284 const uint ni = size;
285 uint max_arch = std::numeric_limits<uint>::min();
286 uint max_host = std::numeric_limits<uint>::min();
289 for(uint n = 0; n < size; ++n)
292 clock_t arch_start = clock();
295 *lmax =
max(data[
i], *lmax);
297 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
299 clock_t host_start = clock();
300 for (uint
i = 0;
i < ni; ++
i)
301 max_host =
max(data[
i], max_host);
302 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
305 std::vector<uint> v_arch(&max_arch, &max_arch + 1);
306 std::vector<uint> v_host(&max_host, &max_host + 1);
307 bool success = (v_arch == v_host) ?
true :
false;
309 return std::make_tuple(success, arch_time, host_time);
313typename std::enable_if<I == 8, std::tuple<bool, double, double>>::type
test(){
315 volatile uint size = 1e4;
316 const uint ni = size, nj = size;
317 int min_arch = std::numeric_limits<int>::max();
318 int min_host = std::numeric_limits<int>::max();
321 for(uint n = 0; n < size * size; ++n)
324 clock_t arch_start = clock();
327 const uint idx = ni *
j;
329 *lmin =
min(data[idx +
i], *lmin);
332 double arch_time = (double)((clock() - arch_start) * 1e6 / CLOCKS_PER_SEC);
334 clock_t host_start = clock();
335 for (uint
j = 0;
j < nj; ++
j){
336 const uint idx = ni *
j;
337 for (uint
i = 0;
i < ni; ++
i)
338 min_host =
min(data[idx +
i], min_host);
340 double host_time = (double)((clock() - host_start) * 1e6 / CLOCKS_PER_SEC);
343 std::vector<int> v_arch(&min_arch, &min_arch + 1);
344 std::vector<int> v_host(&min_host, &min_host + 1);
345 bool success = (v_arch == v_host) ?
true :
false;
347 return std::make_tuple(success, arch_time, host_time);