From 2509fbaea001910e5d46fdf78b6be77f321202ad Mon Sep 17 00:00:00 2001 From: Moritz Pflanzer Date: Fri, 23 Jun 2017 14:15:03 +0100 Subject: COMPMID-417: Fix PaddingCalculator Change-Id: Idefa8c62d313e25808ea735c60967437035e266d Reviewed-on: http://mpd-gerrit.cambridge.arm.com/78711 Reviewed-by: SiCong Li Tested-by: Kaizen Reviewed-by: Georgios Pinitas --- tests/PaddingCalculator.h | 56 +++++++++++++++++++++-- tests/validation/CL/BitwiseAnd.cpp | 2 +- tests/validation/CL/DepthConvert.cpp | 2 +- tests/validation/CL/IntegralImage.cpp | 9 ++-- tests/validation/CL/Threshold.cpp | 2 +- tests/validation/NEON/AbsoluteDifference.cpp | 2 +- tests/validation/NEON/Accumulate.cpp | 2 +- tests/validation/NEON/AccumulateSquared.cpp | 2 +- tests/validation/NEON/AccumulateWeighted.cpp | 2 +- tests/validation/NEON/ActivationLayer.cpp | 2 +- tests/validation/NEON/ArithmeticAddition.cpp | 2 +- tests/validation/NEON/ArithmeticSubtraction.cpp | 2 +- tests/validation/NEON/BitwiseAnd.cpp | 2 +- tests/validation/NEON/BitwiseNot.cpp | 2 +- tests/validation/NEON/BitwiseOr.cpp | 2 +- tests/validation/NEON/BitwiseXor.cpp | 2 +- tests/validation/NEON/Box3x3.cpp | 8 ++-- tests/validation/NEON/DepthConvert.cpp | 2 +- tests/validation/NEON/IntegralImage.cpp | 5 +- tests/validation/NEON/MeanStdDev.cpp | 3 +- tests/validation/NEON/PixelWiseMultiplication.cpp | 2 +- tests/validation/NEON/SoftmaxLayer.cpp | 4 +- tests/validation/NEON/Threshold.cpp | 14 +++--- 23 files changed, 87 insertions(+), 44 deletions(-) diff --git a/tests/PaddingCalculator.h b/tests/PaddingCalculator.h index 029312b73b..6906353a66 100644 --- a/tests/PaddingCalculator.h +++ b/tests/PaddingCalculator.h @@ -26,6 +26,8 @@ #include "arm_compute/core/Types.h" +#include + namespace arm_compute { namespace test @@ -34,6 +36,13 @@ namespace test class PaddingCalculator final { public: + /** Options for computing the padding */ + enum class Option + { + EXCLUDE_BORDER, + INCLUDE_BORDER + }; + /** Construct calculator with size of tensor's dimension and step size. * * @param[in] size Number of elements available. @@ -62,6 +71,12 @@ public: */ void set_access_offset(int offset); + /** Set number of processed elements. + * + * @param[in] elements Number of processed elements per iteration. + */ + void set_processed_elements(int elements); + /** Set number of accessed elements. * * @param[in] elements Number of accessed elements per iteration. @@ -69,10 +84,26 @@ public: void set_accessed_elements(int elements); /** Compute the required padding. + * + * If access offset is negative and border mode is not undefined, the top, + * bottom and left padding is set to boder size. Otherwise it is zero. + * The right padding is always computed based on the specified parameters. * * @return Required padding in number of elements. */ - int required_padding() const; + PaddingSize required_padding() const; + + /** Compute the required padding. + * + * If @p option is INCLUDE_BORDER and border mode is not undefined, the top, + * bottom and left padding is set to boder size. Otherwise it is zero. + * The right padding is always computed based on the specified parameters. + * + * @param[in] option Padding option + * + * @return Required padding in number of elements. + */ + PaddingSize required_padding(Option option) const; private: int _size; @@ -98,21 +129,38 @@ inline void PaddingCalculator::set_access_offset(int offset) _offset = offset; } +inline void PaddingCalculator::set_processed_elements(int elements) +{ + _num_processed_elements = elements; +} inline void PaddingCalculator::set_accessed_elements(int elements) { _num_accessed_elements = elements; } -inline int PaddingCalculator::required_padding() const +inline PaddingSize PaddingCalculator::required_padding() const { + return required_padding(_offset < 0 ? Option::INCLUDE_BORDER : Option::EXCLUDE_BORDER); +} + +inline PaddingSize PaddingCalculator::required_padding(Option option) const +{ + PaddingSize padding{ (_mode == BorderMode::UNDEFINED || option == Option::EXCLUDE_BORDER) ? 0U : static_cast(std::max(0, _border_size)) }; + + int padding_right = 0; + if(_mode == BorderMode::UNDEFINED) { - return (((_size - _border_size + _num_processed_elements - 1) / _num_processed_elements) - 1) * _num_processed_elements + _num_accessed_elements - _size + _border_size + _offset; + padding_right = (((_size - 2 * _border_size + _num_processed_elements - 1) / _num_processed_elements) - 1) * _num_processed_elements + _num_accessed_elements - _size + _border_size + _offset; } else { - return (((_size + _num_processed_elements - 1) / _num_processed_elements) - 1) * _num_processed_elements + _num_accessed_elements - _size + _offset; + padding_right = (((_size + _num_processed_elements - 1) / _num_processed_elements) - 1) * _num_processed_elements + _num_accessed_elements - _size + _offset; } + + padding.right = std::max(0, padding_right); + + return padding; } } // namespace test } // namespace arm_compute diff --git a/tests/validation/CL/BitwiseAnd.cpp b/tests/validation/CL/BitwiseAnd.cpp index 99e7b3e353..bbafa87e3e 100644 --- a/tests/validation/CL/BitwiseAnd.cpp +++ b/tests/validation/CL/BitwiseAnd.cpp @@ -166,7 +166,7 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/CL/DepthConvert.cpp b/tests/validation/CL/DepthConvert.cpp index a7dbbc8ab7..0bca453cf2 100644 --- a/tests/validation/CL/DepthConvert.cpp +++ b/tests/validation/CL/DepthConvert.cpp @@ -113,7 +113,7 @@ void compute_configure_validate(const TensorShape &shape, DataType dt_in, DataTy validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/CL/IntegralImage.cpp b/tests/validation/CL/IntegralImage.cpp index 8f7c4b6ccf..9ace8bd2e8 100644 --- a/tests/validation/CL/IntegralImage.cpp +++ b/tests/validation/CL/IntegralImage.cpp @@ -108,12 +108,9 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) validate(dst.info()->valid_region(), valid_region); // Validate padding - PaddingCalculator calculator(shape.x(), 16); - const PaddingSize src_padding(0, calculator.required_padding(), 0, 0); - const PaddingSize dst_padding(0, calculator.required_padding(), 0, 0); - - validate(src.info()->padding(), src_padding); - validate(dst.info()->padding(), dst_padding); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); + validate(src.info()->padding(), padding); + validate(dst.info()->padding(), padding); } BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit")) diff --git a/tests/validation/CL/Threshold.cpp b/tests/validation/CL/Threshold.cpp index 122728d352..ff7b8f0694 100644 --- a/tests/validation/CL/Threshold.cpp +++ b/tests/validation/CL/Threshold.cpp @@ -115,7 +115,7 @@ BOOST_DATA_TEST_CASE(Configuration, validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/AbsoluteDifference.cpp b/tests/validation/NEON/AbsoluteDifference.cpp index 22f9eac7cd..334a842c66 100644 --- a/tests/validation/NEON/AbsoluteDifference.cpp +++ b/tests/validation/NEON/AbsoluteDifference.cpp @@ -106,7 +106,7 @@ void validate_configuration(const Tensor &src1, const Tensor &src2, Tensor &dst, validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/NEON/Accumulate.cpp b/tests/validation/NEON/Accumulate.cpp index e3b78aa444..157c298d7e 100644 --- a/tests/validation/NEON/Accumulate.cpp +++ b/tests/validation/NEON/Accumulate.cpp @@ -109,7 +109,7 @@ BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()), validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/AccumulateSquared.cpp b/tests/validation/NEON/AccumulateSquared.cpp index e17b15ada1..3dbdeb2db1 100644 --- a/tests/validation/NEON/AccumulateSquared.cpp +++ b/tests/validation/NEON/AccumulateSquared.cpp @@ -110,7 +110,7 @@ BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()) * boost::uni validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/AccumulateWeighted.cpp b/tests/validation/NEON/AccumulateWeighted.cpp index f2a4794f6c..cf1f74689f 100644 --- a/tests/validation/NEON/AccumulateWeighted.cpp +++ b/tests/validation/NEON/AccumulateWeighted.cpp @@ -109,7 +109,7 @@ BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()) * boost::uni validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/ActivationLayer.cpp b/tests/validation/NEON/ActivationLayer.cpp index bf00173611..a4826accfa 100644 --- a/tests/validation/NEON/ActivationLayer.cpp +++ b/tests/validation/NEON/ActivationLayer.cpp @@ -152,7 +152,7 @@ BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()) * CNNDataTyp validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/ArithmeticAddition.cpp b/tests/validation/NEON/ArithmeticAddition.cpp index cf37a58b44..d58d0cea1a 100644 --- a/tests/validation/NEON/ArithmeticAddition.cpp +++ b/tests/validation/NEON/ArithmeticAddition.cpp @@ -107,7 +107,7 @@ void validate_configuration(const Tensor &src1, const Tensor &src2, Tensor &dst, validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/NEON/ArithmeticSubtraction.cpp b/tests/validation/NEON/ArithmeticSubtraction.cpp index 50659a1cd0..ade473abff 100644 --- a/tests/validation/NEON/ArithmeticSubtraction.cpp +++ b/tests/validation/NEON/ArithmeticSubtraction.cpp @@ -107,7 +107,7 @@ void validate_configuration(const Tensor &src1, const Tensor &src2, Tensor &dst, validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/NEON/BitwiseAnd.cpp b/tests/validation/NEON/BitwiseAnd.cpp index eb4090fa31..3dcad6fff7 100644 --- a/tests/validation/NEON/BitwiseAnd.cpp +++ b/tests/validation/NEON/BitwiseAnd.cpp @@ -166,7 +166,7 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/NEON/BitwiseNot.cpp b/tests/validation/NEON/BitwiseNot.cpp index 590d806bd0..de58f550b2 100644 --- a/tests/validation/NEON/BitwiseNot.cpp +++ b/tests/validation/NEON/BitwiseNot.cpp @@ -107,7 +107,7 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/BitwiseOr.cpp b/tests/validation/NEON/BitwiseOr.cpp index 164b2fe299..95f77ee924 100644 --- a/tests/validation/NEON/BitwiseOr.cpp +++ b/tests/validation/NEON/BitwiseOr.cpp @@ -114,7 +114,7 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/NEON/BitwiseXor.cpp b/tests/validation/NEON/BitwiseXor.cpp index eea03268d7..a9225e6afa 100644 --- a/tests/validation/NEON/BitwiseXor.cpp +++ b/tests/validation/NEON/BitwiseXor.cpp @@ -114,7 +114,7 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/NEON/Box3x3.cpp b/tests/validation/NEON/Box3x3.cpp index 6c9c3b29d8..b2a66cde30 100644 --- a/tests/validation/NEON/Box3x3.cpp +++ b/tests/validation/NEON/Box3x3.cpp @@ -112,15 +112,15 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) PaddingCalculator calculator(shape.x(), 8); calculator.set_border_size(1); - const PaddingSize write_padding(0, calculator.required_padding(), 0, 0); + const PaddingSize dst_padding = calculator.required_padding(); calculator.set_accessed_elements(16); calculator.set_access_offset(-1); - const PaddingSize read_padding(0, calculator.required_padding(), 0, 0); + const PaddingSize src_padding = calculator.required_padding(); - validate(src.info()->padding(), read_padding); - validate(dst.info()->padding(), write_padding); + validate(src.info()->padding(), src_padding); + validate(dst.info()->padding(), dst_padding); } BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit")) diff --git a/tests/validation/NEON/DepthConvert.cpp b/tests/validation/NEON/DepthConvert.cpp index cabbf0e32d..f6ae1f1e78 100644 --- a/tests/validation/NEON/DepthConvert.cpp +++ b/tests/validation/NEON/DepthConvert.cpp @@ -116,7 +116,7 @@ void compute_configure_validate(const TensorShape &shape, DataType dt_in, DataTy validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/IntegralImage.cpp b/tests/validation/NEON/IntegralImage.cpp index 59acbff56b..8789e464f5 100644 --- a/tests/validation/NEON/IntegralImage.cpp +++ b/tests/validation/NEON/IntegralImage.cpp @@ -108,9 +108,8 @@ BOOST_DATA_TEST_CASE(Configuration, SmallShapes() + LargeShapes(), shape) validate(dst.info()->valid_region(), valid_region); // Validate padding - PaddingCalculator calculator(shape.x(), 16); - const PaddingSize src_padding(0, calculator.required_padding(), 0, 0); - const PaddingSize dst_padding(1, calculator.required_padding(), 0, 1); + const PaddingSize src_padding = PaddingCalculator(shape.x(), 16).required_padding(); + const PaddingSize dst_padding(1, src_padding.right, 0, 1); validate(src.info()->padding(), src_padding); validate(dst.info()->padding(), dst_padding); diff --git a/tests/validation/NEON/MeanStdDev.cpp b/tests/validation/NEON/MeanStdDev.cpp index 4804354551..7087749bc3 100644 --- a/tests/validation/NEON/MeanStdDev.cpp +++ b/tests/validation/NEON/MeanStdDev.cpp @@ -109,8 +109,7 @@ BOOST_DATA_TEST_CASE(Configuration, Small2DShapes() + Large2DShapes(), shape) validate(src.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); - validate(src.info()->padding(), padding); + validate(src.info()->padding(), PaddingCalculator(shape.x(), 16).required_padding()); } BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit")) diff --git a/tests/validation/NEON/PixelWiseMultiplication.cpp b/tests/validation/NEON/PixelWiseMultiplication.cpp index b16e7fe020..fd61c72f22 100644 --- a/tests/validation/NEON/PixelWiseMultiplication.cpp +++ b/tests/validation/NEON/PixelWiseMultiplication.cpp @@ -111,7 +111,7 @@ void validate_configuration(const Tensor &src1, const Tensor &src2, Tensor &dst, validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); validate(src1.info()->padding(), padding); validate(src2.info()->padding(), padding); validate(dst.info()->padding(), padding); diff --git a/tests/validation/NEON/SoftmaxLayer.cpp b/tests/validation/NEON/SoftmaxLayer.cpp index b04b0fe86a..519cac3f29 100644 --- a/tests/validation/NEON/SoftmaxLayer.cpp +++ b/tests/validation/NEON/SoftmaxLayer.cpp @@ -127,8 +127,8 @@ BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()) * CNNDataTyp validate(dst.info()->valid_region(), valid_region); // Validate padding - int step = 16 / arm_compute::data_size_from_type(dt); - const PaddingSize padding(0, PaddingCalculator(shape.x(), step).required_padding(), 0, 0); + const int step = 16 / arm_compute::data_size_from_type(dt); + const PaddingSize padding = PaddingCalculator(shape.x(), step).required_padding(); validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } diff --git a/tests/validation/NEON/Threshold.cpp b/tests/validation/NEON/Threshold.cpp index b2a289f3b6..55f7889af3 100644 --- a/tests/validation/NEON/Threshold.cpp +++ b/tests/validation/NEON/Threshold.cpp @@ -99,24 +99,24 @@ BOOST_DATA_TEST_CASE(Configuration, shape, thrshConf) { // Create tensors - Tensor src1 = create_tensor(shape, DataType::U8); - Tensor dst = create_tensor(shape, DataType::U8); + Tensor src = create_tensor(shape, DataType::U8); + Tensor dst = create_tensor(shape, DataType::U8); - BOOST_TEST(src1.info()->is_resizable()); + BOOST_TEST(src.info()->is_resizable()); BOOST_TEST(dst.info()->is_resizable()); // Create and configure function NEThreshold thrsh; - thrsh.configure(&src1, &dst, thrshConf.threshold, thrshConf.false_value, thrshConf.true_value, thrshConf.type, thrshConf.upper); + thrsh.configure(&src, &dst, thrshConf.threshold, thrshConf.false_value, thrshConf.true_value, thrshConf.type, thrshConf.upper); // Validate valid region const ValidRegion valid_region = shape_to_valid_region(shape); - validate(src1.info()->valid_region(), valid_region); + validate(src.info()->valid_region(), valid_region); validate(dst.info()->valid_region(), valid_region); // Validate padding - const PaddingSize padding(0, PaddingCalculator(shape.x(), 16).required_padding(), 0, 0); - validate(src1.info()->padding(), padding); + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); + validate(src.info()->padding(), padding); validate(dst.info()->padding(), padding); } -- cgit v1.2.1