aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichele Di Giorgio <michele.digiorgio@arm.com>2020-06-16 16:21:00 +0100
committerGeorgios Pinitas <georgios.pinitas@arm.com>2020-06-25 13:14:23 +0000
commitc41a6a611973cb245220641e06f8fa984b156954 (patch)
treeb47b9b517d839f97bd7a489e3fae81037753b014
parent173ba9bbb19ea83f951318d9989e440768b4de8f (diff)
downloadComputeLibrary-c41a6a611973cb245220641e06f8fa984b156954.tar.gz
COMPMID-3530: Fix validate calls in CLElementwiseOperationKernel
Change-Id: I315520ca825e2a420bb28308f020b95ff2969042 Signed-off-by: Michele Di Giorgio <michele.digiorgio@arm.com> Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3341 Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
-rw-r--r--arm_compute/core/CL/kernels/CLElementwiseOperationKernel.h10
-rw-r--r--src/core/CL/kernels/CLElementwiseOperationKernel.cpp26
-rw-r--r--tests/validation/CL/ArithmeticAddition.cpp25
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<Status, Window> 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<Status, Window> 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<Status, Window> 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<Status, Window> 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<Status, Window> 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 <typename T>
using CLArithmeticAdditionFixture = ArithmeticAdditionValidationFixture<CLTensor, CLAccessor, CLArithmeticAddition, T>;