22 #ifndef RAJA_policy_hip_kernel_Tile_HPP
23 #define RAJA_policy_hip_kernel_Tile_HPP
25 #include "RAJA/config.hpp"
27 #if defined(RAJA_ENABLE_HIP)
30 #include <type_traits>
32 #include "camp/camp.hpp"
33 #include "camp/concepts.hpp"
34 #include "camp/tuple.hpp"
52 template<
typename Data,
53 camp::idx_t ArgumentId,
54 camp::idx_t chunk_size,
57 typename... EnclosedStmts,
59 struct HipStatementExecutor<
63 RAJA::tile_fixed<chunk_size>,
65 hip_indexer<iteration_mapping::DirectUnchecked, sync, IndexMapper>,
72 using enclosed_stmts_t = HipStatementListExecutor<Data, stmt_list_t, Types>;
74 using diff_t = segment_diff_type<ArgumentId, Data>;
76 using DimensionCalculator = KernelDimensionCalculator<
78 hip_indexer<iteration_mapping::DirectUnchecked, sync, IndexMapper>>;
80 static inline RAJA_DEVICE void exec(Data& data,
bool thread_active)
83 auto& segment = camp::get<ArgumentId>(data.segment_tuple);
85 using segment_t = camp::decay<decltype(segment)>;
89 IndexMapper::template index<diff_t>() *
static_cast<diff_t
>(chunk_size);
92 segment_t orig_segment = segment;
95 segment = orig_segment.slice(i,
static_cast<diff_t
>(chunk_size));
98 enclosed_stmts_t::exec(data, thread_active);
101 segment = orig_segment;
104 static inline LaunchDims calculateDimensions(Data
const& data)
107 const diff_t full_len = segment_length<ArgumentId>(data);
111 LaunchDims dims = DimensionCalculator::get_dimensions(len);
114 using data_t = camp::decay<Data>;
115 data_t private_data = data;
118 auto& segment = camp::get<ArgumentId>(private_data.segment_tuple);
121 segment = segment.slice(0,
static_cast<diff_t
>(chunk_size));
126 LaunchDims enclosed_dims =
127 enclosed_stmts_t::calculateDimensions(private_data);
129 return combine(dims, enclosed_dims);
138 template<
typename Data,
139 camp::idx_t ArgumentId,
140 camp::idx_t chunk_size,
141 typename IndexMapper,
143 typename... EnclosedStmts,
145 struct HipStatementExecutor<
147 statement::Tile<ArgumentId,
148 RAJA::tile_fixed<chunk_size>,
149 RAJA::policy::hip::hip_indexer<iteration_mapping::Direct,
158 using enclosed_stmts_t = HipStatementListExecutor<Data, stmt_list_t, Types>;
160 using diff_t = segment_diff_type<ArgumentId, Data>;
162 using DimensionCalculator = KernelDimensionCalculator<
164 hip_indexer<iteration_mapping::Direct, sync, IndexMapper>>;
166 static inline RAJA_DEVICE void exec(Data& data,
bool thread_active)
169 auto& segment = camp::get<ArgumentId>(data.segment_tuple);
171 using segment_t = camp::decay<decltype(segment)>;
174 const diff_t len = segment.end() - segment.begin();
176 IndexMapper::template index<diff_t>() *
static_cast<diff_t
>(chunk_size);
180 const bool have_work = (i < len);
183 segment_t orig_segment = segment;
186 segment = orig_segment.slice(i,
static_cast<diff_t
>(chunk_size));
189 enclosed_stmts_t::exec(data, thread_active && have_work);
192 segment = orig_segment;
195 static inline LaunchDims calculateDimensions(Data
const& data)
198 const diff_t full_len = segment_length<ArgumentId>(data);
202 LaunchDims dims = DimensionCalculator::get_dimensions(len);
205 using data_t = camp::decay<Data>;
206 data_t private_data = data;
209 auto& segment = camp::get<ArgumentId>(private_data.segment_tuple);
212 segment = segment.slice(0,
static_cast<diff_t
>(chunk_size));
214 LaunchDims enclosed_dims =
215 enclosed_stmts_t::calculateDimensions(private_data);
217 return combine(dims, enclosed_dims);
226 template<
typename Data,
227 camp::idx_t ArgumentId,
228 camp::idx_t chunk_size,
229 typename IndexMapper,
230 typename... EnclosedStmts,
232 struct HipStatementExecutor<
236 RAJA::tile_fixed<chunk_size>,
237 RAJA::policy::hip::hip_indexer<
238 iteration_mapping::StridedLoop<named_usage::unspecified>,
239 kernel_sync_requirement::sync,
247 using enclosed_stmts_t = HipStatementListExecutor<Data, stmt_list_t, Types>;
249 using diff_t = segment_diff_type<ArgumentId, Data>;
251 using DimensionCalculator =
252 KernelDimensionCalculator<RAJA::policy::hip::hip_indexer<
253 iteration_mapping::StridedLoop<named_usage::unspecified>,
257 static inline RAJA_DEVICE void exec(Data& data,
bool thread_active)
260 auto& segment = camp::get<ArgumentId>(data.segment_tuple);
263 using segment_t = camp::decay<decltype(segment)>;
264 segment_t orig_segment = segment;
267 const diff_t len = segment.end() - segment.begin();
268 const diff_t i_init =
269 IndexMapper::template index<diff_t>() *
static_cast<diff_t
>(chunk_size);
270 const diff_t i_stride =
271 IndexMapper::template size<diff_t>() *
static_cast<diff_t
>(chunk_size);
275 for (diff_t ii = 0; ii < len; ii += i_stride)
277 const diff_t i = ii + i_init;
281 const bool have_work = (i < len);
284 segment = orig_segment.slice(i,
static_cast<diff_t
>(chunk_size));
287 enclosed_stmts_t::exec(data, thread_active && have_work);
291 segment = orig_segment;
294 static inline LaunchDims calculateDimensions(Data
const& data)
297 const diff_t full_len = segment_length<ArgumentId>(data);
301 LaunchDims dims = DimensionCalculator::get_dimensions(len);
304 using data_t = camp::decay<Data>;
305 data_t private_data = data;
308 auto& segment = camp::get<ArgumentId>(private_data.segment_tuple);
311 segment = segment.slice(0, chunk_size);
313 LaunchDims enclosed_dims =
314 enclosed_stmts_t::calculateDimensions(private_data);
316 return combine(dims, enclosed_dims);
325 template<
typename Data,
326 camp::idx_t ArgumentId,
327 camp::idx_t chunk_size,
328 typename IndexMapper,
329 typename... EnclosedStmts,
331 struct HipStatementExecutor<
335 RAJA::tile_fixed<chunk_size>,
336 RAJA::policy::hip::hip_indexer<
337 iteration_mapping::StridedLoop<named_usage::unspecified>,
338 kernel_sync_requirement::none,
346 using enclosed_stmts_t = HipStatementListExecutor<Data, stmt_list_t, Types>;
348 using diff_t = segment_diff_type<ArgumentId, Data>;
350 using DimensionCalculator =
351 KernelDimensionCalculator<RAJA::policy::hip::hip_indexer<
352 iteration_mapping::StridedLoop<named_usage::unspecified>,
356 static inline RAJA_DEVICE void exec(Data& data,
bool thread_active)
359 auto& segment = camp::get<ArgumentId>(data.segment_tuple);
362 using segment_t = camp::decay<decltype(segment)>;
363 segment_t orig_segment = segment;
366 const diff_t len = segment.end() - segment.begin();
367 const diff_t i_init =
368 IndexMapper::template index<diff_t>() *
static_cast<diff_t
>(chunk_size);
369 const diff_t i_stride =
370 IndexMapper::template size<diff_t>() *
static_cast<diff_t
>(chunk_size);
374 for (diff_t i = i_init; i < len; i += i_stride)
378 segment = orig_segment.slice(i,
static_cast<diff_t
>(chunk_size));
381 enclosed_stmts_t::exec(data, thread_active);
385 segment = orig_segment;
388 static inline LaunchDims calculateDimensions(Data
const& data)
391 const diff_t full_len = segment_length<ArgumentId>(data);
395 LaunchDims dims = DimensionCalculator::get_dimensions(len);
398 using data_t = camp::decay<Data>;
399 data_t private_data = data;
402 auto& segment = camp::get<ArgumentId>(private_data.segment_tuple);
405 segment = segment.slice(0, chunk_size);
407 LaunchDims enclosed_dims =
408 enclosed_stmts_t::calculateDimensions(private_data);
410 return combine(dims, enclosed_dims);
419 template<
typename Data,
420 camp::idx_t ArgumentId,
422 typename... EnclosedStmts,
424 struct HipStatementExecutor<
426 statement::Tile<ArgumentId, TPol, seq_exec, EnclosedStmts...>,
428 : HipStatementExecutor<
433 RAJA::policy::hip::hip_indexer<
434 iteration_mapping::StridedLoop<named_usage::unspecified>,
435 kernel_sync_requirement::none,
436 hip::IndexGlobal<named_dim::x,
437 named_usage::ignored,
438 named_usage::ignored>>,
Header file for common RAJA internal macro definitions.
#define RAJA_DIVIDE_CEILING_INT(dividend, divisor)
Definition: macros.hpp:122
#define RAJA_DEVICE
Definition: macros.hpp:66
camp::list< Stmts... > StatementList
Definition: StatementList.hpp:41
Definition: AlignedRangeIndexSetBuilders.cpp:35
kernel_sync_requirement
Definition: types.hpp:63
Header file for tile wrapper and iterator.
Header file for loop kernel internals.
Header file for RAJA type definitions.