From c41a6a611973cb245220641e06f8fa984b156954 Mon Sep 17 00:00:00 2001 From: Michele Di Giorgio Date: Tue, 16 Jun 2020 16:21:00 +0100 Subject: COMPMID-3530: Fix validate calls in CLElementwiseOperationKernel Change-Id: I315520ca825e2a420bb28308f020b95ff2969042 Signed-off-by: Michele Di Giorgio Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3341 Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins Reviewed-by: Georgios Pinitas --- .../core/CL/kernels/CLElementwiseOperationKernel.h | 10 --------- .../CL/kernels/CLElementwiseOperationKernel.cpp | 26 +++++----------------- tests/validation/CL/ArithmeticAddition.cpp | 25 +++++++++++++++++++++ 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/arm_compute/core/CL/kernels/CLElementwiseOperationKernel.h b/arm_compute/core/CL/kernels/CLElementwiseOperationKernel.h index 4d3d4bc834..1c874c577c 100644 --- a/arm_compute/core/CL/kernels/CLElementwiseOperationKernel.h +++ b/arm_compute/core/CL/kernels/CLElementwiseOperationKernel.h @@ -72,14 +72,6 @@ protected: */ virtual std::pair validate_and_configure_window(ITensorInfo &input1, ITensorInfo &input2, ITensorInfo &output) = 0; - /** Validate the argument passed to the kernel - * - * @param[in] input1 First tensor input. Data types supported: U8/S8/QASYMM8/QASYMM8_SIGNED/U16/S16/F16/U32/S32/F32. - * @param[in] input2 Second tensor input. Data types supported: Same as @p input1. - * @param[in] output Output tensor. Data types supported: Same as @p input1. - */ - virtual Status validate_arguments(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) = 0; - /** Generate the build options for the specific kernel * * @reutrn a CLBuildOptions struct @@ -159,7 +151,6 @@ protected: // Inherited methods overridden: std::string name() override; std::pair validate_and_configure_window(ITensorInfo &input1, ITensorInfo &input2, ITensorInfo &output) override; - Status validate_arguments(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) override; CLBuildOptions generate_build_options(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) override; std::string generate_id_for_tuning(const std::string &kernel_name, const ITensorInfo &input1, const ITensorInfo &output) override; @@ -213,7 +204,6 @@ protected: // Inherited methods overridden: std::string name() override; std::pair validate_and_configure_window(ITensorInfo &input1, ITensorInfo &input2, ITensorInfo &output) override; - Status validate_arguments(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) override; CLBuildOptions generate_build_options(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) override; std::string generate_id_for_tuning(const std::string &kernel_name, const ITensorInfo &input1, const ITensorInfo &output) override; diff --git a/src/core/CL/kernels/CLElementwiseOperationKernel.cpp b/src/core/CL/kernels/CLElementwiseOperationKernel.cpp index 4e7d3b3753..33f27a8c36 100644 --- a/src/core/CL/kernels/CLElementwiseOperationKernel.cpp +++ b/src/core/CL/kernels/CLElementwiseOperationKernel.cpp @@ -248,9 +248,6 @@ void CLElementwiseOperationKernel::configure_common(const ICLTensor *input1, con void CLElementwiseOperationKernel::configure_common(const CLCompileContext &compile_context, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output) { - ARM_COMPUTE_ERROR_ON_NULLPTR(input1, input2, output); - ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1->info(), *input2->info(), *output->info())); - // Configure kernel window auto win_config = validate_and_configure_window(*input1->info(), *input2->info(), *output->info()); ARM_COMPUTE_ERROR_THROW_ON(win_config.first); @@ -347,6 +344,9 @@ void CLSaturatedArithmeticOperationKernel::configure(const CLCompileContext &com const ConvertPolicy &policy, const ActivationLayerInfo &act_info) { + ARM_COMPUTE_ERROR_ON_NULLPTR(input1, input2, output); + ARM_COMPUTE_ERROR_THROW_ON(CLSaturatedArithmeticOperationKernel::validate(op, input1->info(), input2->info(), output->info(), policy, act_info)); + _policy = policy; _op = op; _act_info = act_info; @@ -370,11 +370,6 @@ std::pair CLSaturatedArithmeticOperationKernel::validate_and_con return validate_and_configure_window_for_arithmetic_operators(input1, input2, output); } -Status CLSaturatedArithmeticOperationKernel::validate_arguments(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) -{ - return validate_arguments_with_arithmetic_rules(input1, input2, output); -} - CLBuildOptions CLSaturatedArithmeticOperationKernel::generate_build_options(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) { const bool has_float_out = is_data_type_float(output.data_type()); @@ -405,6 +400,9 @@ void CLArithmeticOperationKernel::configure(ArithmeticOperation op, const ICLTen void CLArithmeticOperationKernel::configure(const CLCompileContext &compile_context, ArithmeticOperation op, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info) { + ARM_COMPUTE_ERROR_ON_NULLPTR(input1, input2, output); + ARM_COMPUTE_ERROR_THROW_ON(CLArithmeticOperationKernel::validate(op, input1->info(), input2->info(), output->info(), act_info)); + _op = op; _act_info = act_info; configure_common(compile_context, input1, input2, output); @@ -440,18 +438,6 @@ std::pair CLArithmeticOperationKernel::validate_and_configure_wi return validate_and_configure_window_for_arithmetic_operators(input1, input2, output); } } -Status CLArithmeticOperationKernel::validate_arguments(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) -{ - if(_op == ArithmeticOperation::DIV || _op == ArithmeticOperation::POWER) - { - // Division and Power operators don't support integer arithmetic - return validate_arguments_with_float_only_supported_rules(input1, input2, output); - } - else - { - return validate_arguments_with_arithmetic_rules(input1, input2, output); - } -} CLBuildOptions CLArithmeticOperationKernel::generate_build_options(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) { diff --git a/tests/validation/CL/ArithmeticAddition.cpp b/tests/validation/CL/ArithmeticAddition.cpp index 180b1aa3b0..3e2b192e13 100644 --- a/tests/validation/CL/ArithmeticAddition.cpp +++ b/tests/validation/CL/ArithmeticAddition.cpp @@ -102,6 +102,31 @@ DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip( // clang-format on // *INDENT-ON* +/** Validate fused activation expecting the following behaviours: + * + * - Fused activation with float data type should succeed + * - Fused activation with quantized data type should fail + * + */ +TEST_CASE(FusedActivation, framework::DatasetMode::ALL) +{ + auto input = TensorInfo{ TensorShape(2U, 2U), 1, DataType::F32 }; + auto output = TensorInfo{ TensorShape(2U, 2U), 1, DataType::F32 }; + Status result{}; + + const auto act_info = ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU); + + // Fused-activation float type + result = CLArithmeticAddition::validate(&input, &input, &output, ConvertPolicy::WRAP, act_info); + ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS); + + // Fused-activation quantized type + input.set_data_type(DataType::QASYMM8); + output.set_data_type(DataType::QASYMM8); + result = CLArithmeticAddition::validate(&input, &input, &output, ConvertPolicy::WRAP, act_info); + ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS); +} + template using CLArithmeticAdditionFixture = ArithmeticAdditionValidationFixture; -- cgit v1.2.1