32 #ifndef VSMC_SMP_BACKEND_GCD_HPP
33 #define VSMC_SMP_BACKEND_GCD_HPP
51 explicit StateGCD (size_type N) : BaseState(N) {}
56 template <
typename T,
typename Derived>
57 class InitializeGCD :
public InitializeBase<T, Derived>
64 const size_type N =
static_cast<size_type
>(particle.
size());
68 work_param_ wp(
this, &particle, &accept_[0]);
73 for (size_type i = 0; i != N; ++i)
86 std::vector<
std::
size_t> accept_;
92 dispatcher(dptr), particle(pptr), accept(aptr) {}
96 std::size_t *
const accept;
99 static void work_ (
void *wp, std::size_t i)
102 const work_param_ *
const wptr =
static_cast<const work_param_ *
>(wp);
103 wptr->accept[i] = wptr->dispatcher->initialize_state(
110 template <
typename T,
typename Derived>
111 class MoveGCD :
public MoveBase<T, Derived>
118 const size_type N =
static_cast<size_type
>(particle.
size());
121 work_param_ wp(
this, &particle, &accept_[0], iter);
126 for (size_type i = 0; i != N; ++i)
139 std::vector<
std::
size_t> accept_;
144 std::size_t *aptr, std::size_t i) :
145 dispatcher(dptr), particle(pptr), accept(aptr), iter(i) {}
149 std::size_t *
const accept;
153 static void work_ (
void *wp, std::size_t i)
156 const work_param_ *
const wptr =
static_cast<const work_param_ *
>(wp);
157 wptr->accept[i] = wptr->dispatcher->move_state(wptr->iter,
164 template <
typename T,
typename Derived>
165 class MonitorEvalGCD :
public MonitorEvalBase<T, Derived>
173 const size_type N =
static_cast<size_type
>(particle.
size());
175 work_param_ wp(
this, &particle, res, iter, dim);
191 double *rptr, std::size_t i, std::size_t d) :
192 dispatcher(dptr), particle(pptr), res(rptr), iter(i), dim(d) {}
201 static void work_ (
void *wp, std::size_t i)
204 const work_param_ *
const wptr =
static_cast<const work_param_ *
>(wp);
205 wptr->dispatcher->monitor_state(wptr->iter, wptr->dim,
207 static_cast<size_type>(i), wptr->particle),
208 wptr->res + i * wptr->dim);
214 template <
typename T,
typename Derived>
215 class PathEvalGCD :
public PathEvalBase<T, Derived>
223 const size_type N =
static_cast<size_type
>(particle.
size());
225 work_param_ wp(
this, &particle, res, iter);
243 double *rptr, std::size_t i) :
244 dispatcher(dptr), particle(pptr), res(rptr), iter(i) {}
252 static void work_ (
void *wp, std::size_t i)
255 const work_param_ *
const wptr =
static_cast<const work_param_ *
>(wp);
256 wptr->res[i] = wptr->dispatcher->path_state(wptr->iter,
258 static_cast<size_type>(i), wptr->particle));
264 #endif // VSMC_SMP_BACKEND_GCD_HPP
Particle class representing the whole particle set.
std::size_t operator()(std::size_t iter, Particle< T > &particle)
void initialize_param(Particle< T > &particle, void *param)
traits::SizeTypeTrait< BaseState >::type size_type
void pre_processor(Particle< T > &particle)
Sampler::move_type subtype usingt Apple Grand Central Dispatch.
std::size_t operator()(Particle< T > &particle, void *param)
void post_processor(std::size_t iter, const Particle< T > &particle)
void operator()(std::size_t iter, std::size_t dim, const Particle< T > &particle, double *res)
double path_grid(std::size_t iter, const Particle< T > &particle)
void post_processor(std::size_t iter, Particle< T > &particle)
Path::eval_type subtype usingt Apple Grand Central Dispatch.
void pre_processor(std::size_t iter, Particle< T > &particle)
void post_processor(std::size_t iter, const Particle< T > &particle)
Particle::value_type subtype usingt Apple Grand Central Dispatch.
void apply_f(std::size_t iterations, void *context, void(*work)(void *, std::size_t)) const
Monitor::eval_type subtype usingt Apple Grand Central Dispatch.
void pre_processor(std::size_t iter, const Particle< T > &particle)
Sampler::init_type subtype usingt Apple Grand Central Dispatch.
The queue obtained by dispatch_get_gloal_queue
traits::SizeTypeTrait< T >::type size_type
internal::SizeTypeDispatch< T, value >::type type
void post_processor(Particle< T > &particle)
size_type size() const
Number of particles.
double operator()(std::size_t iter, const Particle< T > &particle, double *res)
A thin wrapper over a complete Particle.
void pre_processor(std::size_t iter, const Particle< T > &particle)
#define VSMC_DEFINE_SMP_FORWARD(Name)
A const variant to SingleParticle.
#define VSMC_DEFINE_SMP_IMPL_COPY(Impl, Name)