multi_index.hpp Source File

multi_index.hpp Source File#

Composable Kernel: multi_index.hpp Source File
tile/core/container/multi_index.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2018-2024, Advanced Micro Devices, Inc. All rights reserved.
3
4#pragma once
5
11
12namespace ck_tile {
13
14// Don't use tihs directly. This is for old CK's internal usage,
15// in the future always use array instead
16template <index_t N>
18
19template <typename... Xs>
20CK_TILE_HOST_DEVICE constexpr auto make_multi_index(Xs&&... xs)
21{
22 return make_array<index_t>(index_t{xs}...);
23}
24
25template <index_t NSize>
27{
28 return unpack([](auto... xs) { return make_multi_index(xs...); },
30}
31
32template <typename T>
33CK_TILE_HOST_DEVICE constexpr auto to_multi_index(const T& x)
34{
35 return unpack([](auto... ys) { return make_multi_index(ys...); }, x);
36}
37
38template <index_t NSize, typename X>
40{
41 static_assert(X::size() == NSize, "wrong! size not the same");
42 static_for<0, NSize, 1>{}([&](auto i) { y[i] += x[i]; });
43 return y;
44}
45
46template <index_t NSize, typename X>
48{
49 static_assert(X::size() == NSize, "wrong! size not the same");
50 static_for<0, NSize, 1>{}([&](auto i) { y[i] -= x[i]; });
51 return y;
52}
53
54template <index_t NSize, typename T>
55CK_TILE_HOST_DEVICE constexpr auto operator+(const multi_index<NSize>& a, const T& b)
56{
57 using type = multi_index<NSize>;
58 static_assert(T::size() == NSize, "wrong! size not the same");
59 type r;
60 static_for<0, NSize, 1>{}([&](auto i) { r[i] = a[i] + b[i]; });
61 return r;
62}
63
64template <index_t NSize, typename T>
65CK_TILE_HOST_DEVICE constexpr auto operator-(const multi_index<NSize>& a, const T& b)
66{
67 using type = multi_index<NSize>;
68 static_assert(T::size() == NSize, "wrong! size not the same");
69 type r;
70 static_for<0, NSize, 1>{}([&](auto i) { r[i] = a[i] - b[i]; });
71 return r;
72}
73
74template <index_t NSize, typename T>
75CK_TILE_HOST_DEVICE constexpr auto operator*(const multi_index<NSize>& a, const T& b)
76{
77 using type = multi_index<NSize>;
78 static_assert(T::size() == NSize, "wrong! size not the same");
79 type r;
80 static_for<0, NSize, 1>{}([&](auto i) { r[i] = a[i] * b[i]; });
81 return r;
82}
83
84// multi_index = index_t * multi_index
85template <index_t NSize>
87{
89 static_for<0, NSize, 1>{}([&](auto i) { r[i] = a * x[i]; });
90 return r;
91}
92
93// multi_index = multi_index * index_t
94template <index_t NSize>
96{
97 return a * x;
98}
99
100} // namespace ck_tile
#define CK_TILE_HOST_DEVICE
Definition config.hpp:42
Definition tile/core/algorithm/cluster_descriptor.hpp:13
CK_TILE_HOST_DEVICE constexpr auto operator-=(multi_index< NSize > &y, const X &x)
Definition tile/core/container/multi_index.hpp:47
CK_TILE_HOST_DEVICE constexpr auto operator*(const multi_index< NSize > &a, const T &b)
Definition tile/core/container/multi_index.hpp:75
CK_TILE_HOST_DEVICE constexpr auto to_multi_index(const T &x)
Definition tile/core/container/multi_index.hpp:33
CK_TILE_HOST_DEVICE constexpr auto operator+(const multi_index< NSize > &a, const T &b)
Definition tile/core/container/multi_index.hpp:55
CK_TILE_HOST_DEVICE constexpr auto operator-(const multi_index< NSize > &a, const T &b)
Definition tile/core/container/multi_index.hpp:65
array< index_t, N > multi_index
Definition tile/core/container/multi_index.hpp:17
CK_TILE_HOST_DEVICE constexpr auto make_zero_multi_index()
Definition tile/core/container/multi_index.hpp:26
CK_TILE_HOST_DEVICE constexpr auto unpack(F &&f, X &&x)
Definition tile/core/utility/functional.hpp:200
int32_t index_t
Definition integer.hpp:9
CK_TILE_HOST_DEVICE constexpr details::return_type< D, Ts... > make_array(Ts &&... ts)
Definition tile/core/container/array.hpp:242
CK_TILE_HOST_DEVICE constexpr auto operator+=(multi_index< NSize > &y, const X &x)
Definition tile/core/container/multi_index.hpp:39
CK_TILE_HOST_DEVICE constexpr auto make_multi_index(Xs &&... xs)
Definition tile/core/container/multi_index.hpp:20
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition pointer.h:1517
A fixed-size array container similar to std::array with additional utilities.
Definition tile/core/container/array.hpp:43
Definition tile/core/utility/functional.hpp:43
typename sequence_gen< NSize, F >::type type
Definition tile/core/container/sequence.hpp:320