RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
Collapse.hpp
Go to the documentation of this file.
1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
2 // Copyright (c) Lawrence Livermore National Security, LLC and other
3 // RAJA Project Developers. See top-level LICENSE and COPYRIGHT
4 // files for dates and other details. No copyright assignment is required
5 // to contribute to RAJA.
6 //
7 // SPDX-License-Identifier: (BSD-3-Clause)
8 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
9 
10 #ifndef RAJA_policy_openmp_target_kernel_Collapse_HPP
11 #define RAJA_policy_openmp_target_kernel_Collapse_HPP
12 
14 
15 namespace RAJA
16 {
17 namespace internal
18 {
19 
20 template<camp::idx_t Arg0,
21  camp::idx_t Arg1,
22  typename... EnclosedStmts,
23  typename Types>
24 struct StatementExecutor<statement::Collapse<omp_target_parallel_collapse_exec,
25  ArgList<Arg0, Arg1>,
26  EnclosedStmts...>,
27  Types>
28 {
29  template<typename Data>
30  static RAJA_INLINE void exec(Data&& data)
31  {
32  auto l0 = segment_length<Arg0>(data);
33  auto l1 = segment_length<Arg1>(data);
34 
35  // Set the argument types for this loop
38 
40  auto privatizer = thread_privatize(data);
41 #pragma omp target teams distribute parallel for schedule(static, 1) \
42  firstprivate(privatizer) collapse(2)
43  for (auto i0 = (decltype(l0))0; i0 < l0; ++i0)
44  {
45  for (auto i1 = (decltype(l1))0; i1 < l1; ++i1)
46  {
47  auto& private_data = privatizer.get_priv();
48  private_data.template assign_offset<Arg0>(i0);
49  private_data.template assign_offset<Arg1>(i1);
50  execute_statement_list<camp::list<EnclosedStmts...>, NewTypes1>(
51  private_data);
52  }
53  }
54  }
55 };
56 
57 template<camp::idx_t Arg0,
58  camp::idx_t Arg1,
59  camp::idx_t Arg2,
60  typename... EnclosedStmts,
61  typename Types>
62 struct StatementExecutor<statement::Collapse<omp_target_parallel_collapse_exec,
63  ArgList<Arg0, Arg1, Arg2>,
64  EnclosedStmts...>,
65  Types>
66 {
67  template<typename Data>
68  static RAJA_INLINE void exec(Data&& data)
69  {
70  auto l0 = segment_length<Arg0>(data);
71  auto l1 = segment_length<Arg1>(data);
72  auto l2 = segment_length<Arg2>(data);
73 
74  // Set the argument types for this loop
78 
80  auto privatizer = thread_privatize(data);
81 #pragma omp target teams distribute parallel for schedule(static, 1) \
82  firstprivate(privatizer) collapse(3)
83  for (auto i0 = (decltype(l0))0; i0 < l0; ++i0)
84  {
85  for (auto i1 = (decltype(l1))0; i1 < l1; ++i1)
86  {
87  for (auto i2 = (decltype(l2))0; i2 < l2; ++i2)
88  {
89  auto& private_data = privatizer.get_priv();
90  private_data.template assign_offset<Arg0>(i0);
91  private_data.template assign_offset<Arg1>(i1);
92  private_data.template assign_offset<Arg2>(i2);
93  execute_statement_list<camp::list<EnclosedStmts...>, NewTypes2>(
94  private_data);
95  }
96  }
97  }
98  }
99 };
100 
101 template<camp::idx_t Arg0,
102  camp::idx_t Arg1,
103  camp::idx_t Arg2,
104  camp::idx_t Arg3,
105  typename... EnclosedStmts,
106  typename Types>
107 struct StatementExecutor<statement::Collapse<omp_target_parallel_collapse_exec,
108  ArgList<Arg0, Arg1, Arg2, Arg3>,
109  EnclosedStmts...>,
110  Types>
111 {
112  template<typename Data>
113  static RAJA_INLINE void exec(Data&& data)
114  {
115  auto l0 = segment_length<Arg0>(data);
116  auto l1 = segment_length<Arg1>(data);
117  auto l2 = segment_length<Arg2>(data);
118  auto l3 = segment_length<Arg3>(data);
119 
120  // Set the argument types for this loop
125 
127  auto privatizer = thread_privatize(data);
128 #pragma omp target teams distribute parallel for schedule(static, 1) \
129  firstprivate(privatizer) collapse(4)
130  for (auto i0 = (decltype(l0))0; i0 < l0; ++i0)
131  {
132  for (auto i1 = (decltype(l1))0; i1 < l1; ++i1)
133  {
134  for (auto i2 = (decltype(l2))0; i2 < l2; ++i2)
135  {
136  for (auto i3 = (decltype(l3))0; i3 < l3; ++i3)
137  {
138  auto& private_data = privatizer.get_priv();
139  private_data.template assign_offset<Arg0>(i0);
140  private_data.template assign_offset<Arg1>(i1);
141  private_data.template assign_offset<Arg2>(i2);
142  private_data.template assign_offset<Arg3>(i2);
143  execute_statement_list<camp::list<EnclosedStmts...>, NewTypes3>(
144  private_data);
145  }
146  }
147  }
148  }
149  }
150 };
151 
152 } // namespace internal
153 } // namespace RAJA
154 
155 #endif // RAJA_policy_openmp_target_kernel_Collapse_HPP
setSegmentType< Types, Segment, camp::at_v< typename camp::decay< Data >::index_types_t, Segment > > setSegmentTypeFromData
Definition: LoopTypes.hpp:95
RAJA_HOST_DEVICE auto thread_privatize(const T &item) -> Privatizer< T >
Create a private copy of the argument to be stored on the current thread's stack in a class of the Pr...
Definition: privatizer.hpp:88
RAJA_INLINE void execute_statement_list(Data &&data)
Definition: StatementList.hpp:84
Definition: AlignedRangeIndexSetBuilders.cpp:35
auto privatizer
Definition: launch.hpp:176
Header file for loop kernel internals.
Definition: Statement.hpp:48