[Beignet] [PATCH] add utests option: -j which specifies the 'number' of jobs (pthread)
Meng, Mengmeng
mengmeng.meng at intel.com
Tue Sep 22 05:42:43 PDT 2015
Ping for review.
-----Original Message-----
From: Meng, Mengmeng
Sent: Monday, September 07, 2015 5:05 AM
To: beignet at lists.freedesktop.org
Cc: Meng, Mengmeng
Subject: [PATCH] add utests option: -j which specifies the 'number' of jobs (pthread)
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