blob: cd96a6abccc8570d88bf7db2df471187dcd714ac [file] [log] [blame]
Georgios Pinitasd9769582017-08-03 10:19:40 +01001/*
Michalis Spyrou19bd4122020-01-22 10:27:06 +00002 * Copyright (c) 2017-2020 ARM Limited.
Georgios Pinitasd9769582017-08-03 10:19:40 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/NEON/functions/NEReductionOperation.h"
26#include "arm_compute/runtime/Tensor.h"
27#include "arm_compute/runtime/TensorAllocator.h"
Georgios Pinitasd9769582017-08-03 10:19:40 +010028#include "tests/NEON/Accessor.h"
29#include "tests/PaddingCalculator.h"
Moritz Pflanzera09de0c2017-09-01 20:41:12 +010030#include "tests/datasets/ShapeDatasets.h"
31#include "tests/framework/Asserts.h"
32#include "tests/framework/Macros.h"
33#include "tests/framework/datasets/Datasets.h"
34#include "tests/validation/Validation.h"
35#include "tests/validation/fixtures/ReductionOperationFixture.h"
Georgios Pinitasd9769582017-08-03 10:19:40 +010036
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43namespace
44{
45/** Tolerance for float operations */
Michalis Spyrou0bebac52018-10-24 17:27:02 +010046AbsoluteTolerance<float> tolerance_f32(0.0001f);
Luca Foschianiee939fb2020-01-28 10:38:07 +000047RelativeTolerance<float> rel_tolerance_f32(0.0001f);
48AbsoluteTolerance<float> tolerance_f16(0.1f);
49RelativeTolerance<float> rel_tolerance_f16(0.1f);
Michalis Spyroubcf8a962018-10-12 10:51:31 +010050/** Tolerance for quantized operations */
Luca Foschianiee939fb2020-01-28 10:38:07 +000051RelativeTolerance<float> tolerance_quantized(1.f);
Manuel Bottinib412fab2018-12-10 17:40:23 +000052
53const auto ReductionOperations = framework::dataset::make("ReductionOperation",
Manuel Bottini1d4f3852019-01-14 15:14:43 +000054{
55 ReductionOperation::SUM,
Usama Arifa4a08ad2019-05-20 12:38:33 +010056 ReductionOperation::PROD,
57 ReductionOperation::MIN,
Usama Arif28f0dd92019-05-20 13:44:34 +010058 ReductionOperation::MAX,
Manuel Bottini1d4f3852019-01-14 15:14:43 +000059});
60
61const auto QuantizationInfos = framework::dataset::make("QuantizationInfo",
62{
Luca Foschianiee939fb2020-01-28 10:38:07 +000063 QuantizationInfo(1.f / 117, 10), // Numbers chosen so that the quantized values are in range of qasymm8_signed data type
Michalis Spyrou19bd4122020-01-22 10:27:06 +000064 QuantizationInfo(1.f / 64, 5),
65 QuantizationInfo(1.f / 32, 2)
Manuel Bottini1d4f3852019-01-14 15:14:43 +000066});
67
68const auto Axises = framework::dataset::make("Axis",
69{ 0, 1, 2, 3 });
70
Sang-Hoon Park2697fd82019-10-15 16:49:24 +010071const auto KeepDims = framework::dataset::make("KeepDims", { true, false });
72
Georgios Pinitasd9769582017-08-03 10:19:40 +010073} // namespace
74
75TEST_SUITE(NEON)
76TEST_SUITE(ReductionOperation)
77
John Richardson73d4aef2018-05-08 14:34:33 +010078// *INDENT-OFF*
79// clang-format off
Sang-Hoon Park2697fd82019-10-15 16:49:24 +010080DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
John Richardson73d4aef2018-05-08 14:34:33 +010081 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(128U, 64U), 1, DataType::F32), // Mismatching data type input/output
82 TensorInfo(TensorShape(128U, 64U), 2, DataType::F32), // Number of Input channels != 1
83 TensorInfo(TensorShape(128U, 64U), 1, DataType::S16), // DataType != F32
84 TensorInfo(TensorShape(128U, 64U), 1, DataType::F32), // Axis >= num_max_dimensions
Sang-Hoon Park2697fd82019-10-15 16:49:24 +010085 TensorInfo(TensorShape(128U, 64U), 1, DataType::F32),
86 TensorInfo(TensorShape(128U, 64U), 1, DataType::F32) // Kept dimension when keep_dims = false
John Richardson73d4aef2018-05-08 14:34:33 +010087 }),
88 framework::dataset::make("OutputInfo", { TensorInfo(TensorShape(1U, 64U), 1, DataType::F16),
89 TensorInfo(TensorShape(1U, 64U), 1, DataType::F32),
90 TensorInfo(TensorShape(1U, 64U), 1, DataType::S16),
91 TensorInfo(TensorShape(1U, 64U), 1, DataType::F32),
Sang-Hoon Park2697fd82019-10-15 16:49:24 +010092 TensorInfo(TensorShape(1U, 64U), 1, DataType::F32),
John Richardson73d4aef2018-05-08 14:34:33 +010093 TensorInfo(TensorShape(1U, 64U), 1, DataType::F32)
94 })),
Sang-Hoon Park2697fd82019-10-15 16:49:24 +010095 framework::dataset::make("Axis", { 0U, 0U, 0U, static_cast<unsigned int>(TensorShape::num_max_dimensions), 0U, 0U })),
96 framework::dataset::make("KeepDims", { true, true, true, true, true, false})),
97 framework::dataset::make("Expected", { false, false, false, false, true, false })),
98 input_info, output_info, axis, keep_dims, expected)
John Richardson73d4aef2018-05-08 14:34:33 +010099{
100 bool is_valid = bool(NEReductionOperation::validate(&input_info.clone()->set_is_resizable(false),
101 &output_info.clone()->set_is_resizable(true),
102 axis,
Sang-Hoon Park2697fd82019-10-15 16:49:24 +0100103 ReductionOperation::SUM_SQUARE,
104 keep_dims));
John Richardson73d4aef2018-05-08 14:34:33 +0100105 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
106}
107// clang-format on
108// *INDENT-ON*
109
Georgios Pinitasd9769582017-08-03 10:19:40 +0100110template <typename T>
Michalis Spyroubcf8a962018-10-12 10:51:31 +0100111using NEReductionOperationFixture = ReductionOperationFixture<Tensor, Accessor, NEReductionOperation, T>;
Georgios Pinitasd9769582017-08-03 10:19:40 +0100112
113TEST_SUITE(FP32)
114FIXTURE_DATA_TEST_CASE(RunSmall, NEReductionOperationFixture<float>, framework::DatasetMode::PRECOMMIT,
Sang-Hoon Park2697fd82019-10-15 16:49:24 +0100115 combine(combine(combine(combine(datasets::Small4DShapes(), framework::dataset::make("DataType", DataType::F32)), Axises), ReductionOperations), KeepDims))
Georgios Pinitasd9769582017-08-03 10:19:40 +0100116{
117 // Validate output
118 validate(Accessor(_target), _reference, tolerance_f32);
119}
120FIXTURE_DATA_TEST_CASE(RunLarge, NEReductionOperationFixture<float>, framework::DatasetMode::NIGHTLY,
Sang-Hoon Park2697fd82019-10-15 16:49:24 +0100121 combine(combine(combine(combine(datasets::Large4DShapes(), framework::dataset::make("DataType", DataType::F32)), Axises), ReductionOperations), KeepDims))
Georgios Pinitasd9769582017-08-03 10:19:40 +0100122{
123 // Validate output
Michalis Spyrou0bebac52018-10-24 17:27:02 +0100124 validate(Accessor(_target), _reference, rel_tolerance_f32, 0, tolerance_f32);
Georgios Pinitasd9769582017-08-03 10:19:40 +0100125}
Michalis Spyroubcf8a962018-10-12 10:51:31 +0100126TEST_SUITE_END() // FP32
Georgios Pinitasd9769582017-08-03 10:19:40 +0100127
Luca Foschianiee939fb2020-01-28 10:38:07 +0000128#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
129TEST_SUITE(FP16)
130FIXTURE_DATA_TEST_CASE(RunSmall, NEReductionOperationFixture<half>, framework::DatasetMode::PRECOMMIT,
131 combine(combine(combine(combine(datasets::Small4DShapes(), framework::dataset::make("DataType", DataType::F16)), Axises), ReductionOperations), KeepDims))
132{
133 // Validate output
134 validate(Accessor(_target), _reference, tolerance_f16);
135}
136FIXTURE_DATA_TEST_CASE(RunLarge, NEReductionOperationFixture<half>, framework::DatasetMode::NIGHTLY,
137 combine(combine(combine(combine(datasets::Large4DShapes(), framework::dataset::make("DataType", DataType::F16)), Axises), ReductionOperations), KeepDims))
138{
139 // Validate output
140 validate(Accessor(_target), _reference, rel_tolerance_f16, 0, tolerance_f16);
141}
142TEST_SUITE_END() // FP16
143#endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
144
Michalis Spyroubcf8a962018-10-12 10:51:31 +0100145template <typename T>
146using NEReductionOperationQuantizedFixture = ReductionOperationQuantizedFixture<Tensor, Accessor, NEReductionOperation, T>;
147
148TEST_SUITE(QASYMM8)
Michalis Spyrou19bd4122020-01-22 10:27:06 +0000149FIXTURE_DATA_TEST_CASE(RunSmall, NEReductionOperationQuantizedFixture<uint8_t>, framework::DatasetMode::ALL,
Sang-Hoon Park2697fd82019-10-15 16:49:24 +0100150 combine(combine(combine(combine(combine(datasets::Small4DShapes(), framework::dataset::make("DataType", DataType::QASYMM8)), Axises),
151 ReductionOperations),
152 QuantizationInfos),
153 KeepDims))
Michalis Spyroubcf8a962018-10-12 10:51:31 +0100154{
155 // Validate output
Luca Foschianiee939fb2020-01-28 10:38:07 +0000156 validate(Accessor(_target), _reference, tolerance_quantized);
Michalis Spyroubcf8a962018-10-12 10:51:31 +0100157}
Michalis Spyroubcf8a962018-10-12 10:51:31 +0100158TEST_SUITE_END() // QASYMM8
159
Luca Foschianiee939fb2020-01-28 10:38:07 +0000160TEST_SUITE(QASYMM8_SIGNED)
161FIXTURE_DATA_TEST_CASE(RunSmall, NEReductionOperationQuantizedFixture<int8_t>, framework::DatasetMode::ALL,
162 combine(combine(combine(combine(combine(datasets::Small4DShapes(), framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)), Axises),
163 ReductionOperations),
164 QuantizationInfos),
165 KeepDims))
166{
167 // Validate output
168 validate(Accessor(_target), _reference, tolerance_quantized);
169}
170TEST_SUITE_END() // QASYMM8_SIGNED
171
Michalis Spyroubcf8a962018-10-12 10:51:31 +0100172TEST_SUITE_END() // ReductionOperation
173TEST_SUITE_END() // NEON
Georgios Pinitasd9769582017-08-03 10:19:40 +0100174} // namespace validation
175} // namespace test
176} // namespace arm_compute