blob: 5a34ac2db4b0413f489728b163c1c1cafe7a5f1d [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
80 TosaSerializationBasicBlock* basicBlock =
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000081 GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(pool));
Cathal Corbettbd18eab2022-11-15 12:56:16 +000082 VerifyAvgPool2DIgnoreValue(basicBlock,
83 inputShape,
84 outputShape,
85 intermediateShape,
86 descriptor);
87}
Kevin May1bea6be2023-12-12 11:18:46 +000088
Teresa Charlinca5a23a2023-12-15 14:20:47 +000089TEST_CASE("GetTosaMapping_QuantizeLayer")
90{
91 NullDescriptor descriptor;
92 DataType outputDataType = DataType::Signed32;
93
94 TensorInfo inputTensorInfo({ 1, 3, 3, 1 }, DataType::Float32);
95 TensorInfo outputTensorInfo({ 1, 3, 3, 1 }, outputDataType);
96 std::vector<int32_t> shape = { 1, 3, 3, 1 };
97
98 TosaSerializationBasicBlock* basicBlock =
99 GetTosaMapping(nullptr, LayerType::Quantize, {&inputTensorInfo}, {&outputTensorInfo}, descriptor);
100 VerifyQuantize(basicBlock, shape, ArmNNToDType(DataType::Float32), ArmNNToDType(outputDataType));
101}
102TEST_CASE("GetTosaMappingFromLayer_QuantizeLayer")
103{
104 IRuntime::CreationOptions options;
105 IRuntimePtr runtime(IRuntime::Create(options));
106 // Builds up the structure of the network.
107 INetworkPtr net(INetwork::Create());
108 NullDescriptor descriptor;
109 DataType outputDataType = DataType::Signed32;
110
111 IConnectableLayer* input0 = net->AddInputLayer(0, "input0");
112 IConnectableLayer* quantize = net->AddQuantizeLayer("quantize");
113 IConnectableLayer* output = net->AddOutputLayer(0, "output");
114
115 input0->GetOutputSlot(0).Connect(quantize->GetInputSlot(0));
116 quantize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
117
118 armnn::TensorInfo inputTensorInfo({ 1, 3, 3, 1 }, DataType::Float32);
119 armnn::TensorInfo outputTensorInfo({ 1, 3, 3, 1 }, outputDataType);
120 std::vector<int32_t> shape = { 1, 3, 3, 1 };
121
122 input0->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
123 quantize->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
124
125 TosaSerializationBasicBlock* basicBlock = GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(quantize));
126 VerifyQuantize(basicBlock, shape, ArmNNToDType(DataType::Float32), ArmNNToDType(outputDataType));
127}
128
Kevin May1bea6be2023-12-12 11:18:46 +0000129TEST_CASE("GetTosaMapping_SplitLayer")
130{
131 const unsigned int numViews = 3;
132 const unsigned int numDimensions = 4;
133 armnn::ViewsDescriptor descriptor(numViews, numDimensions);
134 descriptor.SetAxis(static_cast<int32_t>(1));
135
136 std::vector<std::vector<int32_t>> inShape = {{ 1, 18, 4, 4 }};
137 std::vector<std::vector<int32_t>> outShape = {{ 1, 6, 4, 4 },{ 1, 6, 4, 4 },{ 1, 6, 4, 4 }};
138
139 armnn::TensorInfo inputTensorInfo({1, 18, 4, 4}, DataType::Float32);
140 armnn::TensorInfo outputTensorInfo({1, 6, 4, 4}, DataType::Float32);
141
142 TosaSerializationBasicBlock* basicBlock =
143 GetTosaMapping(nullptr, LayerType::Splitter, {&inputTensorInfo}, {&outputTensorInfo}, descriptor);
144
145 VerifySplit(basicBlock,
146 inShape,
147 outShape,
148 descriptor);
149}
150
151TEST_CASE("GetTosaMappingFromLayer_SplitLayer")
152{
153 IRuntime::CreationOptions options;
154 IRuntimePtr runtime(IRuntime::Create(options));
155
156 // Builds up the structure of the network.
157 INetworkPtr net(INetwork::Create());
158
159 const unsigned int numViews = 3;
160 const unsigned int numDimensions = 4;
161 armnn::ViewsDescriptor descriptor(numViews, numDimensions);
162 descriptor.SetAxis(static_cast<int32_t>(1));
163
164 std::vector<std::vector<int32_t>> inShape = {{ 1, 18, 4, 4 }};
165 std::vector<std::vector<int32_t>> outShape = {{ 1, 6, 4, 4 },{ 1, 6, 4, 4 },{ 1, 6, 4, 4 }};
166
167 IConnectableLayer* input0 = net->AddInputLayer(0, "input0");
168 IConnectableLayer* split = net->AddSplitterLayer(descriptor, "split");
169 IConnectableLayer* output0 = net->AddOutputLayer(0, "output0");
170 IConnectableLayer* output1 = net->AddOutputLayer(1, "output1");
171 IConnectableLayer* output2 = net->AddOutputLayer(2, "output2");
172
173 input0->GetOutputSlot(0).Connect(split->GetInputSlot(0));
174 split->GetOutputSlot(0).Connect(output0->GetInputSlot(0));
175 split->GetOutputSlot(1).Connect(output1->GetInputSlot(0));
176 split->GetOutputSlot(2).Connect(output2->GetInputSlot(0));
177
178 armnn::TensorInfo inputTensorInfo({1, 18, 4, 4}, DataType::Float32);
179 armnn::TensorInfo outputTensorInfo({1, 6, 4, 4}, DataType::Float32);
180
181 input0->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
182 split->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
183 split->GetOutputSlot(1).SetTensorInfo(outputTensorInfo);
184 split->GetOutputSlot(2).SetTensorInfo(outputTensorInfo);
185
186 TosaSerializationBasicBlock* basicBlock = GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(split));
187
188 VerifySplit(basicBlock,
189 inShape,
190 outShape,
191 descriptor);
192}
Tracy Narine10403ec2023-11-28 11:55:08 +0000193
194// Activation
195
196static std::vector<BackendId> tosaDefaultBackends = { "TosaRef" };
197
198TEST_CASE("GetTosaMapping_ActivationFloat32")
199{
Teresa Charlina4b60902024-02-07 20:55:53 +0000200 ActivationEndToEndTest<DataType::Float32>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000201}
202
Teresa Charlina42e0062024-04-23 13:03:40 +0100203TEST_CASE("GetTosaMapping_ActivationFloat16")
Tracy Narine10403ec2023-11-28 11:55:08 +0000204{
Teresa Charlina42e0062024-04-23 13:03:40 +0100205 ActivationEndToEndTest<DataType::Float16>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000206}
207
208TEST_CASE("GetTosaMapping_ActivationInt32")
209{
Teresa Charlina4b60902024-02-07 20:55:53 +0000210 ActivationEndToEndTest<DataType::Signed32>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.15f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000211}
212
213TEST_CASE("GetTosaMapping_ActivationInt16")
214{
Teresa Charlina4b60902024-02-07 20:55:53 +0000215 ActivationEndToEndTest<DataType::QSymmS16>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.35f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000216}
217
218TEST_CASE("GetTosaMapping_ActivationInt8")
219{
Teresa Charlina4b60902024-02-07 20:55:53 +0000220 ActivationEndToEndTest<DataType::QSymmS8>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.75f, 0, 0.01f);
Tracy Narine10403ec2023-11-28 11:55:08 +0000221}
222
Teresa Charlina4b60902024-02-07 20:55:53 +0000223TEST_CASE("UNSUPPORTED_GetTosaMapping_ActivationUInt8")
Tracy Narine10403ec2023-11-28 11:55:08 +0000224{
225 try
226 {
Teresa Charlina4b60902024-02-07 20:55:53 +0000227 ActivationEndToEndTest<DataType::QAsymmU8>(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f);
228 FAIL("An exception should have been thrown");
Tracy Narine10403ec2023-11-28 11:55:08 +0000229 }
230 catch (armnn::Exception& e)
231 {
232 CHECK_EQ(std::string(e.what()), "Failed to assign a backend to each layer");
233 }
234}
235}