Commit 3bc39592 authored by Chao Liu's avatar Chao Liu
Browse files

refactor MultiIndex, Tuple

parent c52c308d
......@@ -115,10 +115,7 @@ struct DummyDynamicTransform_v2_1
MultiIndex<2> idx;
// initialize idx
for(index_t i = 0; i < 2; ++i)
{
idx(i) = p_wei_global[get_thread_local_1d_id() + i];
}
static_for<0, 2, 1>{}([&](auto i) { idx(i) = p_wei_global[get_thread_local_1d_id() + i]; });
auto in_gemmk_gemmn_coord =
make_dynamic_tensor_coordinate_v2(in_gemmk_gemmn_global_desc, idx);
......@@ -148,29 +145,34 @@ struct DummyDynamicTransform_v2_1
const MultiIndex<2> in_left_pads,
const MultiIndex<2> in_right_pads) const
{
const index_t N = in_n_c_hi_wi_global_desc.GetLength(0);
const index_t C = in_n_c_hi_wi_global_desc.GetLength(1);
const index_t K = out_n_k_ho_wo_global_desc.GetLength(1);
constexpr auto i0 = Number<0>{};
constexpr auto i1 = Number<1>{};
constexpr auto i2 = Number<2>{};
constexpr auto i3 = Number<3>{};
const index_t Y = wei_k_c_y_x_global_desc.GetLength(2);
const index_t X = wei_k_c_y_x_global_desc.GetLength(3);
const index_t N = in_n_c_hi_wi_global_desc.GetLength(i0);
const index_t C = in_n_c_hi_wi_global_desc.GetLength(i1);
const index_t K = out_n_k_ho_wo_global_desc.GetLength(i1);
const index_t Hi = in_n_c_hi_wi_global_desc.GetLength(2);
const index_t Wi = in_n_c_hi_wi_global_desc.GetLength(3);
const index_t Y = wei_k_c_y_x_global_desc.GetLength(i2);
const index_t X = wei_k_c_y_x_global_desc.GetLength(i3);
const index_t Ho = out_n_k_ho_wo_global_desc.GetLength(2);
const index_t Wo = out_n_k_ho_wo_global_desc.GetLength(3);
const index_t Hi = in_n_c_hi_wi_global_desc.GetLength(i2);
const index_t Wi = in_n_c_hi_wi_global_desc.GetLength(i3);
const index_t ConvStrideH = conv_strides[0];
const index_t ConvStrideW = conv_strides[1];
const index_t Ho = out_n_k_ho_wo_global_desc.GetLength(i2);
const index_t Wo = out_n_k_ho_wo_global_desc.GetLength(i3);
const index_t ConvDilationH = conv_dilations[0];
const index_t ConvDilationW = conv_dilations[1];
const index_t ConvStrideH = conv_strides[i0];
const index_t ConvStrideW = conv_strides[i1];
const index_t InLeftPadH = in_left_pads[0];
const index_t InLeftPadW = in_left_pads[1];
const index_t InRightPadH = in_right_pads[0];
const index_t InRightPadW = in_right_pads[1];
const index_t ConvDilationH = conv_dilations[i0];
const index_t ConvDilationW = conv_dilations[i1];
const index_t InLeftPadH = in_left_pads[i0];
const index_t InLeftPadW = in_left_pads[i1];
const index_t InRightPadH = in_right_pads[i0];
const index_t InRightPadW = in_right_pads[i1];
#if 0
const auto in_n_c_hip_wip_global_desc = transform_dynamic_tensor_descriptor_v2(
......@@ -211,10 +213,7 @@ struct DummyDynamicTransform_v2_1
MultiIndex<4> idx;
// initialize idx
for(index_t i = 0; i < 4; ++i)
{
idx(i) = p_wei_global[get_thread_local_1d_id() + i];
}
static_for<0, 4, 1>{}([&](auto i) { idx(i) = p_wei_global[get_thread_local_1d_id() + i]; });
#if 0
const index_t niter = p_wei_global[10];
......
......@@ -14,7 +14,7 @@ struct DynamicPassThrough
const UpperIndex up_lengths_;
__host__ __device__ explicit constexpr DynamicPassThrough(const index_t& low_length)
: up_lengths_{low_length}
: up_lengths_{make_multi_index(low_length)}
{
}
......@@ -74,7 +74,7 @@ struct DynamicLeftPad
__host__ __device__ explicit constexpr DynamicLeftPad(const index_t& low_length,
const index_t& left_pad)
: up_lengths_{low_length + left_pad}, left_pad_{left_pad}
: up_lengths_{make_multi_index(low_length + left_pad)}, left_pad_{left_pad}
{
}
......@@ -137,7 +137,9 @@ struct DynamicRightPad
__host__ __device__ explicit constexpr DynamicRightPad(const index_t& low_length,
const index_t& right_pad)
: up_lengths_{low_length + right_pad}, low_length_{low_length}, right_pad_{right_pad}
: up_lengths_{make_multi_index(low_length + right_pad)},
low_length_{low_length},
right_pad_{right_pad}
{
}
......
......@@ -9,12 +9,20 @@ namespace ck {
template <index_t N>
using MultiIndex = Array<index_t, N>;
#if 1 // debug
template <typename... Xs>
__host__ __device__ constexpr auto make_multi_index(Xs... xs)
{
return make_array<index_t>(xs...);
}
#else
template <typename... Xs>
__host__ __device__ constexpr auto make_multi_index(const Xs&... xs)
{
return make_array(xs...);
}
#endif
#else
template <index_t N>
using MultiIndex = StaticallyIndexedArray<index_t, N>;
......
......@@ -45,11 +45,19 @@ struct Array<TData, 0>
__host__ __device__ static constexpr index_t Size() { return 0; }
};
#if 1
template <typename X, typename... Xs>
__host__ __device__ constexpr auto make_array(const X& x, const Xs&... xs)
{
return Array<X, sizeof...(Xs) + 1>{{x, static_cast<X>(xs)...}};
}
#else
template <typename X, typename... Xs>
__host__ __device__ constexpr auto make_array(X&& x, Xs&&... xs)
{
return Array<remove_cv_t<remove_reference_t<X>>, sizeof...(Xs) + 1>(x, xs...);
}
#endif
// make empty array
template <typename X>
......
......@@ -7,380 +7,310 @@
namespace ck {
template <typename TData, index_t NSize>
template <typename T, index_t NSize>
struct StaticallyIndexedArray
{
};
template <typename TData>
struct StaticallyIndexedArray<TData, 0> : Tuple<>
template <typename T>
struct StaticallyIndexedArray<T, 0> : public Tuple<>
{
using data_type = TData;
using data_type = T;
using base = Tuple<>;
__host__ __device__ explicit constexpr StaticallyIndexedArray() : base() {}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 1> : Tuple<TData>
template <typename T>
struct StaticallyIndexedArray<T, 1> : public Tuple<T>
{
using data_type = TData;
using base = Tuple<TData>;
using data_type = T;
using base = Tuple<T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 2> : Tuple<TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 2> : public Tuple<T, T>
{
using data_type = TData;
using base = Tuple<TData, TData>;
using data_type = T;
using base = Tuple<T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 3> : Tuple<TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 3> : public Tuple<T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 4> : Tuple<TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 4> : public Tuple<T, T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 5> : Tuple<TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 5> : public Tuple<T, T, T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 6> : Tuple<TData, TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 6> : public Tuple<T, T, T, T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData, TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 7> : Tuple<TData, TData, TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 7> : public Tuple<T, T, T, T, T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData, TData, TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 8>
: Tuple<TData, TData, TData, TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 8> : public Tuple<T, T, T, T, T, T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData, TData, TData, TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 9>
: Tuple<TData, TData, TData, TData, TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 9> : public Tuple<T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData, TData, TData, TData, TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 10>
: Tuple<TData, TData, TData, TData, TData, TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 10> : public Tuple<T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using base = Tuple<TData, TData, TData, TData, TData, TData, TData, TData, TData, TData>;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys) : base(ys...)
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 11>
: Tuple<TData, TData, TData, TData, TData, TData, TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 11> : public Tuple<T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 12>
: Tuple<TData, TData, TData, TData, TData, TData, TData, TData, TData, TData, TData, TData>
template <typename T>
struct StaticallyIndexedArray<T, 12> : public Tuple<T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 13> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 13> : public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 14> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 14> : public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 15> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 15> : public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 16> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 16> : public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 17> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 17>
: public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 18> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 18>
: public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 19> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 19>
: public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 20> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 20>
: public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 21> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 21>
: public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename TData>
struct StaticallyIndexedArray<TData, 22> : Tuple<TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData,
TData>
template <typename T>
struct StaticallyIndexedArray<T, 22>
: public Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>
{
using data_type = TData;
using data_type = T;
using base = Tuple<T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T>;
template <typename... Ys>
__host__ __device__ explicit constexpr StaticallyIndexedArray(Ys&&... ys)
: base(static_cast<T&&>(ys)...)
{
}
};
template <typename X, typename... Xs>
......
......@@ -21,7 +21,7 @@ using remove_reference_t = typename std::remove_reference<T>::type;
template <typename T>
using remove_cv_t = typename std::remove_cv<T>::type;
template <class T>
template <typename T>
constexpr std::remove_reference_t<T>&& move(T&& t) noexcept
{
return static_cast<typename std::remove_reference<T>::type&&>(t);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment