alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
IdxRange.hpp
Go to the documentation of this file.
1/* Copyright 2024 René Widera
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
10
12{
13 template<typename T_ExtentFn>
15 {
16 constexpr IdxRangeFn(T_ExtentFn const& extentFn) : m_extentFn{extentFn}
17 {
18 }
19
20 constexpr auto getIdxRange(auto const& acc) const
21 {
22 return IdxRange{m_extentFn(acc)};
23 }
24
25 private:
26 T_ExtentFn const m_extentFn;
27 };
28
29 template<concepts::Origin T_Origin, concepts::Unit T_Unit, typename T_MultiDimensional = MultiDimensional<true>>
31 {
32 constexpr IdxRangeLazy(T_Origin const& origin, T_Unit const& unit, T_MultiDimensional = T_MultiDimensional{})
33 {
34 alpaka::unused(origin, unit);
35 }
36
37 constexpr auto getIdxRange(auto const& acc) const
38 {
39 auto const extent
40 = internalCompute::GetExtentsOf::Op<ALPAKA_TYPEOF(acc), T_Origin, T_Unit>{}(acc, T_Origin{}, T_Unit{});
41
42 if constexpr(T_MultiDimensional::value == false)
43 return IdxRange{Vec{extent.product()}};
44 else
45 return IdxRange{extent};
46 }
47 };
48} // namespace alpaka::onAcc::internal
49
50namespace alpaka::trait
51{
52 template<concepts::SpecializationOf<onAcc::internal::IdxRangeLazy> T>
53 struct IsLazyIndexRange<T> : std::true_type
54 {
55 };
56
57 template<concepts::SpecializationOf<onAcc::internal::IdxRangeFn> T>
58 struct IsLazyIndexRange<T> : std::true_type
59 {
60 };
61} // namespace alpaka::trait
#define ALPAKA_TYPEOF(...)
Get the type of instance.
Definition common.hpp:153
Origin of index domains.
Definition tag.hpp:21
Unit of index domains.
Definition tag.hpp:33
constexpr auto getIdxRange(auto const &acc) const
Definition IdxRange.hpp:20
constexpr IdxRangeFn(T_ExtentFn const &extentFn)
Definition IdxRange.hpp:16
constexpr auto getIdxRange(auto const &acc) const
Definition IdxRange.hpp:37
constexpr IdxRangeLazy(T_Origin const &origin, T_Unit const &unit, T_MultiDimensional=T_MultiDimensional{})
Definition IdxRange.hpp:32