20 #ifndef RAJA_pattern_kernel_Lambda_HPP
21 #define RAJA_pattern_kernel_Lambda_HPP
23 #include "RAJA/config.hpp"
26 #include <type_traits>
28 #include "camp/camp.hpp"
29 #include "camp/concepts.hpp"
30 #include "camp/tuple.hpp"
58 template<
typename T, camp::
idx_t V>
61 static constexpr camp::idx_t
value = V;
70 template<camp::idx_t...
args>
72 camp::list<internal::LambdaArg<internal::lambda_arg_seg_t, args>...>;
84 template<camp::idx_t...
args>
86 camp::list<internal::LambdaArg<internal::lambda_arg_offset_t, args>...>;
93 template<camp::idx_t...
args>
95 camp::list<internal::LambdaArg<internal::lambda_arg_param_t, args>...>;
110 template<
typename T, camp::idx_t... values>
112 camp::list<internal::LambdaArg<internal::lambda_arg_value_t<T>, values>...>;
126 template<camp::idx_t BodyIdx,
typename... Args>
147 template<
typename SegmentType, camp::
idx_t
id>
152 !std::is_same<SegmentType, void>::value,
153 "Segment not assigned, but used in Lambda with Segs<> argument");
155 template<
typename Data>
158 return SegmentType(camp::get<id>(data.segment_tuple)
159 .begin()[camp::get<id>(data.offset_tuple)]);
172 template<
typename OffsetType, camp::
idx_t
id>
177 !std::is_same<OffsetType, void>::value,
178 "Segment not assigned, but used in Lambda with Offsets<> argument");
180 template<
typename Data>
183 return OffsetType(camp::get<id>(data.offset_tuple));
195 template<
typename Types,
typename T>
198 template<
typename Types, camp::
idx_t
id>
202 using OffsetType = camp::at_v<typename Types::offset_types_t, id>;
205 !std::is_same<OffsetType, void>::value,
206 "Offset not assigned, but used in Lambda with Offsets<> argument");
208 template<
typename Data>
212 std::forward<Data>(data));
216 template<
typename Types, camp::
idx_t
id>
220 using SegmentType = camp::at_v<typename Types::segment_types_t, id>;
223 !std::is_same<SegmentType, void>::value,
224 "Segment not assigned, but used in Lambda with Segs<> argument");
226 template<
typename Data>
230 std::forward<Data>(data));
234 template<
typename Types, camp::
idx_t
id>
237 template<
typename Data>
239 -> std::add_lvalue_reference_t<
240 camp::tuple_element_t<id, typename camp::decay<Data>::arg_tuple_t>>
246 template<
typename Types,
typename T, camp::
idx_t value>
249 template<
typename Data>
257 template<camp::idx_t LoopIndex,
260 typename... targLists>
263 camp::list<targLists...>
const&)
265 camp::get<LoopIndex>(data.bodies)(
273 template<camp::idx_t LambdaIndex,
typename... Args,
typename Types>
277 template<
typename Data>
282 using targList =
typename camp::flatten<camp::list<Args...>>::type;
284 invoke_lambda_with_args<LambdaIndex, Types>(std::forward<Data>(data),
289 template<camp::idx_t LambdaIndex,
293 camp::idx_t... PARAMS>
295 camp::idx_seq<SEGS...>
const&,
296 camp::idx_seq<PARAMS...>
const&)
299 using AllSegs =
Segs<SEGS...>;
300 using AllParams =
Params<PARAMS...>;
304 Types>::exec(std::forward<Data>(data));
307 template<camp::
idx_t LambdaIndex,
typename Types>
311 template<
typename Data>
315 using Data_t = camp::decay<Data>;
316 using offset_tuple_t =
typename Data_t::offset_tuple_t;
317 using param_tuple_t =
typename Data_t::param_tuple_t;
319 invoke_lambda<LambdaIndex, Types>(
320 std::forward<Data>(data),
321 camp::make_idx_seq_t<camp::tuple_size<offset_tuple_t>::value> {},
322 camp::make_idx_seq_t<camp::tuple_size<param_tuple_t>::value> {});
Header file for common RAJA internal macro definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
#define RAJA_SUPPRESS_HD_WARN
Definition: macros.hpp:68
Args args
Definition: WorkRunner.hpp:212
RAJA_HOST_DEVICE std::enable_if_t< std::is_base_of< ParamBase, T >::value, std::add_lvalue_reference_t< typename T::ARG_T > > get_lambda_arg(T &Param)
Definition: params_base.hpp:314
RAJA_INLINE RAJA_HOST_DEVICE void invoke_lambda(Data &&data, camp::idx_seq< SEGS... > const &, camp::idx_seq< PARAMS... > const &)
Definition: Lambda.hpp:294
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE void invoke_lambda_with_args(Data &&data, camp::list< targLists... > const &)
Definition: Lambda.hpp:261
Definition: AlignedRangeIndexSetBuilders.cpp:35
camp::list< internal::LambdaArg< internal::lambda_arg_value_t< T >, values >... > ValuesT
Definition: Lambda.hpp:112
camp::list< internal::LambdaArg< internal::lambda_arg_param_t, args >... > Params
Definition: Lambda.hpp:95
camp::list< internal::LambdaArg< internal::lambda_arg_offset_t, args >... > Offsets
Definition: Lambda.hpp:86
camp::list< internal::LambdaArg< internal::lambda_arg_seg_t, args >... > Segs
Definition: Lambda.hpp:72
Header file for loop kernel internals.
RAJA_HOST_DEVICE constexpr static RAJA_INLINE OffsetType extract(Data &&data)
Definition: Lambda.hpp:209
camp::at_v< typename Types::offset_types_t, id > OffsetType
Definition: Lambda.hpp:202
RAJA_HOST_DEVICE constexpr static RAJA_INLINE auto extract(Data &&data) -> std::add_lvalue_reference_t< camp::tuple_element_t< id, typename camp::decay< Data >::arg_tuple_t >>
Definition: Lambda.hpp:238
RAJA_HOST_DEVICE constexpr static RAJA_INLINE SegmentType extract(Data &&data)
Definition: Lambda.hpp:227
camp::at_v< typename Types::segment_types_t, id > SegmentType
Definition: Lambda.hpp:220
RAJA_HOST_DEVICE constexpr static RAJA_INLINE T extract(Data &&)
Definition: Lambda.hpp:250
Definition: Lambda.hpp:196
Definition: Lambda.hpp:60
static constexpr camp::idx_t value
Definition: Lambda.hpp:61
static RAJA_INLINE RAJA_HOST_DEVICE void exec(Data &&data)
Definition: Lambda.hpp:278
static RAJA_INLINE RAJA_HOST_DEVICE void exec(Data &&data)
Definition: Lambda.hpp:312
Definition: Statement.hpp:48
Definition: Statement.hpp:35
Definition: Lambda.hpp:50
Definition: Lambda.hpp:47
Definition: Lambda.hpp:44
Definition: Lambda.hpp:54
T type
Definition: Lambda.hpp:55
Definition: Lambda.hpp:128
static const camp::idx_t loop_body_index
Definition: Lambda.hpp:129
Header file for RAJA type definitions.