From 09cad7253cc75f67bf428ceef196cfbec7f8c357 Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Wed, 22 Jul 2020 12:11:20 +0100 Subject: COMPMID-3393: Minor tweaks on memory injection interface * Avoid the need to overload workspace() everytime * Remove the Layer suffix from the operators * Clean interface by removing default arguments when unsupported Signed-off-by: Georgios Pinitas Change-Id: I7710ecd485cae13e9c2d45216debbd8103bc5a0f Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3610 Tested-by: Arm Jenkins Reviewed-by: Michalis Spyrou Comments-Addressed: Arm Jenkins --- src/runtime/CL/CLOperator.cpp | 5 + src/runtime/CL/functions/CLActivationLayer.cpp | 21 ++-- src/runtime/CL/functions/CLConcatenateLayer.cpp | 27 ++--- .../CL/functions/CLElementWiseUnaryLayer.cpp | 133 ++++++++------------- src/runtime/CL/functions/CLReshapeLayer.cpp | 19 ++- src/runtime/CL/functions/CLSlice.cpp | 5 - src/runtime/CL/functions/CLStridedSlice.cpp | 5 - src/runtime/NEON/INEOperator.cpp | 5 + src/runtime/NEON/functions/NEActivationLayer.cpp | 5 - .../NEON/functions/NEArithmeticAddition.cpp | 4 - .../NEON/functions/NEArithmeticSubtraction.cpp | 5 - src/runtime/NEON/functions/NEConcatenateLayer.cpp | 27 ++--- .../NEON/functions/NEElementwiseOperators.cpp | 89 ++++---------- src/runtime/NEON/functions/NEPReluLayer.cpp | 21 ++-- .../NEON/functions/NEPixelWiseMultiplication.cpp | 10 -- src/runtime/NEON/functions/NEReshapeLayer.cpp | 19 ++- src/runtime/NEON/functions/NESlice.cpp | 5 - src/runtime/NEON/functions/NEStridedSlice.cpp | 5 - 18 files changed, 134 insertions(+), 276 deletions(-) (limited to 'src') diff --git a/src/runtime/CL/CLOperator.cpp b/src/runtime/CL/CLOperator.cpp index 0052f1aaf7..11ee30eae9 100644 --- a/src/runtime/CL/CLOperator.cpp +++ b/src/runtime/CL/CLOperator.cpp @@ -49,5 +49,10 @@ void ICLOperator::prepare(OperatorTensorMap constants) { ARM_COMPUTE_UNUSED(constants); } + +MemoryRequirements ICLOperator::workspace() const +{ + return {}; +} } // namespace experimental } // namespace arm_compute diff --git a/src/runtime/CL/functions/CLActivationLayer.cpp b/src/runtime/CL/functions/CLActivationLayer.cpp index 640841e1d5..784473d426 100644 --- a/src/runtime/CL/functions/CLActivationLayer.cpp +++ b/src/runtime/CL/functions/CLActivationLayer.cpp @@ -33,30 +33,25 @@ namespace arm_compute { namespace experimental { -void CLActivationLayer::configure(const CLCompileContext &compile_context, ITensorInfo *input, ITensorInfo *output, ActivationLayerInfo act_info) +void CLActivation::configure(const CLCompileContext &compile_context, ITensorInfo *input, ITensorInfo *output, ActivationLayerInfo act_info) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, act_info); _kernel = std::move(k); } -Status CLActivationLayer::validate(const ITensorInfo *input, const ITensorInfo *output, const ActivationLayerInfo &act_info) +Status CLActivation::validate(const ITensorInfo *input, const ITensorInfo *output, const ActivationLayerInfo &act_info) { return CLActivationLayerKernel::validate(input, output, act_info); } - -MemoryRequirements CLActivationLayer::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct CLActivationLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - CLRuntimeContext *ctx{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + CLRuntimeContext *ctx{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLActivationLayer::CLActivationLayer(CLRuntimeContext *ctx) @@ -83,13 +78,13 @@ void CLActivationLayer::configure(const CLCompileContext &compile_context, ICLTe _impl->src = input; _impl->dst = output == nullptr ? input : output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, _impl->src->info(), _impl->dst->info(), act_info); } Status CLActivationLayer::validate(const ITensorInfo *input, const ITensorInfo *output, const ActivationLayerInfo &act_info) { - return experimental::CLActivationLayer::validate(input, output, act_info); + return experimental::CLActivation::validate(input, output, act_info); } void CLActivationLayer::run() diff --git a/src/runtime/CL/functions/CLConcatenateLayer.cpp b/src/runtime/CL/functions/CLConcatenateLayer.cpp index 06903d2ff2..1ddda021bc 100644 --- a/src/runtime/CL/functions/CLConcatenateLayer.cpp +++ b/src/runtime/CL/functions/CLConcatenateLayer.cpp @@ -42,14 +42,14 @@ namespace arm_compute { namespace experimental { -CLConcatenateLayer::CLConcatenateLayer() +CLConcatenation::CLConcatenation() : _concat_kernels(), _num_inputs(0), _axis(Window::DimX) { } -void CLConcatenateLayer::configure(const CLCompileContext &compile_context, const std::vector &inputs_vector, ITensorInfo *output, size_t axis) +void CLConcatenation::configure(const CLCompileContext &compile_context, const std::vector &inputs_vector, ITensorInfo *output, size_t axis) { ARM_COMPUTE_ERROR_ON(output == nullptr); _axis = axis; @@ -143,7 +143,7 @@ void CLConcatenateLayer::configure(const CLCompileContext &compile_context, cons } } -Status CLConcatenateLayer::validate(const std::vector &inputs_vector, const ITensorInfo *output, size_t axis) +Status CLConcatenation::validate(const std::vector &inputs_vector, const ITensorInfo *output, size_t axis) { ARM_COMPUTE_RETURN_ERROR_ON(output == nullptr); const unsigned int num_inputs = inputs_vector.size(); @@ -220,12 +220,7 @@ Status CLConcatenateLayer::validate(const std::vector &inpu return Status{}; } -MemoryRequirements CLConcatenateLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void CLConcatenateLayer::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace) +void CLConcatenation::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace) { ARM_COMPUTE_UNUSED(workspace); @@ -259,11 +254,11 @@ void CLConcatenateLayer::run(InputTensorMap inputs, OutputTensorMap outputs, Ope struct CLConcatenateLayer::Impl { - std::vector srcs{}; - ICLTensor *dst{ nullptr }; - unsigned int num_inputs{ 0 }; - unsigned int axis{ 0 }; - std::unique_ptr op{ nullptr }; + std::vector srcs{}; + ICLTensor *dst{ nullptr }; + unsigned int num_inputs{ 0 }; + unsigned int axis{ 0 }; + std::unique_ptr op{ nullptr }; }; CLConcatenateLayer::CLConcatenateLayer() @@ -290,7 +285,7 @@ void CLConcatenateLayer::configure(const CLCompileContext &compile_context, std: _impl->dst = output; _impl->axis = axis; _impl->num_inputs = inputs_vector.size(); - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); std::vector inputs_vector_info; for(unsigned int i = 0; i < inputs_vector.size(); ++i) @@ -303,7 +298,7 @@ void CLConcatenateLayer::configure(const CLCompileContext &compile_context, std: Status CLConcatenateLayer::validate(const std::vector &inputs_vector, const ITensorInfo *output, size_t axis) { - return experimental::CLConcatenateLayer::validate(inputs_vector, output, axis); + return experimental::CLConcatenation::validate(inputs_vector, output, axis); } void CLConcatenateLayer::run() diff --git a/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp b/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp index 402b9648a7..f8e9694b1c 100644 --- a/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp +++ b/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp @@ -32,131 +32,96 @@ namespace arm_compute { namespace experimental { -void CLRsqrtLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLRsqrt::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, ElementWiseUnary::RSQRT); _kernel = std::move(k); } -Status CLRsqrtLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLRsqrt::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::RSQRT); } -MemoryRequirements CLRsqrtLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void CLExpLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLExp::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, ElementWiseUnary::EXP); _kernel = std::move(k); } -Status CLExpLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLExp::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::EXP); } -MemoryRequirements CLExpLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void CLNegLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLNeg::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, ElementWiseUnary::NEG); _kernel = std::move(k); } -Status CLNegLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLNeg::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::NEG); } -MemoryRequirements CLNegLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void CLSinLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLSin::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, ElementWiseUnary::SIN); _kernel = std::move(k); } -Status CLSinLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLSin::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::SIN); } -MemoryRequirements CLSinLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void CLAbsLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLAbs::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, ElementWiseUnary::ABS); _kernel = std::move(k); } -Status CLAbsLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLAbs::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::ABS); } -MemoryRequirements CLAbsLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void CLLogLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLLog::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, ElementWiseUnary::LOG); _kernel = std::move(k); } -Status CLLogLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLLog::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::LOG); } -MemoryRequirements CLLogLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void CLRoundLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLRound::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output, ElementWiseUnary::ROUND); _kernel = std::move(k); } -Status CLRoundLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLRound::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::ROUND); } - -MemoryRequirements CLRoundLayer::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct CLRsqrtLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLRsqrtLayer::CLRsqrtLayer() @@ -177,13 +142,13 @@ void CLRsqrtLayer::configure(const CLCompileContext &compile_context, const ICLT { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLRsqrtLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { - return experimental::CLRsqrtLayer::validate(input, output); + return experimental::CLRsqrt::validate(input, output); } void CLRsqrtLayer::run() @@ -196,9 +161,9 @@ void CLRsqrtLayer::run() struct CLExpLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLExpLayer::CLExpLayer() @@ -219,13 +184,13 @@ void CLExpLayer::configure(const CLCompileContext &compile_context, const ICLTen { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLExpLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { - return experimental::CLExpLayer::validate(input, output); + return experimental::CLExp::validate(input, output); } void CLExpLayer::run() @@ -238,9 +203,9 @@ void CLExpLayer::run() struct CLNegLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLNegLayer::CLNegLayer() @@ -261,12 +226,12 @@ void CLNegLayer::configure(const CLCompileContext &compile_context, const ICLTen { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLNegLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { - return experimental::CLNegLayer::validate(input, output); + return experimental::CLNeg::validate(input, output); } void CLNegLayer::run() @@ -279,9 +244,9 @@ void CLNegLayer::run() struct CLSinLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLSinLayer::CLSinLayer() @@ -302,12 +267,12 @@ void CLSinLayer::configure(const CLCompileContext &compile_context, const ICLTen { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLSinLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { - return experimental::CLSinLayer::validate(input, output); + return experimental::CLSin::validate(input, output); } void CLSinLayer::run() @@ -320,9 +285,9 @@ void CLSinLayer::run() struct CLAbsLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLAbsLayer::CLAbsLayer() @@ -343,12 +308,12 @@ void CLAbsLayer::configure(const CLCompileContext &compile_context, const ICLTen { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLAbsLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { - return experimental::CLAbsLayer::validate(input, output); + return experimental::CLAbs::validate(input, output); } void CLAbsLayer::run() @@ -361,9 +326,9 @@ void CLAbsLayer::run() struct CLLogLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLLogLayer::CLLogLayer() @@ -384,12 +349,12 @@ void CLLogLayer::configure(const CLCompileContext &compile_context, const ICLTen { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLLogLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { - return experimental::CLLogLayer::validate(input, output); + return experimental::CLLog::validate(input, output); } void CLLogLayer::run() @@ -402,9 +367,9 @@ void CLLogLayer::run() struct CLRoundLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLRoundLayer::CLRoundLayer() @@ -425,12 +390,12 @@ void CLRoundLayer::configure(const CLCompileContext &compile_context, const ICLT { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLRoundLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { - return experimental::CLRoundLayer::validate(input, output); + return experimental::CLRound::validate(input, output); } void CLRoundLayer::run() diff --git a/src/runtime/CL/functions/CLReshapeLayer.cpp b/src/runtime/CL/functions/CLReshapeLayer.cpp index d75e798183..ac8b176963 100644 --- a/src/runtime/CL/functions/CLReshapeLayer.cpp +++ b/src/runtime/CL/functions/CLReshapeLayer.cpp @@ -32,29 +32,24 @@ namespace arm_compute { namespace experimental { -void CLReshapeLayer::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) +void CLReshape::configure(const CLCompileContext &compile_context, const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(compile_context, input, output); _kernel = std::move(k); } -Status CLReshapeLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status CLReshape::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::CLReshapeLayerKernel::validate(input, output); } - -MemoryRequirements CLReshapeLayer::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct CLReshapeLayer::Impl { - const ICLTensor *src{ nullptr }; - ICLTensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ICLTensor *src{ nullptr }; + ICLTensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; CLReshapeLayer::CLReshapeLayer() @@ -75,14 +70,14 @@ void CLReshapeLayer::configure(const CLCompileContext &compile_context, const IC { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(compile_context, input->info(), output->info()); } Status CLReshapeLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, output); - ARM_COMPUTE_RETURN_ON_ERROR(experimental::CLReshapeLayer::validate(input, output)); + ARM_COMPUTE_RETURN_ON_ERROR(experimental::CLReshape::validate(input, output)); return Status{}; } diff --git a/src/runtime/CL/functions/CLSlice.cpp b/src/runtime/CL/functions/CLSlice.cpp index b60daeee44..3689707bd0 100644 --- a/src/runtime/CL/functions/CLSlice.cpp +++ b/src/runtime/CL/functions/CLSlice.cpp @@ -60,11 +60,6 @@ Status CLSlice::validate(const ITensorInfo *input, const ITensorInfo *output, co return CLStridedSliceKernel::validate(input, output, starts, ends, BiStrides(), 0, slice_end_mask, 0); } - -MemoryRequirements CLSlice::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct CLSlice::Impl diff --git a/src/runtime/CL/functions/CLStridedSlice.cpp b/src/runtime/CL/functions/CLStridedSlice.cpp index d1b16700ff..bdef0785ec 100644 --- a/src/runtime/CL/functions/CLStridedSlice.cpp +++ b/src/runtime/CL/functions/CLStridedSlice.cpp @@ -47,11 +47,6 @@ Status CLStridedSlice::validate(const ITensorInfo *input, const ITensorInfo *out { return CLStridedSliceKernel::validate(input, output, starts, ends, strides, begin_mask, end_mask, shrink_axis_mask); } - -MemoryRequirements CLStridedSlice::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct CLStridedSlice::Impl diff --git a/src/runtime/NEON/INEOperator.cpp b/src/runtime/NEON/INEOperator.cpp index 3ace8a6294..1d819977c8 100644 --- a/src/runtime/NEON/INEOperator.cpp +++ b/src/runtime/NEON/INEOperator.cpp @@ -49,5 +49,10 @@ void INEOperator::prepare(OperatorTensorMap constants) { ARM_COMPUTE_UNUSED(constants); } + +MemoryRequirements INEOperator::workspace() const +{ + return {}; +} } // namespace experimental } // namespace arm_compute diff --git a/src/runtime/NEON/functions/NEActivationLayer.cpp b/src/runtime/NEON/functions/NEActivationLayer.cpp index afa220fd72..0e75e58b3b 100644 --- a/src/runtime/NEON/functions/NEActivationLayer.cpp +++ b/src/runtime/NEON/functions/NEActivationLayer.cpp @@ -45,11 +45,6 @@ Status NEActivationLayer::validate(const ITensorInfo *input, const ITensorInfo * { return NEActivationLayerKernel::validate(input, output, activation_info); } - -MemoryRequirements NEActivationLayer::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct NEActivationLayer::Impl diff --git a/src/runtime/NEON/functions/NEArithmeticAddition.cpp b/src/runtime/NEON/functions/NEArithmeticAddition.cpp index 95cee0e1ef..b18309ef1d 100644 --- a/src/runtime/NEON/functions/NEArithmeticAddition.cpp +++ b/src/runtime/NEON/functions/NEArithmeticAddition.cpp @@ -45,10 +45,6 @@ Status NEArithmeticAddition::validate(const ITensorInfo *input1, const ITensorIn ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEArithmeticAdditionKernel::validate(input1, input2, output, policy); } -MemoryRequirements NEArithmeticAddition::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct NEArithmeticAddition::Impl diff --git a/src/runtime/NEON/functions/NEArithmeticSubtraction.cpp b/src/runtime/NEON/functions/NEArithmeticSubtraction.cpp index a69e78def3..c7f492bcbc 100644 --- a/src/runtime/NEON/functions/NEArithmeticSubtraction.cpp +++ b/src/runtime/NEON/functions/NEArithmeticSubtraction.cpp @@ -46,11 +46,6 @@ Status NEArithmeticSubtraction::validate(const ITensorInfo *input1, const ITenso ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEArithmeticSubtractionKernel::validate(input1, input2, output, policy); } - -MemoryRequirements NEArithmeticSubtraction::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct NEArithmeticSubtraction::Impl diff --git a/src/runtime/NEON/functions/NEConcatenateLayer.cpp b/src/runtime/NEON/functions/NEConcatenateLayer.cpp index 37cdd15529..9f8a2a1b8e 100644 --- a/src/runtime/NEON/functions/NEConcatenateLayer.cpp +++ b/src/runtime/NEON/functions/NEConcatenateLayer.cpp @@ -41,12 +41,12 @@ namespace arm_compute { namespace experimental { -NEConcatenateLayer::NEConcatenateLayer() +NEConcatenation::NEConcatenation() : _concat_kernels(), _num_inputs(0), _axis(0) { } -void NEConcatenateLayer::configure(const std::vector &inputs_vector, ITensorInfo *output, size_t axis) +void NEConcatenation::configure(const std::vector &inputs_vector, ITensorInfo *output, size_t axis) { ARM_COMPUTE_ERROR_ON(output == nullptr); @@ -100,7 +100,7 @@ void NEConcatenateLayer::configure(const std::vector &input } } -Status NEConcatenateLayer::validate(const std::vector &inputs_vector, const ITensorInfo *output, size_t axis) +Status NEConcatenation::validate(const std::vector &inputs_vector, const ITensorInfo *output, size_t axis) { ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(output); ARM_COMPUTE_RETURN_ERROR_ON(inputs_vector.size() < 2); @@ -146,12 +146,7 @@ Status NEConcatenateLayer::validate(const std::vector &inpu return Status{}; } -MemoryRequirements NEConcatenateLayer::workspace() const -{ - return MemoryRequirements{}; -} - -void NEConcatenateLayer::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace) +void NEConcatenation::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace) { ARM_COMPUTE_UNUSED(workspace); @@ -177,11 +172,11 @@ void NEConcatenateLayer::run(InputTensorMap inputs, OutputTensorMap outputs, Ope struct NEConcatenateLayer::Impl { - std::vector srcs{}; - ITensor *dst{ nullptr }; - unsigned int num_inputs{ 0 }; - unsigned int axis{ 0 }; - std::unique_ptr op{ nullptr }; + std::vector srcs{}; + ITensor *dst{ nullptr }; + unsigned int num_inputs{ 0 }; + unsigned int axis{ 0 }; + std::unique_ptr op{ nullptr }; }; NEConcatenateLayer::NEConcatenateLayer() @@ -203,7 +198,7 @@ void NEConcatenateLayer::configure(std::vector inputs_vector, I _impl->dst = output; _impl->axis = axis; _impl->num_inputs = inputs_vector.size(); - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); std::vector inputs_vector_info; for(unsigned int i = 0; i < inputs_vector.size(); ++i) @@ -216,7 +211,7 @@ void NEConcatenateLayer::configure(std::vector inputs_vector, I Status NEConcatenateLayer::validate(const std::vector &inputs_vector, const ITensorInfo *output, size_t axis) { - return experimental::NEConcatenateLayer::validate(inputs_vector, output, axis); + return experimental::NEConcatenation::validate(inputs_vector, output, axis); } void NEConcatenateLayer::run() diff --git a/src/runtime/NEON/functions/NEElementwiseOperators.cpp b/src/runtime/NEON/functions/NEElementwiseOperators.cpp index 28039d68f8..9340cc09d4 100644 --- a/src/runtime/NEON/functions/NEElementwiseOperators.cpp +++ b/src/runtime/NEON/functions/NEElementwiseOperators.cpp @@ -34,101 +34,66 @@ namespace arm_compute { namespace experimental { -void NEElementwiseMax::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info) +void NEElementwiseMax::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_UNUSED(act_info); auto k = arm_compute::support::cpp14::make_unique(); k->configure(ArithmeticOperation::MAX, input1, input2, output); _kernel = std::move(k); } -Status NEElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) +Status NEElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) { - ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEArithmeticOperationKernel::validate(ArithmeticOperation::MAX, input1, input2, output); } -MemoryRequirements NEElementwiseMax::workspace() const -{ - return MemoryRequirements{}; -} - -void NEElementwiseMin::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info) +void NEElementwiseMin::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_UNUSED(act_info); auto k = arm_compute::support::cpp14::make_unique(); k->configure(ArithmeticOperation::MIN, input1, input2, output); _kernel = std::move(k); } -Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) +Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) { - ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEArithmeticOperationKernel::validate(ArithmeticOperation::MIN, input1, input2, output); } -MemoryRequirements NEElementwiseMin::workspace() const -{ - return MemoryRequirements{}; -} - -void NEElementwiseSquaredDiff::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info) +void NEElementwiseSquaredDiff::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_UNUSED(act_info); auto k = arm_compute::support::cpp14::make_unique(); k->configure(ArithmeticOperation::SQUARED_DIFF, input1, input2, output); _kernel = std::move(k); } -Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) +Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) { - ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEArithmeticOperationKernel::validate(ArithmeticOperation::SQUARED_DIFF, input1, input2, output); } -MemoryRequirements NEElementwiseSquaredDiff::workspace() const -{ - return MemoryRequirements{}; -} - -void NEElementwiseDivision::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info) +void NEElementwiseDivision::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_UNUSED(act_info); auto k = arm_compute::support::cpp14::make_unique(); k->configure(input1, input2, output); _kernel = std::move(k); } -Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) +Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) { - ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEDivisionOperationKernel::validate(input1, input2, output); } -MemoryRequirements NEElementwiseDivision::workspace() const +void NEElementwisePower::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - return MemoryRequirements{}; -} - -void NEElementwisePower::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info) -{ - ARM_COMPUTE_UNUSED(act_info); auto k = arm_compute::support::cpp14::make_unique(); k->configure(input1, input2, output); _kernel = std::move(k); } -Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) +Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) { - ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEPowerOperationKernel::validate(input1, input2, output); } -MemoryRequirements NEElementwisePower::workspace() const -{ - return MemoryRequirements{}; -} - template void NEElementwiseComparisonStatic::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { @@ -143,12 +108,6 @@ Status NEElementwiseComparisonStatic::validate(const ITensorInfo *input1, c return NEComparisonOperationKernel::validate(COP, input1, input2, output); } -template -MemoryRequirements NEElementwiseComparisonStatic::workspace() const -{ - return MemoryRequirements{}; -} - void NEElementwiseComparison::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, ComparisonOperation op) { auto k = arm_compute::support::cpp14::make_unique(); @@ -161,11 +120,6 @@ Status NEElementwiseComparison::validate(const ITensorInfo *input1, const ITenso return NEComparisonOperationKernel::validate(op, input1, input2, output); } -MemoryRequirements NEElementwiseComparison::workspace() const -{ - return MemoryRequirements{}; -} - // Supported Specializations template class NEElementwiseComparisonStatic; template class NEElementwiseComparisonStatic; @@ -193,17 +147,18 @@ NEElementwiseMax::~NEElementwiseMax() = default; void NEElementwiseMax::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info) { + ARM_COMPUTE_UNUSED(act_info); _impl->src_0 = input1; _impl->src_1 = input2; _impl->dst = output; _impl->op = arm_compute::support::cpp14::make_unique(); - _impl->op->configure(input1->info(), input2->info(), output->info(), act_info); + _impl->op->configure(input1->info(), input2->info(), output->info()); } Status NEElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) { ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); - return experimental::NEElementwiseMax::validate(input1, input2, output, act_info); + return experimental::NEElementwiseMax::validate(input1, input2, output); } void NEElementwiseMax::run() @@ -231,17 +186,18 @@ NEElementwiseMin::~NEElementwiseMin() = default; void NEElementwiseMin::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info) { + ARM_COMPUTE_UNUSED(act_info); _impl->src_0 = input1; _impl->src_1 = input2; _impl->dst = output; _impl->op = arm_compute::support::cpp14::make_unique(); - _impl->op->configure(input1->info(), input2->info(), output->info(), act_info); + _impl->op->configure(input1->info(), input2->info(), output->info()); } Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) { ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); - return experimental::NEElementwiseMin::validate(input1, input2, output, act_info); + return experimental::NEElementwiseMin::validate(input1, input2, output); } void NEElementwiseMin::run() @@ -269,17 +225,18 @@ NEElementwiseSquaredDiff::~NEElementwiseSquaredDiff() void NEElementwiseSquaredDiff::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info) { + ARM_COMPUTE_UNUSED(act_info); _impl->src_0 = input1; _impl->src_1 = input2; _impl->dst = output; _impl->op = arm_compute::support::cpp14::make_unique(); - _impl->op->configure(input1->info(), input2->info(), output->info(), act_info); + _impl->op->configure(input1->info(), input2->info(), output->info()); } Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) { ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); - return experimental::NEElementwiseSquaredDiff::validate(input1, input2, output, act_info); + return experimental::NEElementwiseSquaredDiff::validate(input1, input2, output); } void NEElementwiseSquaredDiff::run() @@ -312,13 +269,13 @@ void NEElementwiseDivision::configure(ITensor *input1, ITensor *input2, ITensor _impl->src_1 = input2; _impl->dst = output; _impl->op = arm_compute::support::cpp14::make_unique(); - _impl->op->configure(input1->info(), input2->info(), output->info(), act_info); + _impl->op->configure(input1->info(), input2->info(), output->info()); } Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) { ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); - return experimental::NEElementwiseDivision::validate(input1, input2, output, act_info); + return experimental::NEElementwiseDivision::validate(input1, input2, output); } void NEElementwiseDivision::run() @@ -351,13 +308,13 @@ void NEElementwisePower::configure(ITensor *input1, ITensor *input2, ITensor *ou _impl->src_1 = input2; _impl->dst = output; _impl->op = arm_compute::support::cpp14::make_unique(); - _impl->op->configure(input1->info(), input2->info(), output->info(), act_info); + _impl->op->configure(input1->info(), input2->info(), output->info()); } Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info) { ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); - return experimental::NEElementwisePower::validate(input1, input2, output, act_info); + return experimental::NEElementwisePower::validate(input1, input2, output); } void NEElementwisePower::run() diff --git a/src/runtime/NEON/functions/NEPReluLayer.cpp b/src/runtime/NEON/functions/NEPReluLayer.cpp index c54c70615a..15d9fd9959 100644 --- a/src/runtime/NEON/functions/NEPReluLayer.cpp +++ b/src/runtime/NEON/functions/NEPReluLayer.cpp @@ -31,30 +31,25 @@ namespace arm_compute { namespace experimental { -void NEPReluLayer::configure(const ITensorInfo *input, const ITensorInfo *alpha, ITensorInfo *output) +void NEPRelu::configure(const ITensorInfo *input, const ITensorInfo *alpha, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(ArithmeticOperation::PRELU, input, alpha, output); _kernel = std::move(k); } -Status NEPReluLayer::validate(const ITensorInfo *input, const ITensorInfo *alpha, const ITensorInfo *output) +Status NEPRelu::validate(const ITensorInfo *input, const ITensorInfo *alpha, const ITensorInfo *output) { return NEArithmeticOperationKernel::validate(ArithmeticOperation::PRELU, input, alpha, output); } - -MemoryRequirements NEPReluLayer::workspace() const -{ - return MemoryRequirements{}; -} } // nsamespace experimental struct NEPReluLayer::Impl { - const ITensor *src_0{ nullptr }; - const ITensor *src_1{ nullptr }; - ITensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ITensor *src_0{ nullptr }; + const ITensor *src_1{ nullptr }; + ITensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; NEPReluLayer::NEPReluLayer() @@ -70,7 +65,7 @@ void NEPReluLayer::configure(const ITensor *input, const ITensor *alpha, ITensor _impl->src_0 = input; _impl->src_1 = alpha; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(input->info(), alpha->info(), output->info()); } @@ -83,6 +78,6 @@ void NEPReluLayer::run() Status NEPReluLayer::validate(const ITensorInfo *input, const ITensorInfo *alpha, const ITensorInfo *output) { - return experimental::NEPReluLayer::validate(input, alpha, output); + return experimental::NEPRelu::validate(input, alpha, output); } } // namespace arm_compute diff --git a/src/runtime/NEON/functions/NEPixelWiseMultiplication.cpp b/src/runtime/NEON/functions/NEPixelWiseMultiplication.cpp index 3d51e0d0fd..ba5dd7cdee 100644 --- a/src/runtime/NEON/functions/NEPixelWiseMultiplication.cpp +++ b/src/runtime/NEON/functions/NEPixelWiseMultiplication.cpp @@ -48,11 +48,6 @@ Status NEPixelWiseMultiplication::validate(const ITensorInfo *input1, const ITen return NEPixelWiseMultiplicationKernel::validate(input1, input2, output, scale, overflow_policy, rounding_policy); } -MemoryRequirements NEPixelWiseMultiplication::workspace() const -{ - return MemoryRequirements{}; -} - void NEComplexPixelWiseMultiplication::configure(ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info) { ARM_COMPUTE_UNUSED(act_info); @@ -66,11 +61,6 @@ Status NEComplexPixelWiseMultiplication::validate(const ITensorInfo *input1, con ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled()); return NEComplexPixelWiseMultiplicationKernel::validate(input1, input2, output); } - -MemoryRequirements NEComplexPixelWiseMultiplication::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct NEPixelWiseMultiplication::Impl diff --git a/src/runtime/NEON/functions/NEReshapeLayer.cpp b/src/runtime/NEON/functions/NEReshapeLayer.cpp index 101fdbdf4d..47d5519274 100644 --- a/src/runtime/NEON/functions/NEReshapeLayer.cpp +++ b/src/runtime/NEON/functions/NEReshapeLayer.cpp @@ -35,29 +35,24 @@ namespace arm_compute { namespace experimental { -void NEReshapeLayer::configure(const ITensorInfo *input, ITensorInfo *output) +void NEReshape::configure(const ITensorInfo *input, ITensorInfo *output) { auto k = arm_compute::support::cpp14::make_unique(); k->configure(input, output); _kernel = std::move(k); } -Status NEReshapeLayer::validate(const ITensorInfo *input, const ITensorInfo *output) +Status NEReshape::validate(const ITensorInfo *input, const ITensorInfo *output) { return arm_compute::NEReshapeLayerKernel::validate(input, output); } - -MemoryRequirements NEReshapeLayer::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct NEReshapeLayer::Impl { - const ITensor *src{ nullptr }; - ITensor *dst{ nullptr }; - std::unique_ptr op{ nullptr }; + const ITensor *src{ nullptr }; + ITensor *dst{ nullptr }; + std::unique_ptr op{ nullptr }; }; NEReshapeLayer::NEReshapeLayer() @@ -75,14 +70,14 @@ void NEReshapeLayer::configure(const ITensor *input, ITensor *output) { _impl->src = input; _impl->dst = output; - _impl->op = arm_compute::support::cpp14::make_unique(); + _impl->op = arm_compute::support::cpp14::make_unique(); _impl->op->configure(input->info(), output->info()); } Status NEReshapeLayer::validate(const ITensorInfo *input, const ITensorInfo *output) { ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, output); - ARM_COMPUTE_RETURN_ON_ERROR(experimental::NEReshapeLayer::validate(input, output)); + ARM_COMPUTE_RETURN_ON_ERROR(experimental::NEReshape::validate(input, output)); return Status{}; } diff --git a/src/runtime/NEON/functions/NESlice.cpp b/src/runtime/NEON/functions/NESlice.cpp index 15fbe8d432..7c3252178b 100644 --- a/src/runtime/NEON/functions/NESlice.cpp +++ b/src/runtime/NEON/functions/NESlice.cpp @@ -62,11 +62,6 @@ Status NESlice::validate(const ITensorInfo *input, const ITensorInfo *output, co return NEStridedSliceKernel::validate(input, output, starts, ends, BiStrides(), 0, slice_end_mask, 0); } - -MemoryRequirements NESlice::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct NESlice::Impl diff --git a/src/runtime/NEON/functions/NEStridedSlice.cpp b/src/runtime/NEON/functions/NEStridedSlice.cpp index 243c01780c..37e3590446 100644 --- a/src/runtime/NEON/functions/NEStridedSlice.cpp +++ b/src/runtime/NEON/functions/NEStridedSlice.cpp @@ -47,11 +47,6 @@ Status NEStridedSlice::validate(const ITensorInfo *input, const ITensorInfo *out { return NEStridedSliceKernel::validate(input, output, starts, ends, strides, begin_mask, end_mask, shrink_axis_mask); } - -MemoryRequirements NEStridedSlice::workspace() const -{ - return MemoryRequirements{}; -} } // namespace experimental struct NEStridedSlice::Impl -- cgit v1.2.1