10 #include <stk_algsup/AlgorithmRunner.hpp> 14 #include <tbb/task_scheduler_init.h> 15 #include <tbb/blocked_range.h> 16 #include <tbb/parallel_for.h> 17 #include <tbb/parallel_reduce.h> 18 #include <tbb/scalable_allocator.h> 19 #include <tbb/partitioner.h> 21 #include <stk_mesh/base/BulkData.hpp> 22 #include <stk_mesh/base/Bucket.hpp> 30 const mesh::Selector & selector ;
32 const std::vector<mesh::Bucket*> & buckets ;
33 const AlgorithmInterface & alg ;
35 void operator()(
const tbb::blocked_range<int>& r)
const;
37 RunTBB(
const mesh::Selector & arg_selector ,
39 const std::vector<mesh::Bucket*> & arg_buckets ,
40 const AlgorithmInterface & arg_alg );
46 const mesh::Selector & arg_selector ,
48 const std::vector<mesh::Bucket*> & arg_buckets ,
49 const AlgorithmInterface & arg_alg )
50 : selector( arg_selector ),
51 union_parts( arg_union_parts ),
52 buckets( arg_buckets ),
60 void RunTBB::operator()(
const tbb::blocked_range<int> & r )
const 62 for (
int i = r.begin() ; i < r.end() ; ++i ) {
63 alg.apply_one( selector , union_parts , * buckets[i] , NULL );
68 const mesh::Selector & selector ;
70 const std::vector<mesh::Bucket*> & buckets ;
71 const AlgorithmInterface & alg ;
74 void operator()(
const tbb::blocked_range<int>& r);
76 void join(
const RunTBBreduce & rhs )
const ;
78 RunTBBreduce(
const RunTBBreduce & rhs , tbb::split );
80 RunTBBreduce(
const mesh::Selector & arg_selector ,
82 const std::vector<mesh::Bucket*> & arg_buckets ,
83 const AlgorithmInterface & arg_alg ,
84 void * arg_reduce = NULL );
89 RunTBBreduce::RunTBBreduce(
const RunTBBreduce & rhs , tbb::split )
90 : selector( rhs.selector ),
91 union_parts( rhs.union_parts ),
92 buckets( rhs.buckets ),
97 reduce = malloc( alg.m_reduce_allocation_size );
102 RunTBBreduce::~RunTBBreduce()
104 if ( reduce ) { free( reduce ); }
107 void RunTBBreduce::join(
const RunTBBreduce & rhs )
const 109 alg.join( reduce , rhs.reduce );
112 void RunTBBreduce::operator()(
const tbb::blocked_range<int> & r )
114 for (
int i = r.begin() ; i < r.end() ; ++i ) {
115 alg.apply_one( selector , union_parts, * buckets[i] , reduce );
119 RunTBBreduce::RunTBBreduce(
120 const mesh::Selector & arg_selector ,
122 const std::vector<mesh::Bucket*> & arg_buckets ,
123 const AlgorithmInterface & arg_alg ,
125 : selector( arg_selector ),
126 union_parts( arg_union_parts ),
127 buckets( arg_buckets ),
134 class AlgorithmRunnerTBB :
public AlgorithmRunnerInterface {
136 AlgorithmRunnerTBB(
int nthreads)
137 : tbb_task_init_(NULL)
139 tbb_task_init_ =
new tbb::task_scheduler_init(nthreads);
142 ~AlgorithmRunnerTBB()
144 delete tbb_task_init_;
147 void run_alg(
const mesh::Selector & selector ,
149 const std::vector< mesh::Bucket * > & buckets ,
150 const AlgorithmInterface & alg ,
151 void * reduce )
const ;
154 tbb::task_scheduler_init* tbb_task_init_;
157 void AlgorithmRunnerTBB::run_alg(
158 const mesh::Selector & selector ,
160 const std::vector< mesh::Bucket * > & buckets ,
161 const AlgorithmInterface & alg ,
162 void * reduce )
const 164 static tbb::affinity_partitioner ap;
166 if ( reduce && ! alg.m_reduce_allocation_size ) {
167 std::string msg(
"AlgorithmRunnerTBB: ERROR reduce value with zero size");
168 throw std::invalid_argument(msg);
171 if ( ! buckets.empty() ) {
173 tbb::blocked_range<int> range( 0 , buckets.size() );
176 RunTBBreduce tmp( selector , union_parts , buckets , alg, reduce );
178 tbb::parallel_reduce( range , tmp , ap );
182 RunTBB tmp( selector , union_parts , buckets , alg );
184 tbb::parallel_for( range, tmp , ap);
193 static AlgorithmRunnerTBB runner(nthreads) ;
AlgorithmRunnerInterface * algorithm_runner_tbb(int nthreads)
std::vector< Part *> PartVector
Collections of parts are frequently maintained as a vector of Part pointers.