alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
Traits.hpp
Go to the documentation of this file.
1/* Copyright 2023 Benjamin Worpitz, Andrea Bocci, Jan Stephan, Bernhard Manfred Gruber
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
10#include "alpaka/idx/Traits.hpp"
11#include "alpaka/meta/Fold.hpp"
12#include "alpaka/vec/Vec.hpp"
13
14#include <functional>
15#include <type_traits>
16#include <utility>
17
18namespace alpaka
19{
20 //! The extent traits.
21 namespace trait
22 {
23 //! The extent get trait.
24 //!
25 //! If not specialized explicitly it returns 1.
26 template<typename TIdxIntegralConst, typename TExtent, typename TSfinae = void>
27 struct [[deprecated("Specialize GetExtents instead")]] GetExtent
28 {
30 {
31 return static_cast<Idx<TExtent>>(1);
32 } // namespace trait
33 }; // namespace alpaka
34
35 //! The GetExtents trait for getting the extents of an object as an alpaka::Vec.
36 template<typename TExtent, typename TSfinae = void>
37 struct GetExtents;
38 } // namespace trait
39
40 //! \return The extent in the given dimension.
42 template<std::size_t Tidx, typename TExtent>
43 [[deprecated("use getExtents(extent)[Tidx] instead")]] ALPAKA_FN_HOST_ACC auto getExtent(
44 TExtent const& extent = TExtent()) -> Idx<TExtent>
45 {
46#if BOOST_COMP_CLANG || BOOST_COMP_GNUC
47# pragma GCC diagnostic push
48# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
49#endif
50 return trait::GetExtent<DimInt<Tidx>, TExtent>::getExtent(extent);
51#if BOOST_COMP_CLANG || BOOST_COMP_GNUC
52# pragma GCC diagnostic pop
53#endif
54 }
55
56 //! \return The extents of the given object.
58 template<typename T>
60 {
61 return trait::GetExtents<T>{}(object);
62 }
63
64 //! \tparam T has to specialize GetExtent.
65 //! \return The extents of the given object.
67 template<typename T>
68 [[deprecated("use getExtents() instead")]] ALPAKA_FN_HOST_ACC constexpr auto getExtentVec(T const& object = {})
69 -> Vec<Dim<T>, Idx<T>>
70 {
71 return getExtents(object);
72 }
73
74 //! \tparam T has to specialize GetExtent.
75 //! \return The extent but only the last TDim elements.
77 template<typename TDim, typename T>
78 ALPAKA_FN_HOST_ACC constexpr auto getExtentVecEnd(T const& object = {}) -> Vec<TDim, Idx<T>>
79 {
80 static_assert(TDim::value <= Dim<T>::value, "Cannot get more items than the extent holds");
81
82 [[maybe_unused]] auto const e = getExtents(object);
83 Vec<TDim, Idx<T>> v{};
84 if constexpr(TDim::value > 0)
85 {
86 for(unsigned i = 0; i < TDim::value; i++)
87 v[i] = e[(Dim<T>::value - TDim::value) + i];
88 }
89 return v;
90 }
91
92 //! \return The width.
94 template<typename TExtent>
95 ALPAKA_FN_HOST_ACC auto getWidth(TExtent const& extent = TExtent()) -> Idx<TExtent>
96 {
97 if constexpr(Dim<TExtent>::value >= 1)
98 return getExtents(extent)[Dim<TExtent>::value - 1u];
99 else
100 return 1;
101
103 }
104
105 //! \return The height.
107 template<typename TExtent>
108 ALPAKA_FN_HOST_ACC auto getHeight(TExtent const& extent = TExtent()) -> Idx<TExtent>
109 {
110 if constexpr(Dim<TExtent>::value >= 2)
111 return getExtents(extent)[Dim<TExtent>::value - 2u];
112 else
113 return 1;
114
116 }
117
118 //! \return The depth.
120 template<typename TExtent>
121 ALPAKA_FN_HOST_ACC auto getDepth(TExtent const& extent = TExtent()) -> Idx<TExtent>
122 {
123 if constexpr(Dim<TExtent>::value >= 3)
124 return getExtents(extent)[Dim<TExtent>::value - 3u];
125 else
126 return 1;
127
129 }
130
131 //! \return The product of the extents of the given object.
133 template<typename T>
135 {
136 return getExtents(object).prod();
137 }
138
139 namespace trait
140 {
141 //! The Vec extent get trait specialization.
142 template<typename TDim, typename TVal>
143 struct GetExtents<Vec<TDim, TVal>>
144 {
146 ALPAKA_FN_HOST_ACC constexpr auto operator()(Vec<TDim, TVal> const& extent) const -> Vec<TDim, TVal>
147 {
148 return extent;
149 }
150 };
151
152 template<typename Integral>
153 struct GetExtents<Integral, std::enable_if_t<std::is_integral_v<Integral>>>
154 {
156 ALPAKA_FN_HOST_ACC auto operator()(Integral i) const
157 {
158 return Vec{i};
159 }
160 };
161 } // namespace trait
162} // namespace alpaka
#define ALPAKA_UNREACHABLE(...)
Before CUDA 11.5 nvcc is unable to correctly identify return statements in 'if constexpr' branches....
A n-dimensional vector.
Definition Vec.hpp:38
#define ALPAKA_FN_HOST_ACC
Definition Common.hpp:39
#define ALPAKA_NO_HOST_ACC_WARNING
Disable nvcc warning: 'calling a host function from host device function.' Usage: ALPAKA_NO_HOST_ACC_...
Definition Common.hpp:82
The alpaka accelerator library.
typename trait::IdxType< T >::type Idx
Definition Traits.hpp:29
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getExtentProduct(T const &object) -> Idx< T >
Definition Traits.hpp:134
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getHeight(TExtent const &extent=TExtent()) -> Idx< TExtent >
Definition Traits.hpp:108
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getExtent(TExtent const &extent=TExtent()) -> Idx< TExtent >
Definition Traits.hpp:43
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC constexpr auto getExtentVecEnd(T const &object={}) -> Vec< TDim, Idx< T > >
Definition Traits.hpp:78
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getExtents(T const &object) -> Vec< Dim< T >, Idx< T > >
Definition Traits.hpp:59
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC constexpr auto getExtentVec(T const &object={}) -> Vec< Dim< T >, Idx< T > >
Definition Traits.hpp:68
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getDepth(TExtent const &extent=TExtent()) -> Idx< TExtent >
Definition Traits.hpp:121
typename trait::DimType< T >::type Dim
The dimension type trait alias template to remove the ::type.
Definition Traits.hpp:19
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getWidth(TExtent const &extent=TExtent()) -> Idx< TExtent >
Definition Traits.hpp:95
STL namespace.
The extent get trait.
Definition Traits.hpp:28
ALPAKA_NO_HOST_ACC_WARNING static ALPAKA_FN_HOST_ACC auto getExtent(TExtent const &) -> Idx< TExtent >
Definition Traits.hpp:29
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto operator()(Integral i) const
Definition Traits.hpp:156
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC constexpr auto operator()(Vec< TDim, TVal > const &extent) const -> Vec< TDim, TVal >
Definition Traits.hpp:146
The GetExtents trait for getting the extents of an object as an alpaka::Vec.
Definition Traits.hpp:37