diff options
author | Michele Di Giorgio <michele.digiorgio@arm.com> | 2020-06-18 15:28:54 +0100 |
---|---|---|
committer | Michele Di Giorgio <michele.digiorgio@arm.com> | 2020-06-19 12:54:49 +0000 |
commit | 3be0b8c8d4e90bd264e9575dc2b6994ce8e14d50 (patch) | |
tree | d821fc13af472c0ed804fb240031575ac7ca8d7e | |
parent | e3a849af3d9e108704c6ce162f377398300d990d (diff) | |
download | ComputeLibrary-3be0b8c8d4e90bd264e9575dc2b6994ce8e14d50.tar.gz |
COMPMID-3480: Enable in-place elementwise operations in graph API
Change-Id: Id13d4f9860f25eeb8c4188ac9248653c4f7c1dc2
Signed-off-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3349
Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
-rw-r--r-- | arm_compute/runtime/NEON/functions/NEArithmeticAddition.h | 4 | ||||
-rw-r--r-- | src/graph/mutators/InPlaceOperationMutator.cpp | 8 | ||||
-rw-r--r-- | tests/validation/CL/ArithmeticAddition.cpp | 139 | ||||
-rw-r--r-- | tests/validation/NEON/ArithmeticAddition.cpp | 16 | ||||
-rw-r--r-- | tests/validation/fixtures/ArithmeticOperationsFixture.h | 2 |
5 files changed, 26 insertions, 143 deletions
diff --git a/arm_compute/runtime/NEON/functions/NEArithmeticAddition.h b/arm_compute/runtime/NEON/functions/NEArithmeticAddition.h index bf8f2cc14b..2bf12df4df 100644 --- a/arm_compute/runtime/NEON/functions/NEArithmeticAddition.h +++ b/arm_compute/runtime/NEON/functions/NEArithmeticAddition.h @@ -25,14 +25,14 @@ #define ARM_COMPUTE_NEARITHMETICADDITION_H #include "arm_compute/core/Types.h" -#include "arm_compute/runtime/NEON/INESimpleFunction.h" +#include "arm_compute/runtime/NEON/INESimpleFunctionNoBorder.h" namespace arm_compute { class ITensor; /** Basic function to run @ref NEArithmeticAdditionKernel */ -class NEArithmeticAddition : public INESimpleFunction +class NEArithmeticAddition : public INESimpleFunctionNoBorder { public: /** Initialise the kernel's inputs, output and conversion policy. diff --git a/src/graph/mutators/InPlaceOperationMutator.cpp b/src/graph/mutators/InPlaceOperationMutator.cpp index 3b06537cd9..ba80d8a26a 100644 --- a/src/graph/mutators/InPlaceOperationMutator.cpp +++ b/src/graph/mutators/InPlaceOperationMutator.cpp @@ -42,7 +42,13 @@ IGraphMutator::MutationType InPlaceOperationMutator::type() const void InPlaceOperationMutator::mutate(Graph &g) { - std::set<NodeType> in_place_nodes = { NodeType::BatchNormalizationLayer, NodeType::ActivationLayer, NodeType::PrintLayer }; + std::set<NodeType> in_place_nodes = + { + NodeType::ActivationLayer, + NodeType::BatchNormalizationLayer, + NodeType::EltwiseLayer, + NodeType::PrintLayer + }; // Not interested in the order of nodes for(auto &node : g.nodes()) diff --git a/tests/validation/CL/ArithmeticAddition.cpp b/tests/validation/CL/ArithmeticAddition.cpp index 41415ee481..02456f4895 100644 --- a/tests/validation/CL/ArithmeticAddition.cpp +++ b/tests/validation/CL/ArithmeticAddition.cpp @@ -108,29 +108,6 @@ using CLArithmeticAdditionFixture = ArithmeticAdditionValidationFixture<CLTensor TEST_SUITE(Integer) TEST_SUITE(U8) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })), - shape, policy) -{ - // Create tensors - CLTensor ref_src1 = create_tensor<CLTensor>(shape, DataType::U8); - CLTensor ref_src2 = create_tensor<CLTensor>(shape, DataType::U8); - CLTensor dst = create_tensor<CLTensor>(shape, DataType::U8); - - // Create and Configure function - CLArithmeticAddition add; - add.configure(&ref_src1, &ref_src2, &dst, policy); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(dst.info()->valid_region(), valid_region); - - // Validate padding - const PaddingSize padding = PaddingCalculator(shape.x(), num_elems_processed_per_iteration).required_padding(); - validate(ref_src1.info()->padding(), padding); - validate(ref_src2.info()->padding(), padding); - validate(dst.info()->padding(), padding); -} - FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionU8Dataset), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP }))) { @@ -140,30 +117,6 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionFixture<uint8_t>, framework TEST_SUITE_END() // U8 TEST_SUITE(S16) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::U8, DataType::S16 })), - framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })), - shape, data_type, policy) -{ - // Create tensors - CLTensor ref_src1 = create_tensor<CLTensor>(shape, data_type); - CLTensor ref_src2 = create_tensor<CLTensor>(shape, DataType::S16); - CLTensor dst = create_tensor<CLTensor>(shape, DataType::S16); - - // Create and Configure function - CLArithmeticAddition add; - add.configure(&ref_src1, &ref_src2, &dst, policy); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(dst.info()->valid_region(), valid_region); - - // Validate padding - const PaddingSize padding = PaddingCalculator(shape.x(), num_elems_processed_per_iteration).required_padding(); - validate(ref_src1.info()->padding(), padding); - validate(ref_src2.info()->padding(), padding); - validate(dst.info()->padding(), padding); -} - FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionS16Dataset), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP }))) { @@ -185,29 +138,6 @@ using CLArithmeticAdditionQuantizedFixture = ArithmeticAdditionValidationQuantiz TEST_SUITE(Quantized) TEST_SUITE(QASYMM8) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })), - shape, policy) -{ - // Create tensors - CLTensor ref_src1 = create_tensor<CLTensor>(shape, DataType::QASYMM8); - CLTensor ref_src2 = create_tensor<CLTensor>(shape, DataType::QASYMM8); - CLTensor dst = create_tensor<CLTensor>(shape, DataType::QASYMM8); - - // Create and Configure function - CLArithmeticAddition add; - add.configure(&ref_src1, &ref_src2, &dst, policy); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(dst.info()->valid_region(), valid_region); - - // Validate padding - const PaddingSize padding = PaddingCalculator(shape.x(), num_elems_processed_per_iteration).required_padding(); - validate(ref_src1.info()->padding(), padding); - validate(ref_src2.info()->padding(), padding); - validate(dst.info()->padding(), padding); -} - FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQASYMM8Dataset), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })), @@ -220,29 +150,6 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionQuantizedFixture<uint8_t>, } TEST_SUITE_END() // QASYMM8 TEST_SUITE(QASYMM8_SIGNED) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })), - shape, policy) -{ - // Create tensors - CLTensor ref_src1 = create_tensor<CLTensor>(shape, DataType::QASYMM8_SIGNED); - CLTensor ref_src2 = create_tensor<CLTensor>(shape, DataType::QASYMM8_SIGNED); - CLTensor dst = create_tensor<CLTensor>(shape, DataType::QASYMM8_SIGNED); - - // Create and Configure function - CLArithmeticAddition add; - add.configure(&ref_src1, &ref_src2, &dst, policy); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(dst.info()->valid_region(), valid_region); - - // Validate padding - const PaddingSize padding = PaddingCalculator(shape.x(), num_elems_processed_per_iteration).required_padding(); - validate(ref_src1.info()->padding(), padding); - validate(ref_src2.info()->padding(), padding); - validate(dst.info()->padding(), padding); -} - FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQASYMM8SignedDataset), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })), @@ -255,29 +162,6 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionQuantizedFixture<int8_t>, f } TEST_SUITE_END() // QASYMM8_SIGNED TEST_SUITE(QSYMM16) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })), - shape, policy) -{ - // Create tensors - CLTensor ref_src1 = create_tensor<CLTensor>(shape, DataType::QSYMM16); - CLTensor ref_src2 = create_tensor<CLTensor>(shape, DataType::QSYMM16); - CLTensor dst = create_tensor<CLTensor>(shape, DataType::QSYMM16); - - // Create and Configure function - CLArithmeticAddition add; - add.configure(&ref_src1, &ref_src2, &dst, policy); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(dst.info()->valid_region(), valid_region); - - // Validate padding - const PaddingSize padding = PaddingCalculator(shape.x(), num_elems_processed_per_iteration).required_padding(); - validate(ref_src1.info()->padding(), padding); - validate(ref_src2.info()->padding(), padding); - validate(dst.info()->padding(), padding); -} - FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionQuantizedFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQSYMM16Dataset), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })), @@ -313,29 +197,6 @@ FIXTURE_DATA_TEST_CASE(RunWithActivation, CLArithmeticAdditionFloatFixture<half> TEST_SUITE_END() // FP16 TEST_SUITE(FP32) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })), - shape, policy) -{ - // Create tensors - CLTensor ref_src1 = create_tensor<CLTensor>(shape, DataType::F32); - CLTensor ref_src2 = create_tensor<CLTensor>(shape, DataType::F32); - CLTensor dst = create_tensor<CLTensor>(shape, DataType::F32); - - // Create and Configure function - CLArithmeticAddition add; - add.configure(&ref_src1, &ref_src2, &dst, policy); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(dst.info()->valid_region(), valid_region); - - // Validate padding - const PaddingSize padding = PaddingCalculator(shape.x(), num_elems_processed_per_iteration).required_padding(); - validate(ref_src1.info()->padding(), padding); - validate(ref_src2.info()->padding(), padding); - validate(dst.info()->padding(), padding); -} - FIXTURE_DATA_TEST_CASE(RunSmall, CLArithmeticAdditionFloatFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP32Dataset), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })), EmptyActivationFunctionsDataset)) diff --git a/tests/validation/NEON/ArithmeticAddition.cpp b/tests/validation/NEON/ArithmeticAddition.cpp index 72993172fd..de4fed8ddb 100644 --- a/tests/validation/NEON/ArithmeticAddition.cpp +++ b/tests/validation/NEON/ArithmeticAddition.cpp @@ -107,6 +107,22 @@ DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip( // clang-format on // *INDENT-ON* +TEST_CASE(NoPaddingAdded, framework::DatasetMode::PRECOMMIT) +{ + // NEArithmeticAddition doesn't use padding, so make sure this is the case. + Tensor input1 = create_tensor<Tensor>(TensorShape(15U, 15U), DataType::F32); + Tensor input2 = create_tensor<Tensor>(TensorShape(15U, 1U), DataType::F32); + Tensor output = create_tensor<Tensor>(TensorShape(15U, 15U), DataType::F32); + + NEArithmeticAddition add; + add.configure(&input1, &input2, &output, ConvertPolicy::WRAP); + + // Validate padding is zero + validate(input1.info()->padding(), PaddingSize()); + validate(input2.info()->padding(), PaddingSize()); + validate(output.info()->padding(), PaddingSize()); +} + TEST_SUITE(Integer) TEST_SUITE(U8) FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionU8Dataset), diff --git a/tests/validation/fixtures/ArithmeticOperationsFixture.h b/tests/validation/fixtures/ArithmeticOperationsFixture.h index faf0aaa68b..fbce864a89 100644 --- a/tests/validation/fixtures/ArithmeticOperationsFixture.h +++ b/tests/validation/fixtures/ArithmeticOperationsFixture.h @@ -260,7 +260,7 @@ public: { ArithmeticOperationGenericFixture<TensorType, AccessorType, FunctionType, T>::setup(reference::ArithmeticOperation::SUB, shape0, shape1, data_type0, data_type1, output_data_type, convert_policy, - qinfo0, qinfo1, qinfo_out, ActivationLayerInfo(), false); + qinfo0, qinfo1, qinfo_out, ActivationLayerInfo()); } }; } // namespace validation |