RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
LoopTypes.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_internal_LoopTypes_HPP
21 #define RAJA_pattern_kernel_internal_LoopTypes_HPP
22 
23 #include "RAJA/config.hpp"
25 #include "camp/camp.hpp"
26 
27 namespace RAJA
28 {
29 namespace internal
30 {
31 
32 
33 template<typename SegmentTypes, typename OffsetTypes>
34 struct LoopTypes;
35 
36 template<typename... SegmentTypes, typename... OffsetTypes>
37 struct LoopTypes<camp::list<SegmentTypes...>, camp::list<OffsetTypes...>>
38 {
39 
40  using Self =
41  LoopTypes<camp::list<SegmentTypes...>, camp::list<OffsetTypes...>>;
42 
43  static constexpr size_t s_num_segments = sizeof...(SegmentTypes);
44 
45  // This ensures that you don't double-loop over a segment within the same
46  // loop nesting
47  static_assert(s_num_segments == sizeof...(OffsetTypes),
48  "Number of segments and offsets must match");
49 
50  using segment_types_t = camp::list<SegmentTypes...>;
51  using offset_types_t = camp::list<OffsetTypes...>;
52 };
53 
54 template<typename Data>
58 
59 
60 template<typename Types, camp::idx_t Segment, typename T, typename Seq>
62 
63 template<typename Types, camp::idx_t Segment, typename T, camp::idx_t... SEQ>
64 struct SetSegmentTypeHelper<Types, Segment, T, camp::idx_seq<SEQ...>>
65 {
66  using segment_list = typename Types::segment_types_t;
67  using offset_list = typename Types::offset_types_t;
68 
69  static_assert(std::is_same<camp::at_v<segment_list, Segment>, void>::value,
70  "Segment was already assigned: Probably looping over same "
71  "segment in loop nest");
72 
73  using type = LoopTypes<
74  camp::list<
75  typename std::conditional<SEQ == Segment,
76  T,
77  camp::at_v<segment_list, SEQ>>::type...>,
78  camp::list<
79  typename std::conditional<SEQ == Segment,
80  T,
81  camp::at_v<segment_list, SEQ>>::type...>>;
82 };
83 
84 template<typename Types, camp::idx_t Segment, typename T>
86  Types,
87  Segment,
88  T,
89  camp::make_idx_seq_t<Types::s_num_segments>>::type;
90 
91 template<typename Types, camp::idx_t Segment, typename Data>
93  Types,
94  Segment,
95  camp::at_v<typename camp::decay<Data>::index_types_t, Segment>>;
96 
97 
98 } // end namespace internal
99 } // end namespace RAJA
100 
101 
102 #endif /* RAJA_pattern_kernel_internal_LoopTypes_HPP */
Header file for loop kernel internals and helper functions.
setSegmentType< Types, Segment, camp::at_v< typename camp::decay< Data >::index_types_t, Segment > > setSegmentTypeFromData
Definition: LoopTypes.hpp:95
typename SetSegmentTypeHelper< Types, Segment, T, camp::make_idx_seq_t< Types::s_num_segments > >::type setSegmentType
Definition: LoopTypes.hpp:89
typename detail::ListOfNHelper< T, camp::make_idx_seq_t< N > >::type list_of_n
Definition: Template.hpp:69
Definition: AlignedRangeIndexSetBuilders.cpp:35
camp::list< SegmentTypes... > segment_types_t
Definition: LoopTypes.hpp:50
camp::list< OffsetTypes... > offset_types_t
Definition: LoopTypes.hpp:51
Definition: LoopTypes.hpp:34
typename Types::segment_types_t segment_list
Definition: LoopTypes.hpp:66
typename Types::offset_types_t offset_list
Definition: LoopTypes.hpp:67
Definition: LoopTypes.hpp:61