alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
MdForwardIter.hpp
Go to the documentation of this file.
1/* Copyright 2025 René Widera
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
7#include "alpaka/Vec.hpp"
10
11#include <cstdint>
12#include <iterator>
13
14namespace alpaka
15{
16
17 /** special implementation to define the end
18 *
19 * Only a scalar value must be stored which reduce the register footprint.
20 * The definition of end is that the index is behind or equal to the extent of the slowest moving dimension.
21 */
22 template<typename T_idxType>
24 {
25 using index_type = T_idxType;
26
27 void _()
28 {
29 static_assert(std::forward_iterator<MdForwardIterEnd>);
30 }
31
32 public:
33 constexpr MdForwardIterEnd(alpaka::concepts::IMdSpan auto const& mdSpan)
34 : m_extentSlowDim{mdSpan.getExtents()[0]}
35 {
36 }
37
38 constexpr auto operator*() const
39 {
40 return m_extentSlowDim;
41 }
42
43 constexpr bool operator==(MdForwardIterEnd const& other) const
44 {
45 return (m_extentSlowDim == other.m_extentSlowDim);
46 }
47
48 constexpr bool operator!=(MdForwardIterEnd const& other) const
49 {
50 return !(*this == other);
51 }
52
53 private:
55 };
56
57 template<alpaka::concepts::IMdSpan T_MdSpan>
59
60 template<alpaka::concepts::IMdSpan T_MdSpan>
62 {
63 using index_type = typename T_MdSpan::index_type;
64
65 friend class MdForwardIterEnd<index_type>;
66
67 static constexpr uint32_t iterDim = T_MdSpan::dim();
69
70 void _()
71 {
72 static_assert(std::forward_iterator<MdForwardIter>);
73 static_assert(std::input_or_output_iterator<MdForwardIter>);
74 }
75
76 public:
77 constexpr MdForwardIter(T_MdSpan const& mdSpan) : m_mdSpan(mdSpan), m_current{IterIdxVecType::fill(0u)}
78 {
79 // Any zero extent makes the span empty, so start directly at end().
80 for(uint32_t idx = 0; idx < iterDim; ++idx)
81 {
82 if(m_mdSpan.getExtents()[idx] == index_type{0u})
83 {
84 m_current[0] = m_mdSpan.getExtents()[0];
85 break;
86 }
87 }
88 }
89
91 {
92 return m_current[0];
93 }
94
95 constexpr decltype(auto) operator*() const
96 {
97 return m_mdSpan[m_current];
98 }
99
100 constexpr decltype(auto) operator*()
101 {
102 return m_mdSpan[m_current];
103 }
104
105 // pre-increment the iterator
107 {
108 for(uint32_t d = 0; d < iterDim; ++d)
109 {
110 uint32_t const idx = iterDim - 1u - d;
111 m_current[idx] += index_type{1u};
112 if constexpr(iterDim != 1u)
113 {
114 if(idx >= 1u && m_current[idx] >= m_mdSpan.getExtents()[idx])
115 {
116 m_current[idx] = index_type{0u};
117 }
118 else
119 break;
120 }
121 }
122 return *this;
123 }
124
125 // post-increment the iterator
127 {
128 MdForwardIter old = *this;
129 ++(*this);
130 return old;
131 }
132
133 constexpr bool operator==(MdForwardIter const& other) const
134 {
135 return (m_current == other.m_current);
136 }
137
138 constexpr bool operator!=(MdForwardIter const& other) const
139 {
140 return !(*this == other);
141 }
142
143 private:
144 T_MdSpan m_mdSpan;
146 };
147
148 template<typename T_MdSpan>
149 constexpr bool operator==(
150 MdForwardIter<T_MdSpan> const& mdIter,
152 {
153 return (*mdIteratorEnd <= mdIter.slowCurrent());
154 }
155
156 template<typename T_MdSpan>
157 constexpr bool operator!=(
158 MdForwardIter<T_MdSpan> const& mdIter,
160 {
161 return !(mdIteratorEnd == mdIter);
162 }
163
164 template<typename T_MdSpan>
165 constexpr bool operator==(
167 MdForwardIter<T_MdSpan> const& mdIter)
168 {
169 return (*mdIteratorEnd <= mdIter.slowCurrent());
170 }
171
172 template<typename T_MdSpan>
173 constexpr bool operator!=(
175 MdForwardIter<T_MdSpan> const& mdIter)
176 {
177 return !(mdIteratorEnd == mdIter);
178 }
179} // namespace alpaka
special implementation to define the end
constexpr bool operator!=(MdForwardIterEnd const &other) const
constexpr auto operator*() const
constexpr bool operator==(MdForwardIterEnd const &other) const
constexpr MdForwardIterEnd(alpaka::concepts::IMdSpan auto const &mdSpan)
ALPAKA_FN_ACC constexpr index_type slowCurrent() const
ALPAKA_FN_ACC MdForwardIter operator++(int)
typename T_MdSpan::index_type index_type
static constexpr uint32_t iterDim
ALPAKA_FN_ACC MdForwardIter & operator++()
constexpr bool operator!=(MdForwardIter const &other) const
constexpr bool operator==(MdForwardIter const &other) const
Vec< index_type, iterDim > IterIdxVecType
constexpr MdForwardIter(T_MdSpan const &mdSpan)
#define ALPAKA_FN_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_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:32
Interface concept for objects describing multidimensional memory access.
Definition IMdSpan.hpp:91
main alpaka namespace.
Definition alpaka.hpp:76
ALPAKA_FN_HOST_ACC MdForwardIterEnd(T_MdSpan const &) -> MdForwardIterEnd< typename T_MdSpan::index_type >
constexpr bool operator!=(concepts::Executor auto lhs, concepts::Executor auto rhs)
Definition trait.hpp:141
constexpr bool operator==(concepts::Executor auto lhs, concepts::Executor auto rhs)
Definition trait.hpp:136