blob: c9ebdd5182c1feabb89a0edfe4bb4b4f1b17c753 [file] [log] [blame]
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +01001/*
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +00002 * Copyright (c) 2017-2019 ARM Limited.
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +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/NETranspose.h"
26#include "arm_compute/runtime/Tensor.h"
27#include "arm_compute/runtime/TensorAllocator.h"
28#include "tests/NEON/Accessor.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/TransposeFixture.h"
36
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43TEST_SUITE(NEON)
44TEST_SUITE(Transpose)
45
Gian Marcob42d53c2017-12-07 10:09:07 +000046// *INDENT-OFF*
47// clang-format off
48DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(
49 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(21U, 13U), 1, DataType::U8), // Input not a multiple of 8
50 TensorInfo(TensorShape(21U, 13U), 1, DataType::U16), // Invalid shape
Giorgio Arenae3d24ce2018-08-24 14:44:08 +010051 TensorInfo(TensorShape(20U, 13U), 1, DataType::U32), // Window shrink
Gian Marcob42d53c2017-12-07 10:09:07 +000052 TensorInfo(TensorShape(20U, 13U), 1, DataType::U8), // Wrong data type
Giorgio Arenae3d24ce2018-08-24 14:44:08 +010053 TensorInfo(TensorShape(20U, 16U), 1, DataType::U16),
54 TensorInfo(TensorShape(20U, 16U), 1, DataType::U32),
Gian Marcob42d53c2017-12-07 10:09:07 +000055 }),
56 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(13U, 21U), 1, DataType::U8),
57 TensorInfo(TensorShape(21U, 13U), 1, DataType::U16),
58 TensorInfo(TensorShape(13U, 20U), 1, DataType::U32),
59 TensorInfo(TensorShape(31U, 20U), 1, DataType::U16),
Giorgio Arenae3d24ce2018-08-24 14:44:08 +010060 TensorInfo(TensorShape(16U, 20U), 1, DataType::U16),
61 TensorInfo(TensorShape(16U, 20U), 1, DataType::U32),
Gian Marcob42d53c2017-12-07 10:09:07 +000062 })),
Giorgio Arenae3d24ce2018-08-24 14:44:08 +010063 framework::dataset::make("Expected", { false, false, false, false, true, true })),
Gian Marcob42d53c2017-12-07 10:09:07 +000064 a_info, output_info, expected)
65{
66 // Lock tensors
67 Status status = NETranspose::validate(&a_info.clone()->set_is_resizable(false),
68 &output_info.clone()->set_is_resizable(false));
69 ARM_COMPUTE_EXPECT(bool(status) == expected, framework::LogLevel::ERRORS);
70}
71// clang-format on
72// *INDENT-ON*
73
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +000074DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::Small2DShapes(), framework::dataset::make("DataType", { DataType::S8, DataType::U8, DataType::S16, DataType::U16, DataType::U32, DataType::S32, DataType::F16, DataType::F32 })),
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +010075 shape, data_type)
76{
77 // Make rows the columns of the original shape
78 TensorShape output_shape{ shape[1], shape[0] };
79
80 // Create tensors
Gian Marcob42d53c2017-12-07 10:09:07 +000081 Tensor src = create_tensor<Tensor>(shape, data_type);
82 Tensor dst = create_tensor<Tensor>(output_shape, data_type);
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +010083
84 // Create and Configure function
85 NETranspose trans;
Gian Marcob42d53c2017-12-07 10:09:07 +000086 trans.configure(&src, &dst);
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +010087
88 // Validate valid region
89 const ValidRegion valid_region = shape_to_valid_region(output_shape);
90 validate(dst.info()->valid_region(), valid_region);
91
Gian Marcob42d53c2017-12-07 10:09:07 +000092 // Validate padding
Giorgio Arenae3d24ce2018-08-24 14:44:08 +010093 const unsigned int num_elems_processed_per_iteration_x = 1;
94 const unsigned int num_elems_processed_per_iteration_y = std::max(4, static_cast<int>(8 / src.info()->element_size()));
95 const unsigned int max_in_x = ceil_to_multiple(shape[0], num_elems_processed_per_iteration_x);
96 const unsigned int max_in_y = ceil_to_multiple(shape[1], num_elems_processed_per_iteration_y);
97 const unsigned int max_out_x = ceil_to_multiple(output_shape[0], num_elems_processed_per_iteration_y);
98 const unsigned int max_out_y = ceil_to_multiple(output_shape[1], num_elems_processed_per_iteration_x);
99
100 const PaddingSize in_padding(0, max_in_x - shape[0], max_in_y - shape[1], 0);
101 const PaddingSize out_padding(0, max_out_x - output_shape[0], max_out_y - output_shape[1], 0);
102 validate(src.info()->padding(), in_padding);
103 validate(dst.info()->padding(), out_padding);
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +0100104}
105
106template <typename T>
107using NETransposeFixture = TransposeValidationFixture<Tensor, Accessor, NETranspose, T>;
108
109TEST_SUITE(U8)
Gian Marcob42d53c2017-12-07 10:09:07 +0000110FIXTURE_DATA_TEST_CASE(RunSmall, NETransposeFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(concat(datasets::Small1DShapes(), datasets::Small2DShapes()),
111 framework::dataset::make("DataType", DataType::U8)))
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +0100112{
113 // Validate output
114 validate(Accessor(_target), _reference);
115}
Gian Marcob42d53c2017-12-07 10:09:07 +0000116FIXTURE_DATA_TEST_CASE(RunLarge, NETransposeFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(concat(datasets::Large1DShapes(), datasets::Large2DShapes()),
117 framework::dataset::make("DataType", DataType::U8)))
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +0100118{
119 // Validate output
120 validate(Accessor(_target), _reference);
121}
122TEST_SUITE_END()
123
124TEST_SUITE(U16)
Gian Marcob42d53c2017-12-07 10:09:07 +0000125FIXTURE_DATA_TEST_CASE(RunSmall, NETransposeFixture<uint16_t>, framework::DatasetMode::PRECOMMIT, combine(concat(datasets::Small1DShapes(), datasets::Small2DShapes()),
126 framework::dataset::make("DataType", DataType::U16)))
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +0100127{
128 // Validate output
129 validate(Accessor(_target), _reference);
130}
Gian Marcob42d53c2017-12-07 10:09:07 +0000131FIXTURE_DATA_TEST_CASE(RunLarge, NETransposeFixture<uint16_t>, framework::DatasetMode::NIGHTLY, combine(concat(datasets::Large1DShapes(), datasets::Large2DShapes()),
132 framework::dataset::make("DataType", DataType::U16)))
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +0100133{
134 // Validate output
135 validate(Accessor(_target), _reference);
136}
137TEST_SUITE_END()
138
139TEST_SUITE(U32)
Gian Marcob42d53c2017-12-07 10:09:07 +0000140FIXTURE_DATA_TEST_CASE(RunSmall, NETransposeFixture<uint32_t>, framework::DatasetMode::PRECOMMIT, combine(concat(datasets::Small1DShapes(), datasets::Small2DShapes()),
141 framework::dataset::make("DataType", DataType::U32)))
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +0100142{
143 // Validate output
144 validate(Accessor(_target), _reference);
145}
Gian Marcob42d53c2017-12-07 10:09:07 +0000146FIXTURE_DATA_TEST_CASE(RunLarge, NETransposeFixture<uint32_t>, framework::DatasetMode::NIGHTLY, combine(concat(datasets::Large1DShapes(), datasets::Large2DShapes()),
147 framework::dataset::make("DataType", DataType::U32)))
Ioan-Cristian Szabo5a99ddf2017-10-26 16:46:04 +0100148{
149 // Validate output
150 validate(Accessor(_target), _reference);
151}
152TEST_SUITE_END()
153
154TEST_SUITE_END()
155TEST_SUITE_END()
156} // namespace validation
157} // namespace test
158} // namespace arm_compute