blob: bab749076230ea365ed01105d61f9386b18435c1 [file] [log] [blame]
Michele Di Giorgio4e09b382017-07-05 18:20:02 +01001/*
Mohammed Suhail Munshi0a48c4c2024-01-30 18:25:51 +00002 * Copyright (c) 2017-2021, 2024 Arm Limited.
Michele Di Giorgio4e09b382017-07-05 18:20:02 +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/NEQuantizationLayer.h"
26#include "arm_compute/runtime/Tensor.h"
27#include "arm_compute/runtime/TensorAllocator.h"
Michele Di Giorgio4e09b382017-07-05 18:20:02 +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/QuantizationLayerFixture.h"
Michele Di Giorgio4e09b382017-07-05 18:20:02 +010036
Mohammed Suhail Munshi0a48c4c2024-01-30 18:25:51 +000037
Michele Di Giorgio4e09b382017-07-05 18:20:02 +010038namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
46/** Tolerance for quantization */
Manuel Bottini4370cff2020-02-07 16:31:59 +000047constexpr AbsoluteTolerance<uint8_t> tolerance_u8(1); /**< Tolerance value for comparing reference's output against implementation's output for QASYMM8 data types */
48constexpr AbsoluteTolerance<int8_t> tolerance_s8(1); /**< Tolerance value for comparing reference's output against implementation's output for QASYMM8_SIGNED data types */
49constexpr AbsoluteTolerance<uint16_t> tolerance_u16(1); /**< Tolerance value for comparing reference's output against implementation's output for QASYMM16 data types */
50const auto QuantizationSmallShapes = concat(datasets::Small3DShapes(), datasets::Small4DShapes());
51const auto QuantizationLargeShapes = concat(datasets::Large3DShapes(), datasets::Large4DShapes());
Michele Di Giorgio4e09b382017-07-05 18:20:02 +010052} // namespace
53
54TEST_SUITE(NEON)
55TEST_SUITE(QuantizationLayer)
56
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000057// *INDENT-OFF*
58// clang-format off
59DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(
Manuel Bottini4370cff2020-02-07 16:31:59 +000060 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(16U, 16U, 16U, 5U), 1, DataType::QASYMM8), // Wrong output data type
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000061 TensorInfo(TensorShape(16U, 16U, 16U, 5U), 1, DataType::F32), // Wrong output data type
John Kesapidesadfb2732019-03-04 16:29:22 +000062 TensorInfo(TensorShape(16U, 16U, 2U, 5U), 1, DataType::F32), // Missmatching shapes
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000063 TensorInfo(TensorShape(16U, 16U, 16U, 5U), 1, DataType::F32), // Valid
64 }),
65 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(16U, 16U, 16U, 5U), 1, DataType::F32),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000066 TensorInfo(TensorShape(16U, 16U, 16U, 5U), 1, DataType::U16),
John Kesapidesadfb2732019-03-04 16:29:22 +000067 TensorInfo(TensorShape(16U, 16U, 16U, 5U), 1, DataType::QASYMM8),
68 TensorInfo(TensorShape(16U, 16U, 16U, 5U), 1, DataType::QASYMM8),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000069 })),
John Kesapidesadfb2732019-03-04 16:29:22 +000070 framework::dataset::make("Expected", { false, false, false, true})),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000071 input_info, output_info, expected)
72{
73 ARM_COMPUTE_EXPECT(bool(NEQuantizationLayer::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false))) == expected, framework::LogLevel::ERRORS);
74}
75// clang-format on
76// *INDENT-ON*
77
Michele Di Giorgio4e09b382017-07-05 18:20:02 +010078template <typename T>
Michele Di Giorgiod87a7b22019-09-10 10:42:27 +010079using NEQuantizationLayerQASYMM8Fixture = QuantizationValidationFixture<Tensor, Accessor, NEQuantizationLayer, T, uint8_t>;
Michele Di Giorgiod64a46c2019-10-01 12:25:49 +010080template <typename T>
Sang-Hoon Parkfb6aaeb2019-11-27 15:26:44 +000081using NEQuantizationLayerQASYMM8SignedFixture = QuantizationValidationFixture<Tensor, Accessor, NEQuantizationLayer, T, int8_t>;
82template <typename T>
Michele Di Giorgiod64a46c2019-10-01 12:25:49 +010083using NEQuantizationLayerQASYMM16Fixture = QuantizationValidationFixture<Tensor, Accessor, NEQuantizationLayer, T, uint16_t>;
Michele Di Giorgio4e09b382017-07-05 18:20:02 +010084
85TEST_SUITE(Float)
86TEST_SUITE(FP32)
Michele Di Giorgiod87a7b22019-09-10 10:42:27 +010087FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8, NEQuantizationLayerQASYMM8Fixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(QuantizationSmallShapes,
88 framework::dataset::make("DataType", DataType::F32)),
89 framework::dataset::make("DataTypeOut", { DataType::QASYMM8 })),
90 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
Michele Di Giorgio4e09b382017-07-05 18:20:02 +010091{
92 // Validate output
93 validate(Accessor(_target), _reference, tolerance_u8);
94}
Sang-Hoon Parkfb6aaeb2019-11-27 15:26:44 +000095FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8Signed, NEQuantizationLayerQASYMM8SignedFixture<float>, framework::DatasetMode::ALL, combine(combine(combine(QuantizationSmallShapes,
96 framework::dataset::make("DataType", DataType::F32)),
97 framework::dataset::make("DataTypeOut", { DataType::QASYMM8_SIGNED })),
98 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
99{
100 // Validate output
Georgios Pinitasd30405a2021-01-13 14:42:54 +0000101 validate(Accessor(_target), _reference, tolerance_s8);
Sang-Hoon Parkfb6aaeb2019-11-27 15:26:44 +0000102}
Michele Di Giorgiod64a46c2019-10-01 12:25:49 +0100103FIXTURE_DATA_TEST_CASE(RunSmallQASYMM16, NEQuantizationLayerQASYMM16Fixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(QuantizationSmallShapes,
104 framework::dataset::make("DataType", DataType::F32)),
105 framework::dataset::make("DataTypeOut", { DataType::QASYMM16 })),
106 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
107{
108 // Validate output
109 validate(Accessor(_target), _reference, tolerance_u16);
110}
Michele Di Giorgiod87a7b22019-09-10 10:42:27 +0100111FIXTURE_DATA_TEST_CASE(RunLargeQASYMM8, NEQuantizationLayerQASYMM8Fixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(QuantizationLargeShapes,
112 framework::dataset::make("DataType", DataType::F32)),
113 framework::dataset::make("DataTypeOut", { DataType::QASYMM8 })),
114 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
Michele Di Giorgio4e09b382017-07-05 18:20:02 +0100115{
116 // Validate output
117 validate(Accessor(_target), _reference, tolerance_u8);
118}
Michele Di Giorgiod64a46c2019-10-01 12:25:49 +0100119FIXTURE_DATA_TEST_CASE(RunLargeQASYMM16, NEQuantizationLayerQASYMM16Fixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(QuantizationLargeShapes,
120 framework::dataset::make("DataType", DataType::F32)),
121 framework::dataset::make("DataTypeOut", { DataType::QASYMM16 })),
122 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
123{
124 // Validate output
125 validate(Accessor(_target), _reference, tolerance_u16);
126}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000127TEST_SUITE_END() // FP32
John Kesapidesadfb2732019-03-04 16:29:22 +0000128#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
John Kesapidesadfb2732019-03-04 16:29:22 +0000129TEST_SUITE(FP16)
Michele Di Giorgiod87a7b22019-09-10 10:42:27 +0100130FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8, NEQuantizationLayerQASYMM8Fixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(QuantizationSmallShapes,
131 framework::dataset::make("DataType", DataType::F16)),
132 framework::dataset::make("DataTypeOut", { DataType::QASYMM8 })),
133 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
John Kesapidesadfb2732019-03-04 16:29:22 +0000134{
135 // Validate output
136 validate(Accessor(_target), _reference, tolerance_u8);
137}
Sang-Hoon Parkfb6aaeb2019-11-27 15:26:44 +0000138FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8Signed, NEQuantizationLayerQASYMM8SignedFixture<half>, framework::DatasetMode::ALL, combine(combine(combine(QuantizationSmallShapes,
139 framework::dataset::make("DataType", DataType::F16)),
140 framework::dataset::make("DataTypeOut", { DataType::QASYMM8_SIGNED })),
141 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
142{
143 // Validate output
Georgios Pinitasd30405a2021-01-13 14:42:54 +0000144 validate(Accessor(_target), _reference, tolerance_s8);
Sang-Hoon Parkfb6aaeb2019-11-27 15:26:44 +0000145}
Michele Di Giorgiod64a46c2019-10-01 12:25:49 +0100146FIXTURE_DATA_TEST_CASE(RunSmallQASYMM16, NEQuantizationLayerQASYMM16Fixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(QuantizationSmallShapes,
147 framework::dataset::make("DataType", DataType::F16)),
148 framework::dataset::make("DataTypeOut", { DataType::QASYMM16 })),
149 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
150{
151 // Validate output
152 validate(Accessor(_target), _reference, tolerance_u16);
153}
Michele Di Giorgiod87a7b22019-09-10 10:42:27 +0100154FIXTURE_DATA_TEST_CASE(RunLargeQASYMM8, NEQuantizationLayerQASYMM8Fixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(QuantizationLargeShapes,
155 framework::dataset::make("DataType", DataType::F16)),
156 framework::dataset::make("DataTypeOut", { DataType::QASYMM8 })),
157 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
John Kesapidesadfb2732019-03-04 16:29:22 +0000158{
159 // Validate output
160 validate(Accessor(_target), _reference, tolerance_u8);
161}
Michele Di Giorgiod64a46c2019-10-01 12:25:49 +0100162FIXTURE_DATA_TEST_CASE(RunLargeQASYMM16, NEQuantizationLayerQASYMM16Fixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(QuantizationLargeShapes,
163 framework::dataset::make("DataType", DataType::F16)),
164 framework::dataset::make("DataTypeOut", { DataType::QASYMM16 })),
165 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
166{
167 // Validate output
168 validate(Accessor(_target), _reference, tolerance_u16);
169}
John Kesapidesadfb2732019-03-04 16:29:22 +0000170TEST_SUITE_END() // FP16
John Kesapidesadfb2732019-03-04 16:29:22 +0000171#endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Michele Di Giorgiod64a46c2019-10-01 12:25:49 +0100172TEST_SUITE_END() // Float
Michele Di Giorgio4e09b382017-07-05 18:20:02 +0100173
Manuel Bottini4370cff2020-02-07 16:31:59 +0000174TEST_SUITE(Quantized)
175template <typename T>
176using NEQuantizationLayerQASYMM8GenFixture = QuantizationValidationGenericFixture<Tensor, Accessor, NEQuantizationLayer, T, uint8_t>;
177template <typename T>
178using NEQuantizationLayerQASYMM8_SIGNEDGenFixture = QuantizationValidationGenericFixture<Tensor, Accessor, NEQuantizationLayer, T, int8_t>;
179template <typename T>
180using NEQuantizationLayerQASYMM16GenFixture = QuantizationValidationGenericFixture<Tensor, Accessor, NEQuantizationLayer, T, uint16_t>;
181TEST_SUITE(QASYMM8)
182FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8, NEQuantizationLayerQASYMM8GenFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(QuantizationSmallShapes,
183 framework::dataset::make("DataType", DataType::QASYMM8)),
184 framework::dataset::make("DataTypeOut", { DataType::QASYMM8 })),
185 framework::dataset::make("QuantizationInfoOutput", { QuantizationInfo(0.5f, 10) })),
Mohammed Suhail Munshi0a48c4c2024-01-30 18:25:51 +0000186 framework::dataset::make("QuantizationInfoInput", { QuantizationInfo(2.0f, 15), QuantizationInfo(0.5f, 25) })))
187{
188 // Validate output
189 validate(Accessor(_target), _reference, tolerance_u8);
190}
191FIXTURE_DATA_TEST_CASE(ConvertUint8toInt8, NEQuantizationLayerQASYMM8GenFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(QuantizationSmallShapes,
192 framework::dataset::make("DataType", DataType::QASYMM8)),
193 framework::dataset::make("DataTypeOut", { DataType::QASYMM8_SIGNED })),
194 framework::dataset::make("QuantizationInfoOutput", { QuantizationInfo(2.0f, -1) })),
195 framework::dataset::make("QuantizationInfoInput", { QuantizationInfo(2.0f, 127) })))
Manuel Bottini4370cff2020-02-07 16:31:59 +0000196{
197 // Validate output
198 validate(Accessor(_target), _reference, tolerance_u8);
199}
200FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8_SIGNED, NEQuantizationLayerQASYMM8_SIGNEDGenFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(QuantizationSmallShapes,
201 framework::dataset::make("DataTypeIn", DataType::QASYMM8)),
202 framework::dataset::make("DataTypeOut", { DataType::QASYMM8_SIGNED })),
203 framework::dataset::make("QuantizationInfoOutput", { QuantizationInfo(1.0f, 10), QuantizationInfo(2.0f, -25) })),
Mohammed Suhail Munshi0a48c4c2024-01-30 18:25:51 +0000204 framework::dataset::make("QuantizationInfoInput", { QuantizationInfo(1.0f, 15), QuantizationInfo(1.0f, 127) })))
Manuel Bottini4370cff2020-02-07 16:31:59 +0000205{
206 // Validate output
207 validate(Accessor(_target), _reference, tolerance_s8);
208}
209FIXTURE_DATA_TEST_CASE(RunSmallQASYMM16, NEQuantizationLayerQASYMM16GenFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(QuantizationSmallShapes,
210 framework::dataset::make("DataTypeIn", DataType::QASYMM8)),
211 framework::dataset::make("DataTypeOut", { DataType::QASYMM16 })),
212 framework::dataset::make("QuantizationInfoOutput", { QuantizationInfo(1.0f, 10) })),
213 framework::dataset::make("QuantizationInfoInput", { QuantizationInfo(4.0f, 23) })))
214{
215 // Validate output
216 validate(Accessor(_target), _reference, tolerance_u16);
217}
218TEST_SUITE_END() // QASYMM8
219TEST_SUITE(QASYMM8_SIGNED)
220FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8_SIGNED, NEQuantizationLayerQASYMM8_SIGNEDGenFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(QuantizationSmallShapes,
221 framework::dataset::make("DataTypeIn", DataType::QASYMM8_SIGNED)),
222 framework::dataset::make("DataTypeOut", { DataType::QASYMM8_SIGNED })),
223 framework::dataset::make("QuantizationInfoOutput", { QuantizationInfo(1.0f, 10) })),
Mohammed Suhail Munshi0a48c4c2024-01-30 18:25:51 +0000224 framework::dataset::make("QuantizationInfoInput", { QuantizationInfo(2.0f, -5), QuantizationInfo(1.0f, 43) })))
Manuel Bottini4370cff2020-02-07 16:31:59 +0000225{
226 // Validate output
227 validate(Accessor(_target), _reference, tolerance_s8);
228}
229FIXTURE_DATA_TEST_CASE(RunSmallQASYMM8, NEQuantizationLayerQASYMM8GenFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(QuantizationSmallShapes,
230 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
231 framework::dataset::make("DataTypeOut", { DataType::QASYMM8 })),
232 framework::dataset::make("QuantizationInfoOutput", { QuantizationInfo(2.0f, 10), QuantizationInfo(2.0f, -25) })),
Mohammed Suhail Munshi0a48c4c2024-01-30 18:25:51 +0000233 framework::dataset::make("QuantizationInfoInput", { QuantizationInfo(1.0f, 30), QuantizationInfo(2.0f, -128) })))
Manuel Bottini4370cff2020-02-07 16:31:59 +0000234{
235 // Validate output
236 validate(Accessor(_target), _reference, tolerance_u8);
237}
Mohammed Suhail Munshi0a48c4c2024-01-30 18:25:51 +0000238FIXTURE_DATA_TEST_CASE(ConvertInt8toUint8, NEQuantizationLayerQASYMM8_SIGNEDGenFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(QuantizationSmallShapes,
239 framework::dataset::make("DataTypeIn", DataType::QASYMM8_SIGNED)),
240 framework::dataset::make("DataTypeOut", { DataType::QASYMM8 })),
241 framework::dataset::make("QuantizationInfoOutput", { QuantizationInfo(1.0f, 0) })),
242 framework::dataset::make("QuantizationInfoInput", { QuantizationInfo(1.0f, -128) })))
243{
244 // Validate output
245 validate(Accessor(_target), _reference, tolerance_s8);
246}
247
Manuel Bottini4370cff2020-02-07 16:31:59 +0000248TEST_SUITE_END() // QASYMM8_SIGNED
249TEST_SUITE_END() // Quantized
250
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000251TEST_SUITE_END() // QuantizationLayer
Sheri Zhangac6499a2021-02-10 15:32:38 +0000252TEST_SUITE_END() // Neon
Michele Di Giorgio4e09b382017-07-05 18:20:02 +0100253} // namespace validation
254} // namespace test
255} // namespace arm_compute