From 27e67f0b2047cfa2f011f9e242e3068d9e106b39 Mon Sep 17 00:00:00 2001 From: Michalis Spyrou Date: Tue, 16 Feb 2021 11:34:39 +0000 Subject: Remove Compute Vision Neon support Resolves COMPMID-4150 Change-Id: I316e8ab97de796666c71eadfde894715fcf4a1aa Signed-off-by: Michalis Spyrou Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/5141 Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio Comments-Addressed: Arm Jenkins --- src/core/NEON/kernels/NEThresholdKernel.cpp | 217 ---------------------------- 1 file changed, 217 deletions(-) delete mode 100644 src/core/NEON/kernels/NEThresholdKernel.cpp (limited to 'src/core/NEON/kernels/NEThresholdKernel.cpp') diff --git a/src/core/NEON/kernels/NEThresholdKernel.cpp b/src/core/NEON/kernels/NEThresholdKernel.cpp deleted file mode 100644 index 108f29f377..0000000000 --- a/src/core/NEON/kernels/NEThresholdKernel.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2016-2021 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. - */ -#include "src/core/NEON/kernels/NEThresholdKernel.h" - -#include "arm_compute/core/Error.h" -#include "arm_compute/core/Helpers.h" -#include "arm_compute/core/ITensor.h" -#include "arm_compute/core/Validate.h" -#include "src/core/helpers/AutoConfiguration.h" -#include "src/core/helpers/WindowHelpers.h" - -#include "src/core/NEON/wrapper/wrapper.h" - -namespace arm_compute -{ -namespace -{ -Status validate_arguments(const ITensorInfo *input, const ITensorInfo *output, const ThresholdKernelInfo &info) -{ - ARM_COMPUTE_UNUSED(info); - ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input, 1, DataType::U8); - ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(output, 1, DataType::U8); - - // Checks performed when output is configured - if((output != nullptr) && (output->total_size() != 0)) - { - ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_SHAPES(input, output); - ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, output); - } - - return Status{}; -} - -std::pair validate_and_configure_window(ITensorInfo *input, ITensorInfo *output) -{ - // Configure kernel window - Window win = calculate_max_window(*input, Steps()); - - // Output auto inizialitation if not yet initialized - auto_init_if_empty(*output, *input->clone()); - - // NEThresholdKernel doesn't need padding so update_window_and_padding() can be skipped - Coordinates coord; - coord.set_num_dimensions(output->num_dimensions()); - output->set_valid_region(ValidRegion(coord, output->tensor_shape())); - - return std::make_pair(Status{}, win); -} -} // namespace - -NEThresholdKernel::NEThresholdKernel() - : _func(nullptr), _input(nullptr), _output(nullptr), _info() -{ -} - -void NEThresholdKernel::configure(const ITensor *input, ITensor *output, const ThresholdKernelInfo &info) -{ - ARM_COMPUTE_ERROR_ON_NULLPTR(input, output); - ARM_COMPUTE_ERROR_THROW_ON(validate(input->info(), output->info(), info)); - - _input = input; - _output = output; - _info = info; - - switch(_info.type) - { - case ThresholdType::BINARY: - _func = &NEThresholdKernel::run_binary; - break; - case ThresholdType::RANGE: - _func = &NEThresholdKernel::run_range; - break; - default: - ARM_COMPUTE_ERROR("Thresholding type not recognized"); - break; - } - - // Configure kernel window - auto win_config = validate_and_configure_window(input->info(), output->info()); - ARM_COMPUTE_ERROR_THROW_ON(win_config.first); - ICPPKernel::configure(win_config.second); -} - -Status NEThresholdKernel::validate(const ITensorInfo *input, const ITensorInfo *output, const ThresholdKernelInfo &info) -{ - ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(input, output, info)); - ARM_COMPUTE_RETURN_ON_ERROR(validate_and_configure_window(input->clone().get(), output->clone().get()).first); - - return Status{}; -} - -inline void NEThresholdKernel::run_binary(const Window &window) -{ - /** Neon vector tag type. */ - using Type = uint8_t; - using ExactTagType = typename wrapper::traits::neon_bitvector_tag_t; - - const int window_step_x = 16 / sizeof(Type); - const auto window_start_x = static_cast(window.x().start()); - const auto window_end_x = static_cast(window.x().end()); - - Window win_collapsed = window.collapse_if_possible(window, Window::DimZ); - win_collapsed.set(Window::DimX, Window::Dimension(0, 1, 1)); - - const uint8_t threshold = _info.threshold; - const uint8_t true_value = _info.true_value; - const uint8_t false_value = _info.false_value; - - const auto vthreshold = wrapper::vdup_n(threshold, ExactTagType{}); - const auto vtrue_value = wrapper::vdup_n(true_value, ExactTagType{}); - const auto vfalse_value = wrapper::vdup_n(false_value, ExactTagType{}); - - Iterator input(_input, win_collapsed); - Iterator output(_output, win_collapsed); - - execute_window_loop(win_collapsed, [&](const Coordinates &) - { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for(; x <= (window_end_x - window_step_x); x += window_step_x) - { - const auto vdata = wrapper::vloadq(input_ptr + x); - const auto vmask = wrapper::vcgt(vdata, vthreshold); - wrapper::vstore(output_ptr + x, wrapper::vbsl(vmask, vtrue_value, vfalse_value)); - } - - for(; x < window_end_x; ++x) - { - const Type data = *(reinterpret_cast(input_ptr + x)); - *(output_ptr + x) = (data > threshold) ? true_value : false_value; - } - }, - input, output); -} - -inline void NEThresholdKernel::run_range(const Window &window) -{ - /** Neon vector tag type. */ - using Type = uint8_t; - using ExactTagType = typename wrapper::traits::neon_bitvector_tag_t; - - const int window_step_x = 16 / sizeof(Type); - const auto window_start_x = static_cast(window.x().start()); - const auto window_end_x = static_cast(window.x().end()); - - Window win_collapsed = window.collapse_if_possible(window, Window::DimZ); - win_collapsed.set(Window::DimX, Window::Dimension(0, 1, 1)); - - const uint8_t lower_threshold = _info.threshold; - const uint8_t upper_threshold = _info.upper; - const uint8_t true_value = _info.true_value; - const uint8_t false_value = _info.false_value; - - const auto vlower_threshold = wrapper::vdup_n(lower_threshold, ExactTagType{}); - const auto vupper_threshold = wrapper::vdup_n(upper_threshold, ExactTagType{}); - const auto vtrue_value = wrapper::vdup_n(true_value, ExactTagType{}); - const auto vfalse_value = wrapper::vdup_n(false_value, ExactTagType{}); - - Iterator input(_input, win_collapsed); - Iterator output(_output, win_collapsed); - - execute_window_loop(win_collapsed, [&](const Coordinates &) - { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for(; x <= (window_end_x - window_step_x); x += window_step_x) - { - const auto vdata = wrapper::vloadq(input_ptr + x); - auto vmask = wrapper::vcle(vdata, vupper_threshold); - vmask = wrapper::vand(wrapper::vcge(vdata, vlower_threshold), vmask); - wrapper::vstore(output_ptr + x, wrapper::vbsl(vmask, vtrue_value, vfalse_value)); - } - - for(; x < window_end_x; ++x) - { - const Type data = *(reinterpret_cast(input_ptr + x)); - *(output_ptr + x) = (data <= upper_threshold && data >= lower_threshold) ? true_value : false_value; - } - }, - input, output); -} - -void NEThresholdKernel::run(const Window &window, const ThreadInfo &info) -{ - ARM_COMPUTE_UNUSED(info); - ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); - ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(INEKernel::window(), window); - ARM_COMPUTE_ERROR_ON(_func == nullptr); - - (this->*_func)(window); -} -} // namespace arm_compute -- cgit v1.2.1