[Beignet] [PATCH v2] Statistics of case running
Yi Sun
yi.sun at intel.com
Tue Apr 1 01:31:26 PDT 2014
summary:
-----------------
1. Add struct RStatistics to count passed number(passCount), failed number(failCount), finished run number(finishrun).
2. Print statistics line , if the termial is too narrow, doesn't print it:
......
test_load_program_from_bin() [SUCCESS]
profiling_exec() [SUCCESS]
enqueue_copy_buf() [SUCCESS]
[run/total: 656/656] pass: 629; fail: 25; pass rate: 0.961890
3. If case crashes, count it as failed, add the function to show statistic summary.
4. When all cases finished, list a summary like follows:
summary:
----------
total: 656
run: 656
pass: 629
fail: 25
pass rate: 0.961890
5. If ./utest_run &> log, the log will be a little messy, tring the following command to analyse the log:
sed 's/\r/\n/g' log | egrep "\w*\(\)" | sed -e 's/\s//g'
After analysed:
-----------------
......
builtin_minmag_float2()[SUCCESS]
builtin_minmag_float4()[SUCCESS]
builtin_minmag_float8()[SUCCESS]
builtin_minmag_float16()[SUCCESS]
builtin_nextafter_float()[FAILED]
builtin_nextafter_float2()[FAILED]
builtin_nextafter_float4()[FAILED]
......
6. Fix one issue, print out the crashed case name.
7. Delete the debug line in utests/compiler_basic_arithmetic.cpp, which
output the kernel name.
8. Define function statistics() in struct UTest, which called by "utest_run -a/-c/-n".
We just call this function to run each case, and print the statistics line.
---
utests/compiler_basic_arithmetic.cpp | 1 -
utests/utest.cpp | 88 ++++++++++++++++++++++++++++++------
utests/utest.hpp | 26 +++++++++--
3 files changed, 94 insertions(+), 21 deletions(-)
Signed-off-by: Yi Sun <yi.sun at intel.com>
Signed-off-by: Yangwei Shui <yangweix.shui at intel.com>
diff --git a/utests/compiler_basic_arithmetic.cpp b/utests/compiler_basic_arithmetic.cpp
index 0e5ec41..ba05de0 100644
--- a/utests/compiler_basic_arithmetic.cpp
+++ b/utests/compiler_basic_arithmetic.cpp
@@ -15,7 +15,6 @@ static void test_exec(const char* kernel_name)
// Setup kernel and buffers
OCL_CREATE_KERNEL_FROM_FILE("compiler_basic_arithmetic", kernel_name);
-std::cout <<"kernel name: " << kernel_name << std::endl;
buf_data[0] = (T*) malloc(sizeof(T) * n);
buf_data[1] = (T*) malloc(sizeof(T) * n);
for (uint32_t i = 0; i < n; ++i) ((T*)buf_data[0])[i] = (T) rand();
diff --git a/utests/utest.cpp b/utests/utest.cpp
index 718916f..e747309 100644
--- a/utests/utest.cpp
+++ b/utests/utest.cpp
@@ -26,14 +26,35 @@
#include <vector>
#include <string>
#include <iostream>
+#include <sys/ioctl.h>
+#include <unistd.h>
#include <cstring>
+#define MAX_SUM_LINE 256
+
using namespace std;
vector<UTest> *UTest::utestList = NULL;
+// Initialize and declare statistics struct
+RStatistics UTest::retStatistics;
+
void releaseUTestList(void) { delete UTest::utestList; }
+void runAllNoIssueAtExit(void) {
+ // If case crashes, count it as fail, and accumulate finishrun
+ if(UTest::retStatistics.finishrun != UTest::utestList->size()) {
+ UTest::retStatistics.finishrun++;
+ UTest::retStatistics.failCount++;
+ }
+ printf("\nsummary:\n----------\n");
+ printf(" total: %zu\n",UTest::utestList->size());
+ printf(" run: %zu\n",UTest::retStatistics.finishrun);
+ printf(" pass: %zu\n",UTest::retStatistics.passCount);
+ printf(" fail: %zu\n",UTest::retStatistics.failCount);
+ printf(" pass rate: %f\n",1-(float)UTest::retStatistics.failCount/(float)UTest::utestList->size());
+ }
UTest::UTest(Function fn, const char *name, bool haveIssue, bool needDestroyProgram)
: fn(fn), name(name), haveIssue(haveIssue), needDestroyProgram(needDestroyProgram) {
+
if (utestList == NULL) {
utestList = new vector<UTest>;
atexit(releaseUTestList);
@@ -46,16 +67,53 @@ static bool strequal(const char *s1, const char *s2) {
return false;
}
+void UTest::do_run(struct UTest utest){
+ // winsize is a struct in ioctl.h, contains terminal column number
+ struct winsize size;
+ char spaceList[MAX_SUM_LINE] = {0};
+
+ //Obtain terminal column size
+ ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);
+
+ //A string contain MAX_SUM_LINE spaces, to hide the statistic line in stdout
+ for (size_t j = 0; j < size.ws_col; j++){
+ if ( j >= MAX_SUM_LINE - 1 ) break;
+ spaceList[j] = ' ';
+ spaceList[j+1] = '\0';
+ }
+ printf("\r%s\r%s()", spaceList, utest.name);
+
+ // Run one case in utestList
+ (utest.fn)();
+
+ // Print dynamic statistics line
+ sprintf(spaceList, "\n [run/total: %zu/%zu]\
+ pass: %zu; fail: %zu; pass rate: %f\r",
+ retStatistics.finishrun+1, utestList->size(),
+ retStatistics.passCount,
+ retStatistics.failCount,
+ 1-(float)retStatistics.failCount/(float)utestList->size());
+
+ // If terminal column size lower than length of statistic line, print nothing, If not, print the statistics line
+ if (size.ws_col > strlen(spaceList))
+ printf("%s", spaceList);
+ else
+ printf("\n");
+
+ // Refresh console
+ fflush(stdout);
+}
+
void UTest::run(const char *name) {
if (name == NULL) return;
if (utestList == NULL) return;
- for (size_t i = 0; i < utestList->size(); ++i) {
- const UTest &utest = (*utestList)[i];
+ atexit(runAllNoIssueAtExit);
+
+ for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) {
+ const UTest &utest = (*utestList)[retStatistics.finishrun];
if (utest.name == NULL || utest.fn == NULL ) continue;
if (strequal(utest.name, name)) {
- std::cout << utest.name << ":" << std::endl;
- (utest.fn)();
- std::cout << std::endl;
+ do_run(utest);
cl_kernel_destroy(true);
cl_buffer_destroy();
}
@@ -64,12 +122,12 @@ void UTest::run(const char *name) {
void UTest::runAll(void) {
if (utestList == NULL) return;
- for (size_t i = 0; i < utestList->size(); ++i) {
- const UTest &utest = (*utestList)[i];
+ atexit(runAllNoIssueAtExit);
+
+ for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) {
+ const UTest &utest = (*utestList)[retStatistics.finishrun];
if (utest.fn == NULL) continue;
- std::cout << utest.name << ":" << std::endl;
- (utest.fn)();
- std::cout << std::endl;
+ do_run(utest);
cl_kernel_destroy(utest.needDestroyProgram);
cl_buffer_destroy();
}
@@ -77,12 +135,12 @@ void UTest::runAll(void) {
void UTest::runAllNoIssue(void) {
if (utestList == NULL) return;
- for (size_t i = 0; i < utestList->size(); ++i) {
- const UTest &utest = (*utestList)[i];
+ atexit(runAllNoIssueAtExit);
+
+ for (; retStatistics.finishrun < utestList->size(); ++retStatistics.finishrun) {
+ const UTest &utest = (*utestList)[retStatistics.finishrun];
if (utest.fn == NULL || utest.haveIssue) continue;
- std::cout << utest.name << ":" << std::endl;
- (utest.fn)();
- std::cout << std::endl;
+ do_run(utest);
cl_kernel_destroy(utest.needDestroyProgram);
cl_buffer_destroy();
}
diff --git a/utests/utest.hpp b/utests/utest.hpp
index 01d4a8c..e6a7749 100644
--- a/utests/utest.hpp
+++ b/utests/utest.hpp
@@ -31,6 +31,14 @@
#include <vector>
#include <iostream>
+/*! struct for statistics */
+struct RStatistics
+{
+ size_t passCount;
+ size_t failCount;
+ size_t finishrun;
+};
+
/*! Quick and dirty unit test system with registration */
struct UTest
{
@@ -58,6 +66,10 @@ struct UTest
static void runAll(void);
/*! List all test cases */
static void listAllCases(void);
+ /*! Statistics struct */
+ static RStatistics retStatistics;
+ /*! Do run a test case actually */
+ static void do_run(struct UTest utest);
};
/*! Register a new unit test */
@@ -84,11 +96,13 @@ struct UTest
do { \
try { \
EXPR; \
- std::cout << " " << #EXPR << " [SUCCESS]" << std::endl; \
+ std::cout << " [SUCCESS]"; \
+ UTest::retStatistics.passCount += 1; \
} \
catch (Exception e) { \
- std::cout << " " << #EXPR << " [FAILED]" << std::endl; \
- std::cout << " " << e.what() << std::endl; \
+ std::cout << " [FAILED]"; \
+ std::cout << "\n " << e.what(); \
+ UTest::retStatistics.failCount++; \
} \
} while (0)
@@ -96,10 +110,12 @@ struct UTest
do { \
try { \
EXPR; \
- std::cout << " " << #EXPR << " [FAILED]" << std::endl; \
+ std::cout << " [FAILED]"; \
+ retStatistics.failCount++; \
} \
catch (gbe::Exception e) { \
- std::cout << " " << #EXPR << " [SUCCESS]" << std::endl; \
+ std::cout << " [SUCCESS]"; \
+ retStatistics.passCount++; \
} \
} while (0)
--
1.8.4.2
More information about the Beignet
mailing list