From 15e0e191317682f897a6ea4b6736dd8f04fe9520 Mon Sep 17 00:00:00 2001 From: Srinath Vadlamani Date: Wed, 1 Apr 2015 17:02:44 -0500 Subject: [PATCH] a tbb example --- codingTests/cplusplus/build.py | 5 ++++ codingTests/cplusplus/testVec.cpp | 4 +++ codingTests/intelTbb/example1.cpp | 49 +++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 codingTests/intelTbb/example1.cpp diff --git a/codingTests/cplusplus/build.py b/codingTests/cplusplus/build.py index be9ea99..d9afad8 100755 --- a/codingTests/cplusplus/build.py +++ b/codingTests/cplusplus/build.py @@ -28,6 +28,7 @@ def shellCommand(command,errorMessage): TAU_MAKEFILE=/work/02463/srinathv/tau2/x86_64/lib/Makefile.tau-intelImpiCuda.aac-icpc-papi-mpi-cupti-pdt; \ export TAU_OPTIONS="-optLinkOnly -optVerbose"' OMP_FLAG=' -DOMP -openmp ' +TBB_FLAG=' -DUSE_TBB -tbb ' @@ -55,6 +56,8 @@ def main(): parser.add_argument('-o','--openmp',action="store_true", help='Compile with OpenMP') + parser.add_argument('-tbb','--tbb',action="store_true", + help='Compile with Intel Thread building blocks.') args = parser.parse_args() if (args.debug): @@ -73,6 +76,8 @@ def main(): IFDEF = IFDEF + '-DDEQ ' if (args.numelems): IFDEF = IFDEF + '-DSET_N='+str(args.numelems) + if (args.tbb): + IFDEF = IFDEF + TBB_FLAG logging.debug('IFDEF is ' + IFDEF) diff --git a/codingTests/cplusplus/testVec.cpp b/codingTests/cplusplus/testVec.cpp index b6bb629..eed2b4d 100644 --- a/codingTests/cplusplus/testVec.cpp +++ b/codingTests/cplusplus/testVec.cpp @@ -6,6 +6,10 @@ #ifdef USE_TAU #include #endif +#ifdef USE_TBB +#include "tbb/concurrent_vector.h" +#endif + using std::vector; diff --git a/codingTests/intelTbb/example1.cpp b/codingTests/intelTbb/example1.cpp new file mode 100644 index 0000000..7b6d030 --- /dev/null +++ b/codingTests/intelTbb/example1.cpp @@ -0,0 +1,49 @@ +#include "tbb/blocked_range.h" +#include "tbb/parallel_for.h" +#include "tbb/task_scheduler_init.h" +#include +#include + +struct mytask { + mytask(size_t n) + :_n(n) + {} + void operator()() { + for (int i=0;i<1000000;++i) {} // Deliberately run slow + std::cerr << "[" << _n << "]"; + } + size_t _n; +}; + +struct executor +{ + executor(std::vector& t) + :_tasks(t) + {} + executor(executor& e,tbb::split) + :_tasks(e._tasks) + {} + + void operator()(const tbb::blocked_range& r) const { + for (size_t i=r.begin();i!=r.end();++i) + _tasks[i](); + } + + std::vector& _tasks; +}; + +int main(int,char**) { + + tbb::task_scheduler_init init; // Automatic number of threads +// tbb::task_scheduler_init init(2); // Explicit number of threads + + std::vector tasks; + for (int i=0;i<1000;++i) + tasks.push_back(mytask(i)); + + executor exec(tasks); + tbb::parallel_for(tbb::blocked_range(0,tasks.size()),exec); + std::cerr << std::endl; + + return 0; +}