43 void u8_sve_scale_nearest(
const ITensor *
src,
45 const ITensor *offsets,
46 float sampling_offset,
50 const size_t in_stride_c =
src->info()->dimension(0) +
src->info()->padding().left +
src->info()->padding().right;
51 const size_t in_stride_w =
src->info()->dimension(1) +
src->info()->padding().top +
src->info()->padding().bottom;
52 const size_t in_stride_wc = in_stride_w * in_stride_c;
53 const size_t in_dim_h =
src->info()->dimension(2);
57 const auto window_start_x =
static_cast<int32_t
>(window.x().start());
58 const auto window_end_x =
static_cast<int32_t
>(window.x().end());
62 Iterator out(
dst, win);
64 const uint8_t *in_ptr_start =
src->buffer() +
src->info()->offset_first_element_in_bytes();
65 const unsigned int in_stride_bytes_hwc =
src->info()->strides_in_bytes()[3];
69 [&](
const Coordinates &
id)
72 *
reinterpret_cast<const int32_t *
>(offsets->ptr_to_element(Coordinates(
id.y(),
id.z()))) * in_stride_c;
73 const auto in_hi =
static_cast<int>(
75 : std::floor((id.z() + sampling_offset) * hr));
76 const int offset_row = in_hi * in_stride_wc;
77 const auto in_ptr =
reinterpret_cast<const uint8_t *
>(in_ptr_start + in_stride_bytes_hwc *
id[3]);
78 const auto out_ptr =
reinterpret_cast<uint8_t *
>(out.ptr());
81 int x = window_start_x;
82 svbool_t pg = svwhilelt_b8(x, window_end_x);
86 svst1_u8(pg, out_ptr + x, svld1_u8(pg, in_ptr +
offset + offset_row + x));
89 pg = svwhilelt_b8(x, window_end_x);
90 }
while (svptest_any(svptrue_b8(), pg));
95 void s16_sve_scale_nearest(
const ITensor *
src,
97 const ITensor *offsets,
98 float sampling_offset,
100 const Window &window)
102 const size_t in_stride_c =
src->info()->dimension(0) +
src->info()->padding().left +
src->info()->padding().right;
103 const size_t in_stride_w =
src->info()->dimension(1) +
src->info()->padding().top +
src->info()->padding().bottom;
104 const size_t in_stride_wc = in_stride_w * in_stride_c;
105 const size_t in_dim_h =
src->info()->dimension(2);
109 const auto window_start_x =
static_cast<int32_t
>(window.x().start());
110 const auto window_end_x =
static_cast<int32_t
>(window.x().end());
114 Iterator out(
dst, win);
116 const uint8_t *in_ptr_start =
src->buffer() +
src->info()->offset_first_element_in_bytes();
117 const unsigned int in_stride_bytes_hwc =
src->info()->strides_in_bytes()[3];
121 [&](
const Coordinates &
id)
124 *
reinterpret_cast<const int32_t *
>(offsets->ptr_to_element(Coordinates(
id.y(),
id.z()))) * in_stride_c;
125 const auto in_hi =
static_cast<int>(
127 : std::floor((id.z() + sampling_offset) * hr));
128 const int offset_row = in_hi * in_stride_wc;
129 const auto in_ptr =
reinterpret_cast<const int16_t *
>(in_ptr_start + in_stride_bytes_hwc *
id[3]);
130 const auto out_ptr =
reinterpret_cast<int16_t *
>(out.ptr());
133 int x = window_start_x;
134 svbool_t pg = svwhilelt_b16(x, window_end_x);
138 svst1_s16(pg, out_ptr + x, svld1_s16(pg, in_ptr +
offset + offset_row + x));
141 pg = svwhilelt_b16(x, window_end_x);
142 }
while (svptest_any(svptrue_b16(), pg));
157 float sampling_offset,
164 u8_sve_scale_nearest(
src,
dst, offsets, sampling_offset, align_corners, window);
180 float sampling_offset,
187 s16_sve_scale_nearest(
src,
dst, offsets, sampling_offset, align_corners, window);