20 #ifndef RAJA_PATTERN_WorkGroup_HPP
21 #define RAJA_PATTERN_WorkGroup_HPP
23 #include "RAJA/config.hpp"
62 template<
typename... Args>
63 using xargs = camp::list<Args...>;
71 static constexpr
bool value =
false;
74 template<
typename... Args>
77 static constexpr
bool value =
true;
119 template<
typename WORKGROUP_POLICY_T,
121 typename EXTRA_ARGS_T,
122 typename ALLOCATOR_T>
127 "WorkPool: WORKGROUP_POLICY_T must be a workgroup policy");
129 "WorkPool: EXTRA_ARGS_T must be a RAJA::xargs<...> type");
158 template<
typename WORKGROUP_POLICY_T,
160 typename EXTRA_ARGS_T,
161 typename ALLOCATOR_T>
166 "WorkGroup: WORKGROUP_POLICY_T must be a workgroup policy");
168 "WorkGroup: EXTRA_ARGS_T must be a RAJA::xargs<...> type");
196 template<
typename WORKGROUP_POLICY_T,
198 typename EXTRA_ARGS_T,
199 typename ALLOCATOR_T>
204 "WorkSite: WORKGROUP_POLICY_T must be a workgroup policy");
206 "WorkSite: EXTRA_ARGS_T must be a RAJA::xargs<...> type");
209 template<
typename EXEC_POLICY_T,
210 typename ORDER_POLICY_T,
211 typename STORAGE_POLICY_T,
212 typename DISPATCH_POLICY_T,
215 typename ALLOCATOR_T>
249 typename workrunner_type::dispatcher_type>;
269 void reserve(
size_t num_loops,
size_t storage_bytes)
271 m_storage.reserve(num_loops, storage_bytes);
274 template<
typename segment_T,
typename loop_T>
275 inline void enqueue(segment_T&& seg, loop_T&& loop_body)
281 if (begin(seg) == end(seg))
return;
283 if (m_storage.begin() == m_storage.end())
286 reserve(m_max_num_loops, m_max_storage_bytes);
290 util::make_context<exec_policy>(std::string())};
296 m_runner.enqueue(m_storage, std::forward<segment_T>(seg), std::move(
body));
301 inline workgroup_type instantiate();
314 storage_type m_storage;
315 size_t m_max_num_loops = 0;
316 size_t m_max_storage_bytes = 0;
318 workrunner_type m_runner;
321 template<
typename EXEC_POLICY_T,
322 typename ORDER_POLICY_T,
323 typename STORAGE_POLICY_T,
324 typename DISPATCH_POLICY_T,
327 typename ALLOCATOR_T>
352 using storage_type =
typename workpool_type::storage_type;
353 using workrunner_type =
typename workpool_type::workrunner_type;
371 auto r = resource_type::get_default();
372 return run(r, std::move(
args)...);
386 storage_type m_storage;
387 workrunner_type m_runner;
389 WorkGroup(storage_type&& storage, workrunner_type&& runner)
390 : m_storage(
std::move(storage)),
391 m_runner(
std::move(runner))
395 template<
typename EXEC_POLICY_T,
396 typename ORDER_POLICY_T,
397 typename STORAGE_POLICY_T,
398 typename DISPATCH_POLICY_T,
401 typename ALLOCATOR_T>
426 using workrunner_type =
typename workgroup_type::workrunner_type;
427 using per_run_storage =
typename workrunner_type::per_run_storage;
452 per_run_storage m_run_storage;
453 resource_type m_resource;
455 explicit WorkSite(resource_type r, per_run_storage&& run_storage)
456 : m_run_storage(
std::move(run_storage)),
461 template<
typename EXEC_POLICY_T,
462 typename ORDER_POLICY_T,
463 typename STORAGE_POLICY_T,
464 typename DISPATCH_POLICY_T,
467 typename ALLOCATOR_T>
468 inline typename WorkPool<WorkGroupPolicy<EXEC_POLICY_T,
474 ALLOCATOR_T>::workgroup_type
475 WorkPool<WorkGroupPolicy<EXEC_POLICY_T,
481 ALLOCATOR_T>::instantiate()
484 m_max_num_loops =
std::max(m_storage.size(), m_max_num_loops);
485 m_max_storage_bytes =
std::max(m_storage.storage_size(), m_max_storage_bytes);
488 return workgroup_type {std::move(m_storage), std::move(m_runner)};
491 template<
typename EXEC_POLICY_T,
492 typename ORDER_POLICY_T,
493 typename STORAGE_POLICY_T,
494 typename DISPATCH_POLICY_T,
497 typename ALLOCATOR_T>
504 ALLOCATOR_T>::worksite_type
518 ALLOCATOR_T>::resource_type r,
522 util::make_context<EXEC_POLICY_T>(std::string())};
526 worksite_type site(r,
527 m_runner.run(m_storage, r, std::forward<Args>(
args)...));
Header file providing RAJA WorkStorage.
Args args
Definition: WorkRunner.hpp:212
RAJA_INLINE void callPreLaunchPlugins(const PluginContext &p)
Definition: plugins.hpp:56
RAJA_INLINE void callPostCapturePlugins(const PluginContext &p)
Definition: plugins.hpp:46
RAJA_INLINE auto trigger_updates_before(T &&item) -> typename std::remove_reference< T >::type
Definition: plugins.hpp:29
RAJA_INLINE void callPostLaunchPlugins(const PluginContext &p)
Definition: plugins.hpp:66
RAJA_INLINE void callPreCapturePlugins(const PluginContext &p)
Definition: plugins.hpp:36
Definition: AlignedRangeIndexSetBuilders.cpp:35
auto & body
Definition: launch.hpp:177
camp::list< Args... > xargs
xargs alias.
Definition: WorkGroup.hpp:63
RAJA_HOST_DEVICE constexpr RAJA_INLINE Result max(Args... args)
Definition: foldl.hpp:155
Definition: ListSegment.hpp:416
Header file providing RAJA WorkStorage.
worksite_type run(resource_type r, Args...)
ORDER_POLICY_T order_policy
Definition: WorkGroup.hpp:337
EXEC_POLICY_T exec_policy
Definition: WorkGroup.hpp:336
WorkGroup(WorkGroup &&)=default
STORAGE_POLICY_T storage_policy
Definition: WorkGroup.hpp:338
WorkGroup(WorkGroup const &)=delete
worksite_type run(Args... args)
Definition: WorkGroup.hpp:369
ALLOCATOR_T Allocator
Definition: WorkGroup.hpp:346
void clear()
Definition: WorkGroup.hpp:375
xargs< Args... > xarg_type
Definition: WorkGroup.hpp:345
DISPATCH_POLICY_T dispatch_policy
Definition: WorkGroup.hpp:339
typename workpool_type::resource_type resource_type
Definition: WorkGroup.hpp:359
INDEX_T index_type
Definition: WorkGroup.hpp:344
~WorkGroup()
Definition: WorkGroup.hpp:383
WorkGroup & operator=(WorkGroup &&)=default
WorkGroup & operator=(WorkGroup const &)=delete
WorkGroup class template. Owns loops from an instantiated WorkPool.
Definition: WorkGroup.hpp:163
STORAGE_POLICY_T storage_policy
Definition: WorkGroup.hpp:226
void reserve(size_t num_loops, size_t storage_bytes)
Definition: WorkGroup.hpp:269
EXEC_POLICY_T exec_policy
Definition: WorkGroup.hpp:224
WorkPool(Allocator const &aloc)
Definition: WorkGroup.hpp:257
size_t num_loops() const
Definition: WorkGroup.hpp:265
typename workrunner_type::resource_type resource_type
Definition: WorkGroup.hpp:255
WorkPool(WorkPool const &)=delete
xargs< Args... > xarg_type
Definition: WorkGroup.hpp:233
ORDER_POLICY_T order_policy
Definition: WorkGroup.hpp:225
WorkPool & operator=(WorkPool &&)=default
WorkPool & operator=(WorkPool const &)=delete
void clear()
Definition: WorkGroup.hpp:303
void enqueue(segment_T &&seg, loop_T &&loop_body)
Definition: WorkGroup.hpp:275
DISPATCH_POLICY_T dispatch_policy
Definition: WorkGroup.hpp:227
INDEX_T index_type
Definition: WorkGroup.hpp:232
WorkPool(WorkPool &&)=default
ALLOCATOR_T Allocator
Definition: WorkGroup.hpp:234
size_t storage_bytes() const
Definition: WorkGroup.hpp:267
~WorkPool()
Definition: WorkGroup.hpp:311
WorkPool class template.
Definition: WorkGroup.hpp:124
void clear()
Definition: WorkGroup.hpp:443
WorkSite(WorkSite &&)=default
ORDER_POLICY_T order_policy
Definition: WorkGroup.hpp:411
resource_type get_resource() const
Definition: WorkGroup.hpp:441
~WorkSite()
Definition: WorkGroup.hpp:449
WorkSite(WorkSite const &)=delete
xargs< Args... > xarg_type
Definition: WorkGroup.hpp:419
STORAGE_POLICY_T storage_policy
Definition: WorkGroup.hpp:412
WorkSite & operator=(WorkSite const &)=delete
ALLOCATOR_T Allocator
Definition: WorkGroup.hpp:420
WorkSite & operator=(WorkSite &&)=default
INDEX_T index_type
Definition: WorkGroup.hpp:418
EXEC_POLICY_T exec_policy
Definition: WorkGroup.hpp:410
DISPATCH_POLICY_T dispatch_policy
Definition: WorkGroup.hpp:413
typename workpool_type::resource_type resource_type
Definition: WorkGroup.hpp:433
WorkSite class template. Owns per run objects from a single run of a WorkGroup.
Definition: WorkGroup.hpp:201
Definition: WorkGroup.hpp:70
static constexpr bool value
Definition: WorkGroup.hpp:71
Definition: PolicyBase.hpp:117
Definition: WorkGroup.hpp:104
Definition: PluginContext.hpp:26