[Beignet] [PATCH] add utests option: -j which specifies the 'number' of jobs (pthread)

Meng Mengmeng mengmeng.meng at intel.com
Sun Sep 6 14:04:30 PDT 2015


1. the ptread number should be [1 - utestList->size]
2. out-of-order execution for all utests lists
---
 utests/utest.cpp     | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 utests/utest.hpp     |  4 ++++
 utests/utest_run.cpp | 14 ++++++++++++-
 3 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/utests/utest.cpp b/utests/utest.cpp
index 0a03d8b..2c83a5d 100644
--- a/utests/utest.cpp
+++ b/utests/utest.cpp
@@ -31,6 +31,12 @@
 #include <cstring>
 #include <stdlib.h>
 #include <csignal>
+#include <algorithm>
+#include <random>
+#include <chrono>
+#include <iterator>
+#include <semaphore.h>
+#include <unistd.h>
 
 struct signalMap
 {
@@ -39,7 +45,9 @@ struct signalMap
 };
 
 using namespace std;
+sem_t tag;
 vector<UTest> *UTest::utestList = NULL;
+vector<int> v;
 // Initialize and declare statistics struct
 RStatistics UTest::retStatistics;
 
@@ -105,6 +113,30 @@ void catch_signal(void){
       perror("Could not set signal handler");
   }
 }
+void *multithread(void * arg)
+{
+  int SerialNumber;
+//  int PhtreadNumber = *(int *)arg;
+
+  while(! v.empty()){
+    sem_wait(&tag);
+
+    SerialNumber = v.back();
+    v.pop_back();
+
+    const  UTest &utest = (*UTest::utestList)[SerialNumber];
+//    printf("thread%d  %d, utests.name is %s\n",PhtreadNumber, SerialNumber,utest.name);
+    UTest::do_run(utest);
+    cl_kernel_destroy(true);
+    cl_buffer_destroy();
+
+    sem_post(&tag);
+    sleep(1);
+  }
+
+  return 0;
+}
+
 
 UTest::UTest(Function fn, const char *name, bool isBenchMark, bool haveIssue, bool needDestroyProgram)
        : fn(fn), name(name), isBenchMark(isBenchMark), haveIssue(haveIssue), needDestroyProgram(needDestroyProgram) {
@@ -148,6 +180,32 @@ void UTest::run(const char *name) {
   }
 }
 
+void UTest::runMultiThread(const char *number) {
+  if (number == NULL) return;
+  if (utestList == NULL) return;
+
+  unsigned long i, num;
+  sem_init(&tag, 0, 1);
+
+  num = atoi(number);
+
+  if(num < 1 || num > utestList->size()){
+    printf("the 'number' of jobs to run simultaneously is [1 - %lu]",utestList->size());
+    return;
+  }
+
+  for(i = 0; i < utestList->size(); ++i) v.push_back (i);
+  unsigned seed = chrono::system_clock::now ().time_since_epoch ().count ();
+  shuffle (v.begin (), v.end (), std::default_random_engine (seed));
+
+  pthread_t pthread_arry[num];
+
+  for(i=0; i<num;i++) pthread_create(&pthread_arry[i], NULL, multithread, (void *)&i);
+  for(i=0; i<num;i++) pthread_join(pthread_arry[i], NULL);
+
+  sem_destroy(&tag);
+}
+
 void UTest::runAll(void) {
   if (utestList == NULL) return;
 
diff --git a/utests/utest.hpp b/utests/utest.hpp
index 7ae8b87..cda7545 100644
--- a/utests/utest.hpp
+++ b/utests/utest.hpp
@@ -54,6 +54,8 @@ struct UTest
   Function fn;
   /*! Name of the test */
   const char *name;
+  /*! numbers of the jobs */
+  const char *number;
   /*! whether it is a bench mark. */
   bool isBenchMark;
   /*! Indicate whether current test cases has issue to be fixes */
@@ -64,6 +66,8 @@ struct UTest
   static std::vector<UTest> *utestList;
   /*! Run the test with the given name */
   static void run(const char *name);
+  /*! Run the test with the given name */
+  static void runMultiThread(const char *number);
   /*! Run all the tests without known issue*/
   static void runAllNoIssue(void);
   /*! Run all the benchmark. */
diff --git a/utests/utest_run.cpp b/utests/utest_run.cpp
index 3cc1b6c..8cc15b1 100644
--- a/utests/utest_run.cpp
+++ b/utests/utest_run.cpp
@@ -28,9 +28,10 @@
 #include <iostream>
 #include <getopt.h>
 
-static const char *shortopts = "c:lanh";
+static const char *shortopts = "c:j:lanh";
 struct option longopts[] = {
 {"casename", required_argument, NULL, 'c'},
+{"jobs", required_argument, NULL, 'j'},
 {"list", no_argument, NULL, 'l'},
 {"all", no_argument, NULL, 'a'},
 {"allnoissue", no_argument, NULL, 'n'},
@@ -46,6 +47,7 @@ Usage:\n\
 \n\
   option:\n\
     -c <casename>: run sub-case named 'casename'\n\
+    -j <number>  : specifies the 'number' of jobs (thread)\n\
     -l           : list all the available case name\n\
     -a           : run all test cases\n\
     -n           : run all test cases without known issue (default option)\n\
@@ -85,6 +87,16 @@ int main(int argc, char *argv[])
 
         break;
 
+      case 'j':
+        try {
+          UTest::runMultiThread(optarg);
+        }
+        catch (Exception e){
+          std::cout << "  " << e.what() << "    [SUCCESS]" << std::endl;
+        }
+
+        break;
+
       case 'l':
         UTest::listAllCases();
         break;
-- 
1.9.1



More information about the Beignet mailing list