alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
MakeIter.hpp
Go to the documentation of this file.
1/* Copyright 2024 Andrea Bocci, René Widera
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
7#include "alpaka/Vec.hpp"
10#include "alpaka/mem/trait.hpp"
13
14namespace alpaka::onAcc::internal
15{
16 namespace trait
17 {
18 template<typename T>
19 struct IsIdxMapping : std::false_type
20 {
21 };
22
23 template<>
24 struct IsIdxMapping<layout::Strided> : std::true_type
25 {
26 };
27
28 template<>
29 struct IsIdxMapping<layout::Optimized> : std::true_type
30 {
31 };
32
33 template<>
34 struct IsIdxMapping<layout::Contiguous> : std::true_type
35 {
36 };
37
38 template<typename T>
39 constexpr bool isIdxMapping_v = IsIdxMapping<T>::value;
40
41 template<typename T>
42 struct IsIdxTraversing : std::false_type
43 {
44 };
45
46 template<>
47 struct IsIdxTraversing<traverse::Flat> : std::true_type
48 {
49 };
50
51 template<>
52 struct IsIdxTraversing<traverse::Tiled> : std::true_type
53 {
54 };
55
56 template<typename T>
57 constexpr bool isIdxTraversing_v = IsIdxTraversing<T>::value;
58
59 } // namespace trait
60
61 struct MakeIter
62 {
63 /* create iterator
64 *
65 * ALPAKA_FN_HOST_ACC is required for cuda else __host__ function called from __host__ __device__
66 * warning is popping up and generated code is wrong.
67 */
68 template<
69 typename T_ScalarIdxType,
70 typename T_Acc,
71 typename T_DomainSpec,
72 typename T_Traverse,
73 typename T_IdxMapping>
74 struct Op
75 {
76 ALPAKA_FN_HOST_ACC constexpr auto operator()(
77 T_Acc const& acc,
78 T_DomainSpec const& domainSpec,
79 [[maybe_unused]] T_Traverse traverse,
80 T_IdxMapping idxMapping) const requires std::is_same_v<ALPAKA_TYPEOF(idxMapping), layout::Optimized>
81 {
82 auto adjIdxMapping = adjustMapping(acc);
83 auto const idxRange = domainSpec.getIdxRange(acc);
84 auto const threadSpace = domainSpec.getThreadSpace(acc);
85
86 using IdxType = std::conditional_t<
87 std::is_same_v<void, T_ScalarIdxType>,
88 typename ALPAKA_TYPEOF(idxRange)::IdxType,
89 T_ScalarIdxType>;
90 return T_Traverse::make(
91 pCast<IdxType>(idxRange),
92 pCast<IdxType>(threadSpace),
93 adjIdxMapping,
95 typename ALPAKA_TYPEOF(idxRange.distance())::type,
96 ALPAKA_TYPEOF(idxRange.distance())::dim()>());
97 }
98
99 ALPAKA_FN_HOST_ACC constexpr auto operator()(
100 T_Acc const& acc,
101 T_DomainSpec const& domainSpec,
102 [[maybe_unused]] T_Traverse traverse,
103 T_IdxMapping idxMapping) const
104 {
105 auto const idxRange = domainSpec.getIdxRange(acc);
106 auto const threadSpace = domainSpec.getThreadSpace(acc);
107
108 using IdxType = std::conditional_t<
109 std::is_same_v<void, T_ScalarIdxType>,
110 typename ALPAKA_TYPEOF(idxRange)::IdxType,
111 T_ScalarIdxType>;
112 return T_Traverse::make(
113 pCast<IdxType>(idxRange),
114 pCast<IdxType>(threadSpace),
115 idxMapping,
116 iotaCVec<
117 typename ALPAKA_TYPEOF(idxRange.distance())::type,
118 ALPAKA_TYPEOF(idxRange.distance())::dim()>());
119 }
120 };
121 };
122} // namespace alpaka::onAcc::internal
#define ALPAKA_FN_HOST_ACC
All functions that can be used on an accelerator have to be attributed with ALPAKA_FN_ACC or ALPAKA_F...
Definition common.hpp:31
#define ALPAKA_TYPEOF(...)
Get the type of instance.
Definition common.hpp:153
consteval auto iotaCVec()
Create and return a CVector of the given length with values 1, 2, ...
Definition CVec.hpp:135
constexpr decltype(auto) pCast(auto &&input)
Performs a static_cast on the storage type of combined data type.
Definition cast.hpp:48