diff options
Diffstat (limited to 'arm_compute')
-rw-r--r-- | arm_compute/core/utils/helpers/tensor_transform.h | 32 | ||||
-rw-r--r-- | arm_compute/runtime/CL/CLFunctions.h | 1 | ||||
-rw-r--r-- | arm_compute/runtime/CL/functions/CLSlice.h | 69 |
3 files changed, 99 insertions, 3 deletions
diff --git a/arm_compute/core/utils/helpers/tensor_transform.h b/arm_compute/core/utils/helpers/tensor_transform.h index e5b32a5372..966c1f1fdf 100644 --- a/arm_compute/core/utils/helpers/tensor_transform.h +++ b/arm_compute/core/utils/helpers/tensor_transform.h @@ -32,12 +32,33 @@ namespace helpers { namespace tensor_transform { +/** Returns the absolute ends coordinates of slice + * + * @param[in] input_shape Input tensor shape + * @param[in] ends End coordinates + * + * @return Absolute end coordinate + */ +Coordinates slice_absolute_end_coords(TensorShape input_shape, Coordinates ends); + +/** Computes output shape of slice + * + * @warning Ends must be non-negative + * + * @param[in] input_shape Input tensor shape + * @param[in] starts Start coordinates + * @param[in] ends_abs Absolute end coordinates + * + * @return The output tensor shape + */ +TensorShape compute_slice_output_shape(TensorShape input_shape, Coordinates starts, Coordinates ends_abs); + /** Returns the absolute start coordinates of strided slice * * @param[in] input_shape Input tensor shape * @param[in] starts Start coordinates * @param[in] strides Slice strides - * @param[in] begin_mask (Optional) If the ith bit of begin_mask is set, begin[i] is ignored and + * @param[in] begin_mask (Optional) If the ith bit of begin_mask is set, starts[i] is ignored and * the fullest possible range in that dimension is used instead. * * @return Absolute start coordinates @@ -46,6 +67,8 @@ Coordinates strided_slice_absolute_start_coords(TensorShape input_shape, Coordin /** Returns the absolute ends coordinates of strided slice * + * @warning Starts must be non-negative + * * @param[in] input_shape Input tensor shape * @param[in] starts_abs Absolute start coordinates * @param[in] ends End coordinates @@ -53,7 +76,7 @@ Coordinates strided_slice_absolute_start_coords(TensorShape input_shape, Coordin * @param[in] end_mask (Optional) If the ith bit of end_mask is set, end[i] is ignored and * the fullest possible range in that dimension is used instead. * @param[in] shrink_axis_mask (Optional) If the ith bit of shrink_axis_mask is set, it implies that the ith specification shrinks the dimensionality by 1. - * A slice of size 1 starting from begin[i] in the dimension must be preserved. + * A slice of size 1 starting from starts[i] in the dimension must be preserved. * * @return Absolute end coordinates */ @@ -68,7 +91,10 @@ Coordinates strided_slice_absolute_end_coords(TensorShape input_shape, Coordinat */ Coordinates strided_slice_strides(TensorShape input_shape, Coordinates strides); -/** Computes output shape of a strided slice +/** Computes output shape of strided slice + * + * @warning Starts and ends must be non-negative + * @warning Starts, ends and final strides should have the same dimensions as the input shape * * @param[in] input_shape Input tensor shape * @param[in] starts_abs Absolute start coordinates diff --git a/arm_compute/runtime/CL/CLFunctions.h b/arm_compute/runtime/CL/CLFunctions.h index 76c2128f2c..d2bfdfd7cb 100644 --- a/arm_compute/runtime/CL/CLFunctions.h +++ b/arm_compute/runtime/CL/CLFunctions.h @@ -106,6 +106,7 @@ #include "arm_compute/runtime/CL/functions/CLReshapeLayer.h" #include "arm_compute/runtime/CL/functions/CLScale.h" #include "arm_compute/runtime/CL/functions/CLScharr3x3.h" +#include "arm_compute/runtime/CL/functions/CLSlice.h" #include "arm_compute/runtime/CL/functions/CLSobel3x3.h" #include "arm_compute/runtime/CL/functions/CLSobel5x5.h" #include "arm_compute/runtime/CL/functions/CLSobel7x7.h" diff --git a/arm_compute/runtime/CL/functions/CLSlice.h b/arm_compute/runtime/CL/functions/CLSlice.h new file mode 100644 index 0000000000..acd4f0d3ad --- /dev/null +++ b/arm_compute/runtime/CL/functions/CLSlice.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef __ARM_COMPUTE_CL_SLICE_H__ +#define __ARM_COMPUTE_CL_SLICE_H__ + +#include "arm_compute/runtime/CL/ICLSimpleFunction.h" + +namespace arm_compute +{ +// Forward Declarations +class ICLTensor; + +/** Basic function to perform tensor slicing */ +class CLSlice : public ICLSimpleFunction +{ +public: + /** Configure kernel + * + * @note Supported tensor rank: up to 4 + * @note Start indices must be non-negative. 0 <= starts[i] + * @note End coordinates can be negative, which represents the number of elements before the end of that dimension. + * @note End indices are not inclusive unless negative. + * + * @param[in] input Source tensor. Data type supported: U8/S8/QASYMM8/U16/S16/U32/S32/F16/F32 + * @param[out] output Destination tensor. Data type supported: Same as @p input + * @param[in] starts The starts of the dimensions of the input tensor to be sliced. The length must be of rank(input). + * @param[in] ends The ends of the dimensions of the input tensor to be sliced. The length must be of rank(input). + */ + void configure(const ICLTensor *input, ICLTensor *output, const Coordinates &starts, const Coordinates &ends); + + /** Static function to check if given info will lead to a valid configuration of @ref CLSlice + * + * @note Supported tensor rank: up to 4 + * @note Start indices must be non-negative. 0 <= starts[i] + * @note End coordinates can be negative, which represents the number of elements before the end of that dimension. + * @note End indices are not inclusive unless negative. + * + * @param[in] input Source tensor info. Data type supported: U8/S8/QASYMM8/U16/S16/U32/S32/F16/F32 + * @param[in] output Destination tensor info. Data type supported: Same as @p input + * @param[in] starts The starts of the dimensions of the input tensor to be sliced. The length must be of rank(input). + * @param[in] ends The ends of the dimensions of the input tensor to be sliced. The length must be of rank(input). + * + * @return A status + */ + static Status validate(const ITensorInfo *input, const ITensorInfo *output, const Coordinates &starts, const Coordinates &ends); +}; +} // namespace arm_compute +#endif /* __ARM_COMPUTE_CL_SLICE_H__ */ |