17 #include <type_traits>
22 namespace ext::intel::esimd {
28 template <
bool Is2D,
typename T,
int SizeY,
int Str
ideY,
int SizeX,
int Str
ideX>
30 using element_type = T;
31 static constexpr
int length = SizeX * SizeY;
32 static constexpr
int Is_2D = Is2D;
33 static constexpr
int Size_x = SizeX;
34 static constexpr
int Stride_x = StrideX;
35 static constexpr
int Size_y = SizeY;
36 static constexpr
int Stride_y = StrideY;
37 static constexpr
int Size_in_bytes =
sizeof(T) * length;
39 static_assert(Size_x > 0 && Stride_x >= 0,
"illegal region in x-dimension");
40 static_assert(Size_y > 0 && Stride_y >= 0,
"illegal region in y-dimension");
45 explicit region_base() : M_offset_y(0), M_offset_x(0) {}
47 explicit region_base(uint16_t OffsetX) : M_offset_y(0), M_offset_x(OffsetX) {}
49 explicit region_base(uint16_t OffsetY, uint16_t OffsetX)
50 : M_offset_y(OffsetY), M_offset_x(OffsetX) {}
54 template <
typename T,
int Size,
int Str
ide>
55 using region1d_t = region_base<false, T, 1, 1, Size, Stride>;
58 template <
typename T,
int SizeY,
int Str
ideY,
int SizeX,
int Str
ideX>
59 using region2d_t = region_base<true, T, SizeY, StrideY, SizeX, StrideX>;
63 using region1d_scalar_t =
64 region_base<
false, T, 1 , 1 , 1, 1>;
67 template <
typename BaseTy,
typename RegionTy>
class simd_view;
89 template <
typename Ty>
struct shape_type {
90 using element_type = Ty;
94 template <
typename Ty,
int Size,
int Str
ide>
95 struct shape_type<region1d_t<Ty, Size, Stride>> {
96 using element_type = Ty;
97 using type = region1d_t<Ty, Size, Stride>;
98 static inline constexpr
int length = type::length;
101 template <
typename Ty>
struct shape_type<region1d_scalar_t<Ty>> {
102 using element_type = Ty;
103 using type = region1d_t<Ty, 1, 1>;
104 static inline constexpr
int length = type::length;
107 template <
typename Ty,
int SizeY,
int Str
ideY,
int SizeX,
int Str
ideX>
108 struct shape_type<region2d_t<Ty, SizeY, StrideY, SizeX, StrideX>> {
109 using element_type = Ty;
110 using type = region2d_t<Ty, SizeY, StrideY, SizeX, StrideX>;
111 static inline constexpr
int length = type::length;
115 template <
typename TopRegionTy,
typename BaseRegionTy>
116 struct shape_type<
std::pair<TopRegionTy, BaseRegionTy>>
117 :
public shape_type<TopRegionTy> {};
120 template <
typename BaseTy,
typename RegionTy>
121 struct shape_type<simd_view<BaseTy, RegionTy>> :
public shape_type<RegionTy> {};
124 template <
typename T> T getTopRegion(T Reg) {
return Reg; }
125 template <
typename T,
typename U> T getTopRegion(std::pair<T, U> Reg) {
129 template <
typename T> T getBaseRegion(T Reg) {
return Reg; }
130 template <
typename T,
typename U> T getBaseRegion(std::pair<T, U> Reg) {