Low-Level Abstraction of Memory Access
PermuteArrayIndex.hpp
Go to the documentation of this file.
1 // Copyright 2022 Bernhard Manfred Gruber
2 // SPDX-License-Identifier: MPL-2.0
3 
4 #pragma once
5 
6 #include "Common.hpp"
7 
8 namespace llama::mapping
9 {
15  template<typename Mapping, std::size_t... Permutation>
16  struct PermuteArrayIndex : Mapping
17  {
18  private:
19  using size_type = typename Mapping::ArrayExtents::value_type;
20  using ArrayIndex = typename Mapping::ArrayExtents::Index;
21 
22  public:
23  using Inner = Mapping;
24 
25  constexpr PermuteArrayIndex() = default;
26 
28  explicit PermuteArrayIndex(Mapping mapping) : Mapping(std::move(mapping))
29  {
30  }
31 
32  template<typename... Args>
33  LLAMA_FN_HOST_ACC_INLINE explicit PermuteArrayIndex(Args&&... innerArgs)
34  : Mapping(std::forward<Args>(innerArgs)...)
35  {
36  }
37 
38  static_assert(
39  sizeof...(Permutation) == ArrayIndex::rank,
40  "The number of integral arguments to PermuteArrayIndex must be the same as ArrayExtents::rank");
41 
42  template<std::size_t... RCs>
43  LLAMA_FN_HOST_ACC_INLINE constexpr auto blobNrAndOffset(ArrayIndex ai, RecordCoord<RCs...> rc = {}) const
45  {
46  return Inner::blobNrAndOffset(ArrayIndex{ai[Permutation]...}, rc);
47  }
48 
49  template<std::size_t... RCs, typename Blobs>
50  LLAMA_FN_HOST_ACC_INLINE auto compute(ArrayIndex ai, RecordCoord<RCs...> rc, Blobs& blobs) const
51  -> decltype(auto)
52  {
53  return Inner::compute(ArrayIndex{ai[Permutation]...}, rc, blobs);
54  }
55  };
56 
58  template<typename Mapping>
60 
62  template<typename Mapping>
63  inline constexpr bool isPermuteArrayIndex = false;
64 
66  template<typename Mapping, std::size_t... Permutation>
67  inline constexpr bool isPermuteArrayIndex<PermuteArrayIndex<Mapping, Permutation...>> = true;
68 } // namespace llama::mapping
#define LLAMA_EXPORT
Definition: macros.hpp:192
#define LLAMA_FN_HOST_ACC_INLINE
Definition: macros.hpp:96
PermuteArrayIndex(Mapping) -> PermuteArrayIndex< Mapping >
constexpr bool isPermuteArrayIndex
static constexpr std::size_t rank
PermuteArrayIndex(Args &&... innerArgs)
auto compute(ArrayIndex ai, RecordCoord< RCs... > rc, Blobs &blobs) const -> decltype(auto)
constexpr auto blobNrAndOffset(ArrayIndex ai, RecordCoord< RCs... > rc={}) const -> NrAndOffset< size_type >
constexpr PermuteArrayIndex()=default