diff options
author | Cedric Nugteren <web@cedricnugteren.nl> | 2016-04-27 14:38:30 +0200 |
---|---|---|
committer | Cedric Nugteren <web@cedricnugteren.nl> | 2016-04-27 14:38:30 +0200 |
commit | 226e834d0a6569f8142ab0cde14e6e273486a277 (patch) | |
tree | 58a94fe874a928d66b8972724c531d802991cf11 /test/correctness | |
parent | 3555cd043654ec24ff325bd6205281af790e50d2 (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.cc | 9 | ||||
-rw-r--r-- | test/correctness/testblas.h | 1 | ||||
-rw-r--r-- | test/correctness/tester.cc | 82 | ||||
-rw-r--r-- | test/correctness/tester.h | 6 |
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_; |