17#include "../KernelGenerator.h"
18#include "../Validator.h"
25void Validator::visit(
const ir::operation::Slice &) {
_supported =
true; }
27void KernelGenerator::visit(
const ir::operation::Slice &node)
29 const auto output_index{node.getOutputs().at(0)};
34 auto outputData_tensor = _tensor_reg->getAclTensor(output_index);
35 auto inputData_tensor = _tensor_reg->getAclTensor(input_index);
38 int input_rank = _ctx.
at(input_index).shape().rank();
39 std::vector<int32_t> starts;
40 std::vector<int32_t> ends;
41 starts.resize(input_rank, 0);
42 ends.resize(input_rank, 0);
44 assert(_ctx.
at(begins_index).data());
45 assert(_ctx.
at(sizes_index).data());
46 auto beginData_base = _ctx.
at(begins_index).data()->base();
47 auto sizeData_base = _ctx.
at(sizes_index).data()->base();
48 [[maybe_unused]]
const int beginData_size = _ctx.
at(begins_index).shape().num_elements();
49 [[maybe_unused]]
const int sizeData_size = _ctx.
at(sizes_index).shape().num_elements();
53 assert(_ctx.
at(begins_index).typeInfo().
type() == DataType::INT32);
54 assert(_ctx.
at(sizes_index).typeInfo().
type() == DataType::INT32);
55 assert(beginData_size == input_rank);
56 assert(sizeData_size == input_rank);
58 assert(beginData_base !=
nullptr);
59 for (
int n = 0; n < input_rank; ++n)
63 int32_t begin_value = *(
reinterpret_cast<const int32_t *
>(beginData_base) + n);
64 starts[axis] = begin_value;
66 int32_t size_value = *(
reinterpret_cast<const int32_t *
>(sizeData_base) + n);
67 ends[axis] = begin_value + size_value;
71 ::arm_compute::Coordinates starts_set;
72 ::arm_compute::Coordinates ends_set;
74 for (
size_t i = 0; i < starts.size(); ++i)
76 starts_set.set(i, starts[i]);
77 ends_set.set(i, ends[i]);
80 auto fn = acl_common::generateLayer<arm_compute::CLSlice>(
81 inputData_tensor->handle(), outputData_tensor->handle(), starts_set, ends_set);
uint32_t value(void) const
std::unique_ptr< exec::IFunction > _return_fn
const Object & at(const Index &index) const
Get the object that is associated with the given index.
ARMComputeAxis ToARMComputeAxis(uint32_t rank, uint32_t axis)
std::unique_ptr< AclFunction > asAclFunction(std::unique_ptr<::arm_compute::IFunction > &&layer)