RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
kernel.hpp
Go to the documentation of this file.
1 
11 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
12 // Copyright (c) Lawrence Livermore National Security, LLC and other
13 // RAJA Project Developers. See top-level LICENSE and COPYRIGHT
14 // files for dates and other details. No copyright assignment is required
15 // to contribute to RAJA.
16 //
17 // SPDX-License-Identifier: (BSD-3-Clause)
18 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
19 
20 #ifndef RAJA_pattern_kernel_HPP
21 #define RAJA_pattern_kernel_HPP
22 
23 #include "RAJA/config.hpp"
24 
26 #include "RAJA/util/plugins.hpp"
27 
28 #include "camp/camp.hpp"
29 #include "camp/concepts.hpp"
30 #include "camp/tuple.hpp"
31 
32 #include "RAJA/util/macros.hpp"
33 #include "RAJA/util/types.hpp"
34 
36 
37 namespace RAJA
38 {
39 
45 template<typename... Stmts>
47 
48 
52 template<camp::idx_t... ArgumentId>
53 using ArgList = camp::idx_seq<ArgumentId...>;
54 
55 
56 template<typename T>
58 
59 template<typename... Ts>
60 struct IterableWrapperTuple<camp::tuple<Ts...>>
61 {
62 
63  using type = camp::tuple<RAJA::Span<typename camp::decay<Ts>::iterator,
64  typename camp::decay<Ts>::IndexType>...>;
65 };
66 
67 namespace internal
68 {
69 template<class Tuple, camp::idx_t... I>
70 RAJA_INLINE constexpr auto make_wrapped_tuple_impl(Tuple&& t,
71  camp::idx_seq<I...>)
72  -> camp::tuple<RAJA::Span<
73  typename camp::decay<
74  camp::tuple_element_t<I, camp::decay<Tuple>>>::iterator,
75  typename camp::decay<
76  camp::tuple_element_t<I, camp::decay<Tuple>>>::IndexType>...>
77 {
78  return camp::make_tuple(
79  RAJA::Span<typename camp::decay<
80  camp::tuple_element_t<I, camp::decay<Tuple>>>::iterator,
81  typename camp::decay<
82  camp::tuple_element_t<I, camp::decay<Tuple>>>::IndexType> {
83  camp::get<I>(std::forward<Tuple>(t)).begin(),
84  camp::get<I>(std::forward<Tuple>(t)).end()}...);
85 }
86 } // namespace internal
87 
88 template<class Tuple>
89 RAJA_INLINE constexpr auto make_wrapped_tuple(Tuple&& t)
91  std::forward<Tuple>(t),
92  camp::make_idx_seq_t<camp::tuple_size<camp::decay<Tuple>>::value> {}))
93 {
95  std::forward<Tuple>(t),
96  camp::make_idx_seq_t<camp::tuple_size<camp::decay<Tuple>>::value> {});
97 }
98 
99 template<typename PolicyType,
100  typename SegmentTuple,
101  typename ParamTuple,
102  typename Resource,
103  typename... Bodies>
104 RAJA_INLINE resources::EventProxy<Resource> kernel_param_resource(
105  SegmentTuple&& segments,
106  ParamTuple&& params,
107  Resource resource,
108  Bodies&&... bodies)
109 {
110  util::PluginContext context {util::make_context<PolicyType>(std::string())};
111 
112  // TODO: test that all policy members model the Executor policy concept
113  // TODO: add a static_assert for functors which cannot be invoked with
114  // index_tuple
115  // TODO: add assert that all Lambda<i> match supplied loop bodies
116 
117  using segment_tuple_t =
119 
120 
121  using param_tuple_t = camp::decay<ParamTuple>;
122 
123  using loop_data_t = internal::LoopData<segment_tuple_t, param_tuple_t,
124  Resource, camp::decay<Bodies>...>;
125 
126 
128 
129  // Create the LoopData object, which contains our policy object,
130  // our segments, loop bodies, and the tuple of loop indices
131  // it is passed through all of the kernel mechanics by-referenece,
132  // and only copied to provide thread-private instances.
133  loop_data_t loop_data(
134  make_wrapped_tuple(std::forward<SegmentTuple>(segments)),
135  std::forward<ParamTuple>(params), resource,
136  std::forward<Bodies>(bodies)...);
137 
139 
140  using loop_types_t = internal::makeInitialLoopTypes<loop_data_t>;
141 
143  RAJA::expt::detail::init_params<seq_exec>(loop_data.param_tuple);
144  // Execute!
145  RAJA_FORCEINLINE_RECURSIVE
146  internal::execute_statement_list<PolicyType, loop_types_t>(loop_data);
147  // There isn't another good place to resolve sequential parameters, so
148  // complete resolution here. This simply calls combineTarget() a second time
149  // for non-sequential backends (eg HIP, CUDA), which does not represent a
150  // significant overhead.
151  RAJA::expt::detail::resolve_params<seq_exec>(loop_data.param_tuple);
153 
154  return resources::EventProxy<Resource>(resource);
155 }
156 
157 template<typename PolicyType,
158  typename SegmentTuple,
159  typename Resource,
160  typename... Bodies>
161 RAJA_INLINE resources::EventProxy<Resource> kernel_resource(
162  SegmentTuple&& segments,
163  Resource resource,
164  Bodies&&... bodies)
165 {
166  return RAJA::kernel_param_resource<PolicyType>(
167  std::forward<SegmentTuple>(segments), RAJA::make_tuple(), resource,
168  std::forward<Bodies>(bodies)...);
169 }
170 
171 template<typename PolicyType,
172  typename SegmentTuple,
173  typename ParamTuple,
174  typename... Bodies>
175 RAJA_INLINE resources::EventProxy<resources::resource_from_pol_t<PolicyType>>
176 kernel_param(SegmentTuple&& segments, ParamTuple&& params, Bodies&&... bodies)
177 {
178  auto res = resources::get_default_resource<PolicyType>();
179  return RAJA::kernel_param_resource<PolicyType>(
180  std::forward<SegmentTuple>(segments), std::forward<ParamTuple>(params),
181  res, std::forward<Bodies>(bodies)...);
182 }
183 
184 template<typename PolicyType, typename SegmentTuple, typename... Bodies>
185 RAJA_INLINE resources::EventProxy<resources::resource_from_pol_t<PolicyType>>
186 kernel(SegmentTuple&& segments, Bodies&&... bodies)
187 {
188  auto res = resources::get_default_resource<PolicyType>();
189  return RAJA::kernel_param_resource<PolicyType>(
190  std::forward<SegmentTuple>(segments), RAJA::make_tuple(), res,
191  std::forward<Bodies>(bodies)...);
192 }
193 
194 
195 } // end namespace RAJA
196 
210 
211 #endif /* RAJA_pattern_kernel_HPP */
Header file for kernel conditional templates.
Header file for parallel region in kernel.
Header file containing type traits needed by kernel implementation.
Header file for common RAJA internal macro definitions.
camp::list< Stmts... > StatementList
Definition: StatementList.hpp:41
constexpr RAJA_INLINE auto make_wrapped_tuple_impl(Tuple &&t, camp::idx_seq< I... >) -> camp::tuple< RAJA::Span< typename camp::decay< camp::tuple_element_t< I, camp::decay< Tuple >>>::iterator, typename camp::decay< camp::tuple_element_t< I, camp::decay< Tuple >>>::IndexType >... >
Definition: kernel.hpp:70
RAJA_INLINE void callPreLaunchPlugins(const PluginContext &p)
Definition: plugins.hpp:56
RAJA_INLINE void callPostCapturePlugins(const PluginContext &p)
Definition: plugins.hpp:46
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
RAJA_INLINE resources::EventProxy< Resource > kernel_param_resource(SegmentTuple &&segments, ParamTuple &&params, Resource resource, Bodies &&... bodies)
Definition: kernel.hpp:104
camp::idx_seq< ArgumentId... > ArgList
Definition: kernel.hpp:53
RAJA_INLINE resources::EventProxy< resources::resource_from_pol_t< PolicyType > > kernel(SegmentTuple &&segments, Bodies &&... bodies)
Definition: kernel.hpp:186
RAJA_INLINE resources::EventProxy< resources::resource_from_pol_t< PolicyType > > kernel_param(SegmentTuple &&segments, ParamTuple &&params, Bodies &&... bodies)
Definition: kernel.hpp:176
RAJA_INLINE resources::EventProxy< Resource > kernel_resource(SegmentTuple &&segments, Resource resource, Bodies &&... bodies)
Definition: kernel.hpp:161
constexpr RAJA_INLINE auto make_wrapped_tuple(Tuple &&t) -> decltype(internal::make_wrapped_tuple_impl(std::forward< Tuple >(t), camp::make_idx_seq_t< camp::tuple_size< camp::decay< Tuple >>::value > {}))
Definition: kernel.hpp:89
internal::StatementList< Stmts... > KernelPolicy
Definition: kernel.hpp:46
Header file for kernel statement collapse struct.
Header file for kernel conditional templates.
Header file for statement wrappers and executors.
Header file for statement wrappers and executors.
Header file for hyperplane patern executor.
Header file for shared memory window.
Header file for kernel lambda executor.
Header file for statement wrappers and executors.
Header file for tile wrapper and iterator.
Header file for tile wrapper and iterator.
Header file for loop kernel internals.
camp::tuple< RAJA::Span< typename camp::decay< Ts >::iterator, typename camp::decay< Ts >::IndexType >... > type
Definition: kernel.hpp:64
Definition: kernel.hpp:57
A view to a sequence of objects.
Definition: Span.hpp:62
constexpr RAJA_HOST_DEVICE RAJA_INLINE iterator begin()
Definition: Span.hpp:87
Definition: LoopData.hpp:110
Definition: LoopTypes.hpp:34
Definition: PluginContext.hpp:26
Header file for RAJA type definitions.