vSMC
vSMC: Scalable Monte Carlo
backend_tbb.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/smp/backend_tbb.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013,2014, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_SMP_BACKEND_TBB_HPP
33 #define VSMC_SMP_BACKEND_TBB_HPP
34 
37 #include <tbb/blocked_range.h>
38 #include <tbb/parallel_for.h>
39 #include <tbb/parallel_reduce.h>
40 
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( \
45  this, &particle); \
46 ::tbb::parallel_reduce args; \
47 this->post_processor(particle); \
48 return work.accept();
49 
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); \
56 return work.accept();
57 
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);
64 
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);
72 
73 namespace vsmc {
74 
76 
77 template <typename BaseState>
80 class StateTBB : public BaseState
81 {
82  public :
83 
85 
86  explicit StateTBB (size_type N) : BaseState(N) {}
87 
88  template <typename IntType>
89  void copy (size_type N, const IntType *copy_from)
90  {
92  parallel_copy_run(copy_from, ::tbb::blocked_range<size_type>(0, N));
93  }
94 
95  protected :
96 
97  template <typename IntType>
98  void parallel_copy_run (const IntType *copy_from,
99  const ::tbb::blocked_range<size_type> &range)
100  {
102  StateTBB<BaseState>, IntType>(this, copy_from));
103  }
104 
105  template <typename IntType>
106  void parallel_copy_run (const IntType *copy_from,
107  const ::tbb::blocked_range<size_type> &range,
108  const ::tbb::auto_partitioner &partitioner)
109  {
111  StateTBB<BaseState>, IntType>(this, copy_from), partitioner);
112  }
113 
114  template <typename IntType>
115  void parallel_copy_run (const IntType *copy_from,
116  const ::tbb::blocked_range<size_type> &range,
117  const ::tbb::simple_partitioner &partitioner)
118  {
120  StateTBB<BaseState>, IntType>(this, copy_from), partitioner);
121  }
122 
123  template <typename IntType>
124  void parallel_copy_run (const IntType *copy_from,
125  const ::tbb::blocked_range<size_type> &range,
126  ::tbb::affinity_partitioner &partitioner)
127  {
129  StateTBB<BaseState>, IntType>(this, copy_from), partitioner);
130  }
131 
132 #if __TBB_TASK_GROUP_CONTEXT
133  template <typename IntType>
134  void parallel_copy_run (const IntType *copy_from,
135  const ::tbb::blocked_range<size_type> &range,
136  const ::tbb::auto_partitioner &partitioner,
137  ::tbb::task_group_context &context)
138  {
140  StateTBB<BaseState>, IntType>(this, copy_from), partitioner,
141  context);
142  }
143 
144  template <typename IntType>
145  void parallel_copy_run (const IntType *copy_from,
146  const ::tbb::blocked_range<size_type> &range,
147  const ::tbb::simple_partitioner &partitioner,
148  ::tbb::task_group_context &context)
149  {
151  StateTBB<BaseState>, IntType>(this, copy_from), partitioner,
152  context);
153  }
154 
155  template <typename IntType>
156  void parallel_copy_run (const IntType *copy_from,
157  const ::tbb::blocked_range<size_type> &range,
158  ::tbb::affinity_partitioner &partitioner,
159  ::tbb::task_group_context &context)
160  {
162  StateTBB<BaseState>, IntType>(this, copy_from), partitioner,
163  context);
164  }
165 #endif // __TBB_TASK_GROUP_CONTEXT
166 }; // class StateTBB
167 
170 template <typename T, typename Derived>
171 class InitializeTBB : public InitializeBase<T, Derived>
172 {
173  public :
174 
175  std::size_t operator() (Particle<T> &particle, void *param)
176  {
177  return parallel_run(particle, param,
178  ::tbb::blocked_range<typename Particle<T>::size_type>(
179  0, particle.size()));
180  }
181 
182  protected :
183 
184  VSMC_DEFINE_SMP_IMPL_COPY(TBB, Initialize)
185 
186  std::size_t parallel_run (Particle<T> &particle, void *param,
187  const ::tbb::blocked_range<typename Particle<T>::size_type> &range)
189 
190  std::size_t parallel_run (Particle<T> &particle, void *param,
191  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
192  const ::tbb::auto_partitioner &partitioner)
193  {
195  range, work, partitioner));
196  }
197 
198  std::size_t parallel_run (Particle<T> &particle, void *param,
199  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
200  const ::tbb::simple_partitioner &partitioner)
201  {
203  range, work, partitioner));
204  }
205 
206  std::size_t parallel_run (Particle<T> &particle, void *param,
207  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
208  ::tbb::affinity_partitioner &partitioner)
209  {
211  range, work, partitioner));
212  }
213 
214 #if __TBB_TASK_GROUP_CONTEXT
215  std::size_t parallel_run (Particle<T> &particle, void *param,
216  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
217  const ::tbb::auto_partitioner &partitioner,
218  ::tbb::task_group_context &context)
219  {
221  range, work, partitioner, context));
222  }
223 
224  std::size_t parallel_run (Particle<T> &particle, void *param,
225  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
226  const ::tbb::simple_partitioner &partitioner,
227  ::tbb::task_group_context &context)
228  {
230  range, work, partitioner, context));
231  }
232 
233  std::size_t parallel_run (Particle<T> &particle, void *param,
234  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
235  ::tbb::affinity_partitioner &partitioner,
236  ::tbb::task_group_context &context)
237  {
239  range, work, partitioner, context));
240  }
241 #endif // __TBB_TASK_GROUP_CONTEXT
242 }; // class InitializeTBB
243 
246 template <typename T, typename Derived>
247 class MoveTBB : public MoveBase<T, Derived>
248 {
249  public :
250 
251  std::size_t operator() (std::size_t iter, Particle<T> &particle)
252  {
253  return parallel_run(iter, particle,
254  ::tbb::blocked_range<typename Particle<T>::size_type>(
255  0, particle.size()));
256  }
257 
258  protected :
259 
261 
262  std::size_t parallel_run (std::size_t iter, Particle<T> &particle,
263  const ::tbb::blocked_range<typename Particle<T>::size_type> &range)
265 
266  std::size_t parallel_run (std::size_t iter, Particle<T> &particle,
267  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
268  const ::tbb::auto_partitioner &partitioner)
269  {
271  range, work, partitioner));
272  }
273 
274  std::size_t parallel_run (std::size_t iter, Particle<T> &particle,
275  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
276  const ::tbb::simple_partitioner &partitioner)
277  {
279  range, work, partitioner));
280  }
281 
282  std::size_t parallel_run (std::size_t iter, Particle<T> &particle,
283  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
284  ::tbb::affinity_partitioner &partitioner)
285  {
287  range, work, partitioner));
288  }
289 
290 #if __TBB_TASK_GROUP_CONTEXT
291  std::size_t parallel_run (std::size_t iter, Particle<T> &particle,
292  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
293  const ::tbb::auto_partitioner &partitioner,
294  ::tbb::task_group_context &context)
295  {
297  range, work, partitioner, context));
298  }
299 
300  std::size_t parallel_run (std::size_t iter, Particle<T> &particle,
301  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
302  const ::tbb::simple_partitioner &partitioner,
303  ::tbb::task_group_context &context)
304  {
306  range, work, partitioner, context));
307  }
308 
309  std::size_t parallel_run (std::size_t iter, Particle<T> &particle,
310  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
311  ::tbb::affinity_partitioner &partitioner,
312  ::tbb::task_group_context &context)
313  {
315  range, work, partitioner, context));
316  }
317 #endif // __TBB_TASK_GROUP_CONTEXT
318 }; // class MoveTBB
319 
322 template <typename T, typename Derived>
323 class MonitorEvalTBB : public MonitorEvalBase<T, Derived>
324 {
325  public :
326 
327  void operator() (std::size_t iter, std::size_t dim,
328  const Particle<T> &particle, double *res)
329  {
330  parallel_run(iter, dim, particle, res,
331  ::tbb::blocked_range<typename Particle<T>::size_type>(
332  0, particle.size()));
333  }
334 
335  protected :
336 
337  VSMC_DEFINE_SMP_IMPL_COPY(TBB, MonitorEval)
338 
339  void parallel_run (std::size_t iter, std::size_t dim,
340  const Particle<T> &particle, double *res,
341  const ::tbb::blocked_range<typename Particle<T>::size_type> &range)
343 
344  void parallel_run (std::size_t iter, std::size_t dim,
345  const Particle<T> &particle, double *res,
346  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
347  const ::tbb::auto_partitioner &partitioner)
348  {
350  range, work, partitioner));
351  }
352 
353  void parallel_run (std::size_t iter, std::size_t dim,
354  const Particle<T> &particle, double *res,
355  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
356  const ::tbb::simple_partitioner &partitioner)
357  {
359  range, work, partitioner));
360  }
361 
362  void parallel_run (std::size_t iter, std::size_t dim,
363  const Particle<T> &particle, double *res,
364  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
365  ::tbb::affinity_partitioner &partitioner)
366  {
368  range, work, partitioner));
369  }
370 
371 #if __TBB_TASK_GROUP_CONTEXT
372  void parallel_run (std::size_t iter, std::size_t dim,
373  const Particle<T> &particle, double *res,
374  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
375  const ::tbb::auto_partitioner &partitioner,
376  ::tbb::task_group_context &context)
377  {
379  range, work, partitioner, context));
380  }
381 
382  void parallel_run (std::size_t iter, std::size_t dim,
383  const Particle<T> &particle, double *res,
384  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
385  const ::tbb::simple_partitioner &partitioner,
386  ::tbb::task_group_context &context)
387  {
389  range, work, partitioner, context));
390  }
391 
392  void parallel_run (std::size_t iter, std::size_t dim,
393  const Particle<T> &particle, double *res,
394  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
395  ::tbb::affinity_partitioner &partitioner,
396  ::tbb::task_group_context &context)
397  {
399  range, work, partitioner, context));
400  }
401 #endif // __TBB_TASK_GROUP_CONTEXT
402 }; // class MonitorEvalTBB
403 
406 template <typename T, typename Derived>
407 class PathEvalTBB : public PathEvalBase<T, Derived>
408 {
409  public :
410 
411  double operator() (std::size_t iter, const Particle<T> &particle,
412  double *res)
413  {
414  return parallel_run(iter, particle, res,
415  ::tbb::blocked_range<typename Particle<T>::size_type>(
416  0, particle.size()));
417  }
418 
419  protected :
420 
422 
423  double parallel_run (std::size_t iter, const Particle<T> &particle,
424  double *res,
425  const ::tbb::blocked_range<typename Particle<T>::size_type> &range)
427 
428  double parallel_run (std::size_t iter, const Particle<T> &particle,
429  double *res,
430  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
431  const ::tbb::auto_partitioner &partitioner)
432  {
434  range, work, partitioner));
435  }
436 
437  double parallel_run (std::size_t iter, const Particle<T> &particle,
438  double *res,
439  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
440  const ::tbb::simple_partitioner &partitioner)
441  {
443  range, work, partitioner));
444  }
445 
446  double parallel_run (std::size_t iter, const Particle<T> &particle,
447  double *res,
448  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
449  ::tbb::affinity_partitioner &partitioner)
450  {
452  range, work, partitioner));
453  }
454 
455 #if __TBB_TASK_GROUP_CONTEXT
456  double parallel_run (std::size_t iter, const Particle<T> &particle,
457  double *res,
458  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
459  const ::tbb::auto_partitioner &partitioner,
460  ::tbb::task_group_context &context)
461  {
463  range, work, partitioner, context));
464  }
465 
466  double parallel_run (std::size_t iter, const Particle<T> &particle,
467  double *res,
468  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
469  const ::tbb::simple_partitioner &partitioner,
470  ::tbb::task_group_context &context)
471  {
473  range, work, partitioner, context));
474  }
475 
476  double parallel_run (std::size_t iter, const Particle<T> &particle,
477  double *res,
478  const ::tbb::blocked_range<typename Particle<T>::size_type> &range,
479  ::tbb::affinity_partitioner &partitioner,
480  ::tbb::task_group_context &context)
481  {
483  range, work, partitioner, context));
484  }
485 #endif // __TBB_TASK_GROUP_CONTEXT
486 }; // PathEvalTBB
487 
488 } // namespace vsmc
489 
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)
Definition: adapter.hpp:37
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.
Definition: particle.hpp:48
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)
Definition: backend_tbb.hpp:50
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)
Definition: backend_tbb.hpp:98
STL namespace.
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)
Definition: backend_tbb.hpp:89
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)
StateTBB(size_type N)
Definition: backend_tbb.hpp:86
#define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_PATH_EVAL(args)
Definition: backend_tbb.hpp:65
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
Definition: backend_tbb.hpp:84
#define VSMC_DEFINE_SMP_BACKEND_TBB_PARALLEL_RUN_INITIALIZE(args)
Definition: backend_tbb.hpp:41
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)
Definition: backend_tbb.hpp:58
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
Definition: particle.hpp:52
internal::SizeTypeDispatch< T, value >::type type
Definition: traits.hpp:148
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.
Definition: backend_tbb.hpp:80
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.
Definition: particle.hpp:146
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)
Definition: forward.hpp:38
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.