32 #ifndef VSMC_SMP_BACKEND_TBB_HPP
33 #define VSMC_SMP_BACKEND_TBB_HPP
37 #include <tbb/blocked_range.h>
38 #include <tbb/parallel_for.h>
39 #include <tbb/parallel_reduce.h>
41 #define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_INITIALIZE(args) \
42 this->initialize_param(particle, param); \
43 this->pre_processor(particle); \
44 internal::ParallelInitializeState<T, InitializeTBB<T, Derived> > work( \
46 ::tbb::parallel_reduce args; \
47 this->post_processor(particle); \
50 #define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_MOVE(args) \
51 this->pre_processor(iter, particle); \
52 internal::ParallelMoveState<T, MoveTBB<T, Derived> > work( \
53 this, iter, &particle); \
54 ::tbb::parallel_reduce args; \
55 this->post_processor(iter, particle); \
58 #define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_MONITOR_EVAL(args) \
59 this->pre_processor(iter, particle); \
60 internal::ParallelMonitorState<T, MonitorEvalTBB<T, Derived> > work( \
61 this, iter, dim, &particle, res); \
62 ::tbb::parallel_for args; \
63 this->post_processor(iter, particle);
65 #define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_PATH_EVAL(args) \
66 this->pre_processor(iter, particle); \
67 internal::ParallelPathState<T, PathEvalTBB<T, Derived> > work( \
68 this, iter, &particle, res); \
69 ::tbb::parallel_for args; \
70 this->post_processor(iter, particle); \
71 return this->path_grid(iter, particle);
86 explicit StateTBB (size_type N) : BaseState(N) {}
88 template <
typename IntType>
89 void copy (size_type N,
const IntType *copy_from)
92 parallel_copy_run(copy_from, ::tbb::blocked_range<size_type>(0, N));
97 template <
typename IntType>
99 const ::tbb::blocked_range<size_type> &range)
105 template <
typename IntType>
107 const ::tbb::blocked_range<size_type> &range,
108 const ::tbb::auto_partitioner &partitioner)
114 template <
typename IntType>
116 const ::tbb::blocked_range<size_type> &range,
117 const ::tbb::simple_partitioner &partitioner)
123 template <
typename IntType>
125 const ::tbb::blocked_range<size_type> &range,
126 ::tbb::affinity_partitioner &partitioner)
132 #if __TBB_TASK_GROUP_CONTEXT
133 template <
typename IntType>
135 const ::tbb::blocked_range<size_type> &range,
136 const ::tbb::auto_partitioner &partitioner,
137 ::tbb::task_group_context &context)
144 template <
typename IntType>
146 const ::tbb::blocked_range<size_type> &range,
147 const ::tbb::simple_partitioner &partitioner,
148 ::tbb::task_group_context &context)
155 template <
typename IntType>
157 const ::tbb::blocked_range<size_type> &range,
158 ::tbb::affinity_partitioner &partitioner,
159 ::tbb::task_group_context &context)
165 #endif // __TBB_TASK_GROUP_CONTEXT
170 template <
typename T,
typename Derived>
171 class InitializeTBB :
public InitializeBase<T, Derived>
179 0, particle.
size()));
187 const ::tbb::blocked_range<typename
Particle<T>::size_type> &range)
192 const ::tbb::auto_partitioner &partitioner)
195 range, work, partitioner));
200 const ::tbb::simple_partitioner &partitioner)
203 range, work, partitioner));
208 ::tbb::affinity_partitioner &partitioner)
211 range, work, partitioner));
214 #if __TBB_TASK_GROUP_CONTEXT
217 const ::tbb::auto_partitioner &partitioner,
218 ::tbb::task_group_context &context)
221 range, work, partitioner, context));
226 const ::tbb::simple_partitioner &partitioner,
227 ::tbb::task_group_context &context)
230 range, work, partitioner, context));
235 ::tbb::affinity_partitioner &partitioner,
236 ::tbb::task_group_context &context)
239 range, work, partitioner, context));
241 #endif // __TBB_TASK_GROUP_CONTEXT
246 template <
typename T,
typename Derived>
247 class MoveTBB :
public MoveBase<T, Derived>
255 0, particle.
size()));
263 const ::tbb::blocked_range<typename
Particle<T>::size_type> &range)
268 const ::tbb::auto_partitioner &partitioner)
271 range, work, partitioner));
276 const ::tbb::simple_partitioner &partitioner)
279 range, work, partitioner));
284 ::tbb::affinity_partitioner &partitioner)
287 range, work, partitioner));
290 #if __TBB_TASK_GROUP_CONTEXT
293 const ::tbb::auto_partitioner &partitioner,
294 ::tbb::task_group_context &context)
297 range, work, partitioner, context));
302 const ::tbb::simple_partitioner &partitioner,
303 ::tbb::task_group_context &context)
306 range, work, partitioner, context));
311 ::tbb::affinity_partitioner &partitioner,
312 ::tbb::task_group_context &context)
315 range, work, partitioner, context));
317 #endif // __TBB_TASK_GROUP_CONTEXT
322 template <
typename T,
typename Derived>
323 class MonitorEvalTBB :
public MonitorEvalBase<T, Derived>
332 0, particle.
size()));
340 const
Particle<T> &particle,
double *res,
341 const ::tbb::blocked_range<typename
Particle<T>::size_type> &range)
347 const ::tbb::auto_partitioner &partitioner)
350 range, work, partitioner));
356 const ::tbb::simple_partitioner &partitioner)
359 range, work, partitioner));
365 ::tbb::affinity_partitioner &partitioner)
368 range, work, partitioner));
371 #if __TBB_TASK_GROUP_CONTEXT
375 const ::tbb::auto_partitioner &partitioner,
376 ::tbb::task_group_context &context)
379 range, work, partitioner, context));
385 const ::tbb::simple_partitioner &partitioner,
386 ::tbb::task_group_context &context)
389 range, work, partitioner, context));
395 ::tbb::affinity_partitioner &partitioner,
396 ::tbb::task_group_context &context)
399 range, work, partitioner, context));
401 #endif // __TBB_TASK_GROUP_CONTEXT
406 template <
typename T,
typename Derived>
407 class PathEvalTBB :
public PathEvalBase<T, Derived>
416 0, particle.
size()));
425 const ::tbb::blocked_range<typename
Particle<T>::size_type> &range)
431 const ::tbb::auto_partitioner &partitioner)
434 range, work, partitioner));
440 const ::tbb::simple_partitioner &partitioner)
443 range, work, partitioner));
449 ::tbb::affinity_partitioner &partitioner)
452 range, work, partitioner));
455 #if __TBB_TASK_GROUP_CONTEXT
459 const ::tbb::auto_partitioner &partitioner,
460 ::tbb::task_group_context &context)
463 range, work, partitioner, context));
469 const ::tbb::simple_partitioner &partitioner,
470 ::tbb::task_group_context &context)
473 range, work, partitioner, context));
479 ::tbb::affinity_partitioner &partitioner,
480 ::tbb::task_group_context &context)
483 range, work, partitioner, context));
485 #endif // __TBB_TASK_GROUP_CONTEXT
490 #endif // VSMC_SMP_BACKEND_TBB_HPP
double parallel_run(std::size_t iter, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner,::tbb::task_group_context &context)
double parallel_run(std::size_t iter, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner,::tbb::task_group_context &context)
Particle class representing the whole particle set.
void parallel_run(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner)
#define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_MOVE(args)
void parallel_run(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner)
void parallel_run(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner,::tbb::task_group_context &context)
std::size_t parallel_run(Particle< T > &particle, void *param, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner,::tbb::task_group_context &context)
#define VSMC_RUNTIME_ASSERT_SMP_BACKEND_BASE_COPY_SIZE_MISMATCH(name)
void parallel_run(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range)
std::size_t parallel_run(Particle< T > &particle, void *param, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner,::tbb::task_group_context &context)
void parallel_run(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner)
void parallel_copy_run(const IntType *copy_from, const ::tbb::blocked_range< size_type > &range)
std::size_t parallel_run(std::size_t iter, Particle< T > &particle, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner)
double parallel_run(std::size_t iter, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner)
void copy(size_type N, const IntType *copy_from)
std::size_t parallel_run(std::size_t iter, Particle< T > &particle, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner,::tbb::task_group_context &context)
void parallel_copy_run(const IntType *copy_from, const ::tbb::blocked_range< size_type > &range, const ::tbb::auto_partitioner &partitioner)
void parallel_copy_run(const IntType *copy_from, const ::tbb::blocked_range< size_type > &range,::tbb::affinity_partitioner &partitioner,::tbb::task_group_context &context)
std::size_t operator()(std::size_t iter, Particle< T > &particle)
std::size_t parallel_run(Particle< T > &particle, void *param, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner,::tbb::task_group_context &context)
std::size_t parallel_run(std::size_t iter, Particle< T > &particle, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner)
void parallel_copy_run(const IntType *copy_from, const ::tbb::blocked_range< size_type > &range,::tbb::affinity_partitioner &partitioner)
#define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_PATH_EVAL(args)
void parallel_run(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner,::tbb::task_group_context &context)
double parallel_run(std::size_t iter, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner)
traits::SizeTypeTrait< BaseState >::type size_type
#define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_INITIALIZE(args)
std::size_t parallel_run(Particle< T > &particle, void *param, const ::tbb::blocked_range< typename Particle< T >::size_type > &range)
std::size_t parallel_run(std::size_t iter, Particle< T > &particle, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner)
double parallel_run(std::size_t iter, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner,::tbb::task_group_context &context)
std::size_t parallel_run(std::size_t iter, Particle< T > &particle, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner,::tbb::task_group_context &context)
#define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_MONITOR_EVAL(args)
double parallel_run(std::size_t iter, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner)
std::size_t parallel_run(Particle< T > &particle, void *param, const ::tbb::blocked_range< typename Particle< T >::size_type > &range,::tbb::affinity_partitioner &partitioner)
std::size_t parallel_run(Particle< T > &particle, void *param, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::simple_partitioner &partitioner)
traits::SizeTypeTrait< T >::type size_type
internal::SizeTypeDispatch< T, value >::type type
void parallel_run(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner,::tbb::task_group_context &context)
Particle::value_type subtype using Intel Threading Building Blocks.
std::size_t parallel_run(Particle< T > &particle, void *param, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner)
double parallel_run(std::size_t iter, const Particle< T > &particle, double *res, const ::tbb::blocked_range< typename Particle< T >::size_type > &range)
void operator()(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res)
size_type size() const
Number of particles.
void parallel_copy_run(const IntType *copy_from, const ::tbb::blocked_range< size_type > &range, const ::tbb::auto_partitioner &partitioner,::tbb::task_group_context &context)
std::size_t parallel_run(std::size_t iter, Particle< T > &particle, const ::tbb::blocked_range< typename Particle< T >::size_type > &range, const ::tbb::auto_partitioner &partitioner,::tbb::task_group_context &context)
std::size_t parallel_run(std::size_t iter, Particle< T > &particle, const ::tbb::blocked_range< typename Particle< T >::size_type > &range)
std::size_t operator()(Particle< T > &particle, void *param)
double operator()(std::size_t iter, const Particle< T > &particle, double *res)
void parallel_copy_run(const IntType *copy_from, const ::tbb::blocked_range< size_type > &range, const ::tbb::simple_partitioner &partitioner,::tbb::task_group_context &context)
#define VSMC_DEFINE_SMP_FORWARD(Name)
void parallel_copy_run(const IntType *copy_from, const ::tbb::blocked_range< size_type > &range, const ::tbb::simple_partitioner &partitioner)
#define VSMC_DEFINE_SMP_IMPL_COPY(Impl, Name)
void parallel_for(const Range &range, WorkType &&work)
Parallel for using std::thread.