blob: 6ad6ea8d05371632cc06de8fa4fab00d19182eae [file] [log] [blame]
Cathal Corbettbd18eab2022-11-15 12:56:16 +00001//
Tracy Narine10403ec2023-11-28 11:55:08 +00002// Copyright © 2022-2024 Arm Ltd and Contributors. All rights reserved.
Cathal Corbettbd18eab2022-11-15 12:56:16 +00003// SPDX-License-Identifier: MIT
4//
5
6#include "AvgPool2DIgnoreValueChecker.hpp"
Teresa Charlinca5a23a2023-12-15 14:20:47 +00007#include "QuantizeChecker.hpp"
Kevin May1bea6be2023-12-12 11:18:46 +00008#include "SplitChecker.hpp"
Tracy Narine10403ec2023-11-28 11:55:08 +00009#include <backendsCommon/test/ActivationEndToEndTestImpl.hpp>
Cathal Corbett6d2647d2022-12-13 11:37:57 +000010#include <armnn/IRuntime.hpp>
Cathal Corbettbd18eab2022-11-15 12:56:16 +000011
12using namespace armnn;
13using namespace tosa;
14
15TEST_SUITE("TosaOperatorMappingOneToManyTests")
16{
17TEST_CASE("GetTosaMapping_AvgPool2DIgnoreValueLayer")
18{
19 armnn::Pooling2dDescriptor descriptor;
20 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
21 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
22 descriptor.m_StrideX = descriptor.m_StrideY = 2;
23 descriptor.m_PadLeft = 1;
24 descriptor.m_PadRight = 1;
25 descriptor.m_PadTop = 1;
26 descriptor.m_PadBottom = 1;
27 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
28
29 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, DataType::Float32);
30 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, DataType::Float32);
31
32 std::vector<std::vector<int32_t>> inputShape = {{ 1, 1, 4, 4 }};
33 std::vector<std::vector<int32_t>> intermediateShape = {{ 1, 1, 6, 6 }};
34 std::vector<std::vector<int32_t>> outputShape = {{ 1, 1, 3, 3 }};
35
36 TosaSerializationBasicBlock* basicBlock =
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000037 GetTosaMapping(nullptr, LayerType::Pooling2d, {&inputTensorInfo}, {&outputTensorInfo}, descriptor);
Cathal Corbettbd18eab2022-11-15 12:56:16 +000038 VerifyAvgPool2DIgnoreValue(basicBlock,
39 inputShape,
40 outputShape,
41 intermediateShape,
42 descriptor);
43}
44
45TEST_CASE("GetTosaMappingFromLayer_AvgPool2DIgnoreValueLayer")
46{
47 IRuntime::CreationOptions options;
48 IRuntimePtr runtime(IRuntime::Create(options));
49
50 // Builds up the structure of the network.
51 INetworkPtr net(INetwork::Create());
52
53 armnn::Pooling2dDescriptor descriptor;
54 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
55 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
56 descriptor.m_StrideX = descriptor.m_StrideY = 2;
57 descriptor.m_PadLeft = 1;
58 descriptor.m_PadRight = 1;
59 descriptor.m_PadTop = 1;
60 descriptor.m_PadBottom = 1;
61 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
62
63 IConnectableLayer* input0 = net->AddInputLayer(0, "input0");
64 IConnectableLayer* pool = net->AddPooling2dLayer(descriptor, "pool");
65 IConnectableLayer* output = net->AddOutputLayer(0, "output");
66
67 input0->GetOutputSlot(0).Connect(pool->GetInputSlot(0));
68 pool->GetOutputSlot(0).Connect(output->GetInputSlot(0));
69
70 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, DataType::Float32);
71 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, DataType::Float32);
72
73 std::vector<std::vector<int32_t>> inputShape = {{ 1, 1, 4, 4 }};
74 std::vector<std::vector<int32_t>> intermediateShape = {{ 1, 1, 6, 6 }};
75 std::vector<std::vector<int32_t>> outputShape = {{ 1, 1, 3, 3 }};
76
77 input0->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
78 pool->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
79
Teresa Charlin8cfd0592024-04-23 16:22:47 +010080 TosaSerializationBasicBlock* basicBlock = GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(pool));
Cathal Corbettbd18eab2022-11-15 12:56:16 +000081 VerifyAvgPool2DIgnoreValue(basicBlock,
82 inputShape,
83 outputShape,
84 intermediateShape,
85 descriptor);
86}
Kevin May1bea6be2023-12-12 11:18:46 +000087
Teresa Charlinca5a23a2023-12-15 14:20:47 +000088TEST_CASE("GetTosaMapping_QuantizeLayer")
89{
90 NullDescriptor descriptor;
91 DataType outputDataType = DataType::Signed32;
92
93 TensorInfo inputTensorInfo({ 1, 3, 3, 1 }, DataType::Float32);
94 TensorInfo outputTensorInfo({ 1, 3, 3, 1 }, outputDataType);
95 std::vector<int32_t> shape = { 1, 3, 3, 1 };
96
97 TosaSerializationBasicBlock* basicBlock =
98 GetTosaMapping(nullptr, LayerType::Quantize, {&inputTensorInfo}, {&outputTensorInfo}, descriptor);
99 VerifyQuantize(basicBlock, shape, ArmNNToDType(DataType::Float32), ArmNNToDType(outputDataType));
100}
101TEST_CASE("GetTosaMappingFromLayer_QuantizeLayer")
102{
103 IRuntime::CreationOptions options;
104 IRuntimePtr runtime(IRuntime::Create(options));
105 // Builds up the structure of the network.
106 INetworkPtr net(INetwork::Create());
107 NullDescriptor descriptor;
108 DataType outputDataType = DataType::Signed32;
109
110 IConnectableLayer* input0 = net->AddInputLayer(0, "input0");
111 IConnectableLayer* quantize = net->AddQuantizeLayer("quantize");
112 IConnectableLayer* output = net->AddOutputLayer(0, "output");
113
114 input0->GetOutputSlot(0).Connect(quantize->GetInputSlot(0));
115 quantize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
116
117 armnn::TensorInfo inputTensorInfo({ 1, 3, 3, 1 }, DataType::Float32);
118 armnn::TensorInfo outputTensorInfo({ 1, 3, 3, 1 }, outputDataType);
119 std::vector<int32_t> shape = { 1, 3, 3, 1 };
120
121 input0->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
122 quantize->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
123
124 TosaSerializationBasicBlock* basicBlock = GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(quantize));
125 VerifyQuantize(basicBlock, shape, ArmNNToDType(DataType::Float32), ArmNNToDType(outputDataType));
126}
127
Kevin May1bea6be2023-12-12 11:18:46 +0000128TEST_CASE("GetTosaMapping_SplitLayer")
129{
130 const unsigned int numViews = 3;
131 const unsigned int numDimensions = 4;
132 armnn::ViewsDescriptor descriptor(numViews, numDimensions);
133 descriptor.SetAxis(static_cast<int32_t>(1));
134
135 std::vector<std::vector<int32_t>> inShape = {{ 1, 18, 4, 4 }};
136 std::vector<std::vector<int32_t>> outShape = {{ 1, 6, 4, 4 },{ 1, 6, 4, 4 },{ 1, 6, 4, 4 }};
137
138 armnn::TensorInfo inputTensorInfo({1, 18, 4, 4}, DataType::Float32);
139 armnn::TensorInfo outputTensorInfo({1, 6, 4, 4}, DataType::Float32);
140
Teresa Charlin7db70892024-04-23 13:43:03 +0100141 TosaSerializationBasicBlock* basicBlock = GetTosaMapping(nullptr,
142 LayerType::Splitter,
143 {&inputTensorInfo},
144 {&outputTensorInfo, &outputTensorInfo, &outputTensorInfo},
145 descriptor);
Kevin May1bea6be2023-12-12 11:18:46 +0000146
147 VerifySplit(basicBlock,
148 inShape,
149 outShape,
150 descriptor);
151}
152
153TEST_CASE("GetTosaMappingFromLayer_SplitLayer")
154{
155 IRuntime::CreationOptions options;
156 IRuntimePtr runtime(IRuntime::Create(options));
157
158 // Builds up the structure of the network.
159 INetworkPtr net(INetwork::Create());
160
161 const unsigned int numViews = 3;
162 const unsigned int numDimensions = 4;
163 armnn::ViewsDescriptor descriptor(numViews, numDimensions);
164 descriptor.SetAxis(static_cast<int32_t>(1));
165
166 std::vector<std::vector<int32_t>> inShape = {{ 1, 18, 4, 4 }};
167 std::vector<std::vector<int32_t>> outShape = {{ 1, 6, 4, 4 },{ 1, 6, 4, 4 },{ 1, 6, 4, 4 }};
168
169 IConnectableLayer* input0 = net->AddInputLayer(0, "input0");
170 IConnectableLayer* split = net->AddSplitterLayer(descriptor, "split");
171 IConnectableLayer* output0 = net->AddOutputLayer(0, "output0");
172 IConnectableLayer* output1 = net->AddOutputLayer(1, "output1");
173 IConnectableLayer* output2 = net->AddOutputLayer(2, "output2");
174
175 input0->GetOutputSlot(0).Connect(split->GetInputSlot(0));
176 split->GetOutputSlot(0).Connect(output0->GetInputSlot(0));
177 split->GetOutputSlot(1).Connect(output1->GetInputSlot(0));
178 split->GetOutputSlot(2).Connect(output2->GetInputSlot(0));
179
180 armnn::TensorInfo inputTensorInfo({1, 18, 4, 4}, DataType::Float32);
181 armnn::TensorInfo outputTensorInfo({1, 6, 4, 4}, DataType::Float32);
182
183 input0->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
184 split->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
185 split->GetOutputSlot(1).SetTensorInfo(outputTensorInfo);
186 split->GetOutputSlot(2).SetTensorInfo(outputTensorInfo);
187
188 TosaSerializationBasicBlock* basicBlock = GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(split));
189
190 VerifySplit(basicBlock,
191 inShape,
192 outShape,
193 descriptor);
194}
Tracy Narine10403ec2023-11-28 11:55:08 +0000195
196// Activation
197
198static std::vector<BackendId> tosaDefaultBackends = { "TosaRef" };
199
200TEST_CASE("GetTosaMapping_ActivationFloat32")
201{
Teresa Charlina4b60902024-02-07 20:55:53 +0000202 ActivationEndToEndTest<DataType::Float32>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000203}
204
Teresa Charlina42e0062024-04-23 13:03:40 +0100205TEST_CASE("GetTosaMapping_ActivationFloat16")
Tracy Narine10403ec2023-11-28 11:55:08 +0000206{
Teresa Charlina42e0062024-04-23 13:03:40 +0100207 ActivationEndToEndTest<DataType::Float16>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000208}
209
210TEST_CASE("GetTosaMapping_ActivationInt32")
211{
Teresa Charlina4b60902024-02-07 20:55:53 +0000212 ActivationEndToEndTest<DataType::Signed32>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.15f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000213}
214
215TEST_CASE("GetTosaMapping_ActivationInt16")
216{
Teresa Charlina4b60902024-02-07 20:55:53 +0000217 ActivationEndToEndTest<DataType::QSymmS16>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.35f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000218}
219
220TEST_CASE("GetTosaMapping_ActivationInt8")
221{
Teresa Charlina4b60902024-02-07 20:55:53 +0000222 ActivationEndToEndTest<DataType::QSymmS8>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.75f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000223}
224
Teresa Charlina4b60902024-02-07 20:55:53 +0000225TEST_CASE("UNSUPPORTED_GetTosaMapping_ActivationUInt8")
Tracy Narine10403ec2023-11-28 11:55:08 +0000226{
227 try
228 {
Teresa Charlina4b60902024-02-07 20:55:53 +0000229 ActivationEndToEndTest<DataType::QAsymmU8>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f);
230 FAIL("An exception should have been thrown");
Tracy Narine10403ec2023-11-28 11:55:08 +0000231 }
232 catch (armnn::Exception& e)
233 {
234 CHECK_EQ(std::string(e.what()), "Failed to assign a backend to each layer");
235 }
236}
237}