blob: ed5d18b8de2f9c683e734cc2e3fdddd613e8be81 [file] [log] [blame]
Michalis Spyrou5237e012018-01-17 09:40:27 +00001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2018-2019 Arm Limited.
Michalis Spyrou5237e012018-01-17 09:40:27 +00003 *
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/CL/CLTensor.h"
26#include "arm_compute/runtime/CL/CLTensorAllocator.h"
27#include "arm_compute/runtime/CL/functions/CLPermute.h"
28#include "tests/CL/CLAccessor.h"
29#include "tests/PaddingCalculator.h"
30#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/PermuteFixture.h"
36
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43namespace
44{
shubhame1a4e372019-01-07 21:37:55 +053045const auto PermuteVectors3 = framework::dataset::make("PermutationVector",
Pablo Tello35767bc2018-12-05 17:36:30 +000046{
47 PermutationVector(2U, 0U, 1U),
48 PermutationVector(1U, 2U, 0U),
shubhame1a4e372019-01-07 21:37:55 +053049 PermutationVector(0U, 1U, 2U),
50 PermutationVector(0U, 2U, 1U),
51 PermutationVector(1U, 0U, 2U),
52 PermutationVector(2U, 1U, 0U),
Pablo Tello35767bc2018-12-05 17:36:30 +000053});
shubhame1a4e372019-01-07 21:37:55 +053054const auto PermuteVectors4 = framework::dataset::make("PermutationVector",
55{
56 PermutationVector(3U, 2U, 0U, 1U),
57 PermutationVector(3U, 2U, 1U, 0U),
58 PermutationVector(2U, 3U, 1U, 0U),
59 PermutationVector(1U, 3U, 2U, 0U),
60 PermutationVector(3U, 1U, 2U, 0U),
61 PermutationVector(3U, 0U, 2U, 1U),
62 PermutationVector(0U, 3U, 2U, 1U)
63});
64const auto PermuteVectors = concat(PermuteVectors3, PermuteVectors4);
Michalis Spyrou6bff1952019-10-02 17:22:11 +010065const auto PermuteParametersSmall = concat(concat(datasets::Small2DShapes(), datasets::Small3DShapes()), datasets::Small4DShapes()) * PermuteVectors;
66const auto PermuteParametersLarge = datasets::Large4DShapes() * PermuteVectors;
Michalis Spyrou5237e012018-01-17 09:40:27 +000067} // namespace
68TEST_SUITE(CL)
69TEST_SUITE(Permute)
70
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +000071// *INDENT-OFF*
72// clang-format off
73DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
shubhame1a4e372019-01-07 21:37:55 +053074 framework::dataset::make("InputInfo",{
75 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // valid
76 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
77 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
78 TensorInfo(TensorShape(1U, 7U), 1, DataType::U8), // invalid input size
79 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // valid
80 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // valid
81 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
82 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::S16), // valid
83 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // permutation not supported
84 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // valid
85 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32) // permutation not supported
86
87 }),
88 framework::dataset::make("OutputInfo", {
89 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
90 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16),
91 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16),
92 TensorInfo(TensorShape(5U, 7U), 1, DataType::U8),
93 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
94 TensorInfo(TensorShape(13U, 37U, 27U, 2U), 1, DataType::F32),
95 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
96 TensorInfo(TensorShape(3U, 5U, 7U, 7U), 1, DataType::S16),
97 TensorInfo(TensorShape(13U, 37U, 27U, 2U), 1, DataType::F32),
98 TensorInfo(TensorShape(37U, 2U, 13U, 27U), 1, DataType::F32),
99 TensorInfo(TensorShape(37U, 2U, 13U, 27U), 1, DataType::F32)
100
101 })),
102 framework::dataset::make("PermutationVector", {
103 PermutationVector(2U, 1U, 0U),
104 PermutationVector(2U, 2U, 1U),
105 PermutationVector(1U, 1U, 1U),
106 PermutationVector(2U, 0U, 1U),
107 PermutationVector(2U, 0U, 1U),
108 PermutationVector(1U, 2U, 0U),
109 PermutationVector(3U, 2U, 0U, 1U),
110 PermutationVector(3U, 2U, 0U, 1U),
111 PermutationVector(2U, 3U, 1U, 0U),
112 PermutationVector(2U, 3U, 1U, 0U),
113 PermutationVector(0U, 0U, 0U, 1000U)
114 })),
115 framework::dataset::make("Expected", { true, false, false, false, true, true, false, true, false, true, false })),
116 input_info, output_info, perm_vect, expected)
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +0000117{
118 ARM_COMPUTE_EXPECT(bool(CLPermute::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), perm_vect)) == expected, framework::LogLevel::ERRORS);
119}
120// clang-format on
121// *INDENT-ON*
122
Michalis Spyrou5237e012018-01-17 09:40:27 +0000123DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::Small4DShapes(), framework::dataset::make("DataType", { DataType::S8, DataType::U8, DataType::S16, DataType::U16, DataType::U32, DataType::S32, DataType::F16, DataType::F32 })),
124 shape, data_type)
125{
126 // Define permutation vector
127 const PermutationVector perm(2U, 0U, 1U);
128
129 // Permute shapes
130 TensorShape output_shape = shape;
131 permute(output_shape, perm);
132
133 // Create tensors
134 CLTensor ref_src = create_tensor<CLTensor>(shape, data_type);
135 CLTensor dst = create_tensor<CLTensor>(output_shape, data_type);
136
137 // Create and Configure function
138 CLPermute perm_func;
139 perm_func.configure(&ref_src, &dst, perm);
140
141 // Validate valid region
142 const ValidRegion valid_region = shape_to_valid_region(output_shape);
143 validate(dst.info()->valid_region(), valid_region);
144}
145
shubhame1a4e372019-01-07 21:37:55 +0530146#ifndef DOXYGEN_SKIP_THIS
147
Michalis Spyrou5237e012018-01-17 09:40:27 +0000148template <typename T>
149using CLPermuteFixture = PermuteValidationFixture<CLTensor, CLAccessor, CLPermute, T>;
150
151TEST_SUITE(U8)
shubhame1a4e372019-01-07 21:37:55 +0530152FIXTURE_DATA_TEST_CASE(RunSmall, CLPermuteFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
153 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U8))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000154{
155 // Validate output
156 validate(CLAccessor(_target), _reference);
157}
shubhame1a4e372019-01-07 21:37:55 +0530158
159FIXTURE_DATA_TEST_CASE(RunLarge, CLPermuteFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
160 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U8))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000161{
162 // Validate output
163 validate(CLAccessor(_target), _reference);
164}
shubhame1a4e372019-01-07 21:37:55 +0530165TEST_SUITE_END() // U8
Michalis Spyrou5237e012018-01-17 09:40:27 +0000166
167TEST_SUITE(U16)
shubhame1a4e372019-01-07 21:37:55 +0530168FIXTURE_DATA_TEST_CASE(RunSmall, CLPermuteFixture<uint16_t>, framework::DatasetMode::PRECOMMIT,
169 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U16))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000170{
171 // Validate output
172 validate(CLAccessor(_target), _reference);
173}
shubhame1a4e372019-01-07 21:37:55 +0530174FIXTURE_DATA_TEST_CASE(RunLarge, CLPermuteFixture<uint16_t>, framework::DatasetMode::NIGHTLY,
175 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U16))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000176{
177 // Validate output
178 validate(CLAccessor(_target), _reference);
179}
shubhame1a4e372019-01-07 21:37:55 +0530180TEST_SUITE_END() // U16
Michalis Spyrou5237e012018-01-17 09:40:27 +0000181
182TEST_SUITE(U32)
shubhame1a4e372019-01-07 21:37:55 +0530183FIXTURE_DATA_TEST_CASE(RunSmall, CLPermuteFixture<uint32_t>, framework::DatasetMode::PRECOMMIT,
184 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U32))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000185{
186 // Validate output
187 validate(CLAccessor(_target), _reference);
188}
shubhame1a4e372019-01-07 21:37:55 +0530189FIXTURE_DATA_TEST_CASE(RunLarge, CLPermuteFixture<uint32_t>, framework::DatasetMode::NIGHTLY,
190 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U32))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000191{
192 // Validate output
193 validate(CLAccessor(_target), _reference);
194}
shubhame1a4e372019-01-07 21:37:55 +0530195TEST_SUITE_END() // U32
Michalis Spyrou5237e012018-01-17 09:40:27 +0000196
shubhame1a4e372019-01-07 21:37:55 +0530197#endif /* DOXYGEN_SKIP_THIS */
198
199TEST_SUITE_END() // Permute
200TEST_SUITE_END() // CL
Michalis Spyrou5237e012018-01-17 09:40:27 +0000201} // namespace validation
202} // namespace test
203} // namespace arm_compute