@@ -328,10 +328,11 @@ void check_solution(const size_t num_times, T const* a, T const* b, T const* c,
328328 abort ();
329329 }
330330
331- // Error relative tolerance check
331+ // Error relative tolerance check - a higher tolerance is used for reductions.
332332 size_t failed = 0 ;
333- T max_rel = std::numeric_limits<T>::epsilon () * T (1000000.0 );
334- auto check = [&](const char * name, T is, T should, size_t i = size_t (-1 )) {
333+ T max_rel = std::numeric_limits<T>::epsilon () * T (100.0 );
334+ T max_rel_dot = std::numeric_limits<T>::epsilon () * T (10000000.0 );
335+ auto check = [&](const char * name, T is, T should, T max_rel, size_t i = size_t (-1 )) {
335336 // Relative difference:
336337 T diff = std::abs (is - should);
337338 T abs_is = std::abs (is);
@@ -353,15 +354,15 @@ void check_solution(const size_t num_times, T const* a, T const* b, T const* c,
353354 for (size_t i = 0 ; i < num_benchmarks; ++i) {
354355 if (bench[i].id != BenchId::Dot) continue ;
355356 if (run_benchmark (bench[i]))
356- check (" sum" , sum, goldS);
357+ check (" sum" , sum, goldS, max_rel_dot );
357358 break ;
358359 }
359360
360361 // Calculate the L^infty-norm relative error
361362 for (size_t i = 0 ; i < array_size; ++i) {
362- check (" a" , a[i], goldA, i);
363- check (" b" , b[i], goldB, i);
364- check (" c" , c[i], goldC, i);
363+ check (" a" , a[i], goldA, i, max_rel );
364+ check (" b" , b[i], goldB, i, max_rel );
365+ check (" c" , c[i], goldC, i, max_rel );
365366 }
366367
367368 if (failed > 0 && !silence_errors)
0 commit comments