summaryrefslogtreecommitdiff
path: root/test/correctness
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2016-04-27 14:38:30 +0200
committerCedric Nugteren <web@cedricnugteren.nl>2016-04-27 14:38:30 +0200
commit226e834d0a6569f8142ab0cde14e6e273486a277 (patch)
tree58a94fe874a928d66b8972724c531d802991cf11 /test/correctness
parent3555cd043654ec24ff325bd6205281af790e50d2 (diff)
Added a '-verbose' option to the test binaries to report errors in more detail if needed
Diffstat (limited to 'test/correctness')
-rw-r--r--test/correctness/testblas.cc9
-rw-r--r--test/correctness/testblas.h1
-rw-r--r--test/correctness/tester.cc82
-rw-r--r--test/correctness/tester.h6
4 files changed, 63 insertions, 35 deletions
diff --git a/test/correctness/testblas.cc b/test/correctness/testblas.cc
index cc9a5adb..a5ccefe0 100644
--- a/test/correctness/testblas.cc
+++ b/test/correctness/testblas.cc
@@ -12,6 +12,7 @@
// =================================================================================================
#include <algorithm>
+#include <iostream>
#include "correctness/testblas.h"
@@ -141,9 +142,17 @@ void TestBlas<T,U>::TestRegular(std::vector<Arguments<U>> &test_vector, const st
auto index = get_index_(args, id1, id2);
if (!TestSimilarity(result1[index], result2[index])) {
errors++;
+ if (verbose_) {
+ fprintf(stdout, "\n Incorrect value found: ");
+ std::cout << result1[index];
+ fprintf(stdout, " (reference) versus ");
+ std::cout << result2[index];
+ fprintf(stdout, " (CLBlast)");
+ }
}
}
}
+ if (verbose_ && errors > 0) { fprintf(stdout, "\n "); }
// Tests the error count (should be zero)
TestErrorCount(errors, get_id1_(args)*get_id2_(args), args);
diff --git a/test/correctness/testblas.h b/test/correctness/testblas.h
index 13be921a..8fd1b1e2 100644
--- a/test/correctness/testblas.h
+++ b/test/correctness/testblas.h
@@ -35,6 +35,7 @@ class TestBlas: public Tester<T,U> {
using Tester<T,U>::context_;
using Tester<T,U>::queue_;
using Tester<T,U>::full_test_;
+ using Tester<T,U>::verbose_;
using Tester<T,U>::device_;
// Uses several helper functions from the Tester class
diff --git a/test/correctness/tester.cc b/test/correctness/tester.cc
index 872a131a..6c504b4e 100644
--- a/test/correctness/tester.cc
+++ b/test/correctness/tester.cc
@@ -32,6 +32,7 @@ Tester<T,U>::Tester(int argc, char *argv[], const bool silent,
context_(Context(device_)),
queue_(Queue(context_, device_)),
full_test_(CheckArgument(argc, argv, help_, kArgFullTest)),
+ verbose_(CheckArgument(argc, argv, help_, kArgVerbose)),
error_log_{},
num_passed_{0},
num_skipped_{0},
@@ -126,41 +127,8 @@ void Tester<T,U>::TestEnd() {
tests_failed_ += num_skipped_;
tests_failed_ += num_failed_;
- // Prints details of all error occurences for these tests
- for (auto &entry: error_log_) {
- if (entry.error_percentage != kStatusError) {
- fprintf(stdout, " Error rate %.1lf%%: ", entry.error_percentage);
- }
- else {
- fprintf(stdout, " Status code %d (expected %d): ", entry.status_found, entry.status_expect);
- }
- for (auto &o: options_) {
- if (o == kArgM) { fprintf(stdout, "%s=%zu ", kArgM, entry.args.m); }
- if (o == kArgN) { fprintf(stdout, "%s=%zu ", kArgN, entry.args.n); }
- if (o == kArgK) { fprintf(stdout, "%s=%zu ", kArgK, entry.args.k); }
- if (o == kArgKU) { fprintf(stdout, "%s=%zu ", kArgKU, entry.args.ku); }
- if (o == kArgKL) { fprintf(stdout, "%s=%zu ", kArgKL, entry.args.kl); }
- if (o == kArgLayout) { fprintf(stdout, "%s=%d ", kArgLayout, entry.args.layout);}
- if (o == kArgATransp) { fprintf(stdout, "%s=%d ", kArgATransp, entry.args.a_transpose);}
- if (o == kArgBTransp) { fprintf(stdout, "%s=%d ", kArgBTransp, entry.args.b_transpose);}
- if (o == kArgSide) { fprintf(stdout, "%s=%d ", kArgSide, entry.args.side);}
- if (o == kArgTriangle) { fprintf(stdout, "%s=%d ", kArgTriangle, entry.args.triangle);}
- if (o == kArgDiagonal) { fprintf(stdout, "%s=%d ", kArgDiagonal, entry.args.diagonal);}
- if (o == kArgXInc) { fprintf(stdout, "%s=%zu ", kArgXInc, entry.args.x_inc);}
- if (o == kArgYInc) { fprintf(stdout, "%s=%zu ", kArgYInc, entry.args.y_inc);}
- if (o == kArgXOffset) { fprintf(stdout, "%s=%zu ", kArgXOffset, entry.args.x_offset);}
- if (o == kArgYOffset) { fprintf(stdout, "%s=%zu ", kArgYOffset, entry.args.y_offset);}
- if (o == kArgALeadDim) { fprintf(stdout, "%s=%zu ", kArgALeadDim, entry.args.a_ld);}
- if (o == kArgBLeadDim) { fprintf(stdout, "%s=%zu ", kArgBLeadDim, entry.args.b_ld);}
- if (o == kArgCLeadDim) { fprintf(stdout, "%s=%zu ", kArgCLeadDim, entry.args.c_ld);}
- if (o == kArgAOffset) { fprintf(stdout, "%s=%zu ", kArgAOffset, entry.args.a_offset);}
- if (o == kArgBOffset) { fprintf(stdout, "%s=%zu ", kArgBOffset, entry.args.b_offset);}
- if (o == kArgCOffset) { fprintf(stdout, "%s=%zu ", kArgCOffset, entry.args.c_offset);}
- if (o == kArgAPOffset) { fprintf(stdout, "%s=%zu ", kArgAPOffset, entry.args.ap_offset);}
- if (o == kArgDotOffset){ fprintf(stdout, "%s=%zu ", kArgDotOffset, entry.args.dot_offset);}
- }
- fprintf(stdout, "\n");
- }
+ // Prints the errors
+ PrintErrorLog(error_log_);
// Prints a test summary
auto pass_rate = 100*num_passed_ / static_cast<float>(num_passed_ + num_skipped_ + num_failed_);
@@ -230,6 +198,11 @@ void Tester<T,U>::TestErrorCodes(const StatusCode clblas_status, const StatusCod
else {
PrintTestResult(kErrorStatus);
ReportError({clblas_status, clblast_status, kStatusError, args});
+ if (verbose_) {
+ fprintf(stdout, "\n");
+ PrintErrorLog({{clblas_status, clblast_status, kStatusError, args}});
+ fprintf(stdout, " ");
+ }
}
}
@@ -274,6 +247,45 @@ void Tester<T,U>::PrintTestResult(const std::string &message) {
print_count_++;
}
+// Prints details of errors occurred in a given error log
+template <typename T, typename U>
+void Tester<T,U>::PrintErrorLog(const std::vector<ErrorLogEntry> &error_log) {
+ for (auto &entry: error_log) {
+ if (entry.error_percentage != kStatusError) {
+ fprintf(stdout, " Error rate %.1lf%%: ", entry.error_percentage);
+ }
+ else {
+ fprintf(stdout, " Status code %d (expected %d): ", entry.status_found, entry.status_expect);
+ }
+ for (auto &o: options_) {
+ if (o == kArgM) { fprintf(stdout, "%s=%zu ", kArgM, entry.args.m); }
+ if (o == kArgN) { fprintf(stdout, "%s=%zu ", kArgN, entry.args.n); }
+ if (o == kArgK) { fprintf(stdout, "%s=%zu ", kArgK, entry.args.k); }
+ if (o == kArgKU) { fprintf(stdout, "%s=%zu ", kArgKU, entry.args.ku); }
+ if (o == kArgKL) { fprintf(stdout, "%s=%zu ", kArgKL, entry.args.kl); }
+ if (o == kArgLayout) { fprintf(stdout, "%s=%d ", kArgLayout, entry.args.layout);}
+ if (o == kArgATransp) { fprintf(stdout, "%s=%d ", kArgATransp, entry.args.a_transpose);}
+ if (o == kArgBTransp) { fprintf(stdout, "%s=%d ", kArgBTransp, entry.args.b_transpose);}
+ if (o == kArgSide) { fprintf(stdout, "%s=%d ", kArgSide, entry.args.side);}
+ if (o == kArgTriangle) { fprintf(stdout, "%s=%d ", kArgTriangle, entry.args.triangle);}
+ if (o == kArgDiagonal) { fprintf(stdout, "%s=%d ", kArgDiagonal, entry.args.diagonal);}
+ if (o == kArgXInc) { fprintf(stdout, "%s=%zu ", kArgXInc, entry.args.x_inc);}
+ if (o == kArgYInc) { fprintf(stdout, "%s=%zu ", kArgYInc, entry.args.y_inc);}
+ if (o == kArgXOffset) { fprintf(stdout, "%s=%zu ", kArgXOffset, entry.args.x_offset);}
+ if (o == kArgYOffset) { fprintf(stdout, "%s=%zu ", kArgYOffset, entry.args.y_offset);}
+ if (o == kArgALeadDim) { fprintf(stdout, "%s=%zu ", kArgALeadDim, entry.args.a_ld);}
+ if (o == kArgBLeadDim) { fprintf(stdout, "%s=%zu ", kArgBLeadDim, entry.args.b_ld);}
+ if (o == kArgCLeadDim) { fprintf(stdout, "%s=%zu ", kArgCLeadDim, entry.args.c_ld);}
+ if (o == kArgAOffset) { fprintf(stdout, "%s=%zu ", kArgAOffset, entry.args.a_offset);}
+ if (o == kArgBOffset) { fprintf(stdout, "%s=%zu ", kArgBOffset, entry.args.b_offset);}
+ if (o == kArgCOffset) { fprintf(stdout, "%s=%zu ", kArgCOffset, entry.args.c_offset);}
+ if (o == kArgAPOffset) { fprintf(stdout, "%s=%zu ", kArgAPOffset, entry.args.ap_offset);}
+ if (o == kArgDotOffset){ fprintf(stdout, "%s=%zu ", kArgDotOffset, entry.args.dot_offset);}
+ }
+ fprintf(stdout, "\n");
+ }
+}
+
// =================================================================================================
// Below are the non-member functions (separated because of otherwise required partial class
// template specialization)
diff --git a/test/correctness/tester.h b/test/correctness/tester.h
index d489f829..3534dffb 100644
--- a/test/correctness/tester.h
+++ b/test/correctness/tester.h
@@ -96,6 +96,9 @@ class Tester {
// Whether or not to run the full test-suite or just a smoke test
const bool full_test_;
+ // Whether or not to print extra information when testing
+ const bool verbose_;
+
// Retrieves the offset values to test with
const std::vector<size_t> GetOffsets() const;
@@ -109,6 +112,9 @@ class Tester {
// Prints the error or success symbol to screen
void PrintTestResult(const std::string &message);
+ // Prints an error log
+ void PrintErrorLog(const std::vector<ErrorLogEntry> &error_log);
+
// Logging and counting occurrences of errors
std::vector<ErrorLogEntry> error_log_;
size_t num_passed_;