blob: 5b128a1f6cc4ec942f608d344830134f5cd6dd01 [file] [log] [blame]
Aron Virginas-Tar70104002018-10-24 15:33:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <Graph.hpp>
7#include <Network.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +01008
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <reference/RefWorkloadFactory.hpp>
Sadik Armagana097d2a2021-11-24 15:47:28 +000010#include <GraphUtils.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010011
Sadik Armagan1625efc2021-06-10 18:24:34 +010012#include <doctest/doctest.h>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010013
Sadik Armagan1625efc2021-06-10 18:24:34 +010014TEST_SUITE("RefOptimizedNetwork")
15{
16TEST_CASE("OptimizeValidateCpuRefWorkloads")
Aron Virginas-Tar70104002018-10-24 15:33:28 +010017{
18 const armnn::TensorInfo desc({3, 5}, armnn::DataType::Float32);
19
Kevin Mayd92a6e42021-02-04 10:27:41 +000020 // build up the structure of the network
21 armnn::INetworkPtr net(armnn::INetwork::Create());
Aron Virginas-Tar70104002018-10-24 15:33:28 +010022
23 armnn::NormalizationDescriptor nmDesc;
24 armnn::ActivationDescriptor acDesc;
25
26 // in
27 // |
28 // nm
29 // / |
30 // ac |
31 // \ |
32 // ml
33 // |
34 // sm
35 // |
36 // ot
Kevin Mayd92a6e42021-02-04 10:27:41 +000037 armnn::IConnectableLayer* layer = net->AddInputLayer(0, "in");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010038 layer->GetOutputSlot(0).SetTensorInfo(desc);
39
Kevin Mayd92a6e42021-02-04 10:27:41 +000040 armnn::IConnectableLayer* const normLayer = net->AddNormalizationLayer(nmDesc, "nm");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010041
42 layer->GetOutputSlot(0).Connect(normLayer->GetInputSlot(0));
43 normLayer->GetOutputSlot(0).SetTensorInfo(desc);
44
Kevin Mayd92a6e42021-02-04 10:27:41 +000045 layer = net->AddActivationLayer(acDesc, "ac");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010046
47 normLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
48 layer->GetOutputSlot(0).SetTensorInfo(desc);
49
50 armnn::IConnectableLayer* prevLayer = layer;
Kevin Mayd92a6e42021-02-04 10:27:41 +000051 layer = net->AddMultiplicationLayer("ml");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010052
53 prevLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
54 normLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(1));
55 layer->GetOutputSlot(0).SetTensorInfo(desc);
56
57 prevLayer = layer;
58 armnn::SoftmaxDescriptor softmaxDescriptor;
Kevin Mayd92a6e42021-02-04 10:27:41 +000059 layer = net->AddSoftmaxLayer(softmaxDescriptor, "sm");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010060
61 prevLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
62 layer->GetOutputSlot(0).SetTensorInfo(desc);
63
64 prevLayer = layer;
Kevin Mayd92a6e42021-02-04 10:27:41 +000065 layer = net->AddOutputLayer(0, "ot");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010066
67 prevLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(0));
68
69 armnn::IRuntime::CreationOptions options;
70 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
71
72 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Kevin Mayd92a6e42021-02-04 10:27:41 +000073 armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000074 armnn::Graph& graph = GetGraphForTesting(optNet.get());
75 graph.AllocateDynamicBuffers();
Sadik Armagan1625efc2021-06-10 18:24:34 +010076 CHECK(optNet);
Aron Virginas-Tar70104002018-10-24 15:33:28 +010077
78 // Validates workloads.
79 armnn::RefWorkloadFactory fact;
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000080 for (auto&& layer : graph)
Aron Virginas-Tar70104002018-10-24 15:33:28 +010081 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010082 CHECK_NOTHROW(layer->CreateWorkload(fact));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010083 }
84}
85
Sadik Armagan1625efc2021-06-10 18:24:34 +010086TEST_CASE("OptimizeValidateWorkloadsCpuRefPermuteLayer")
Aron Virginas-Tar70104002018-10-24 15:33:28 +010087{
88 // Create runtime in which test will run
89 armnn::IRuntime::CreationOptions options;
90 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
91
92 std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
93
94 // build up the structure of the network
95 armnn::INetworkPtr net(armnn::INetwork::Create());
96
97 armnn::IConnectableLayer* input = net->AddInputLayer(0);
98
99 armnn::PermuteDescriptor descriptor({0, 2, 3, 1});
100 armnn::IConnectableLayer* permute = net->AddPermuteLayer(descriptor);
101
102 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
103
104 input->GetOutputSlot(0).Connect(permute->GetInputSlot(0));
105 permute->GetOutputSlot(0).Connect(output->GetInputSlot(0));
106
107 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
108 permute->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 4, 1, 4 }, armnn::DataType::Float32));
109
110 // optimize the network
111 armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
112
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000113 armnn::Graph& graph = GetGraphForTesting(optNet.get());
114 graph.AllocateDynamicBuffers();
115
116 for (auto&& layer : graph)
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100117 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100118 CHECK(layer->GetBackendId() == armnn::Compute::CpuRef);
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100119 }
120}
121
Sadik Armagan1625efc2021-06-10 18:24:34 +0100122TEST_CASE("OptimizeValidateWorkloadsCpuRefMeanLayer")
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100123{
124 // Create runtime in which test will run
125 armnn::IRuntime::CreationOptions options;
126 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
127
128 std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
129
130 // build up the structure of the network
131 armnn::INetworkPtr net(armnn::INetwork::Create());
132
133 armnn::IConnectableLayer* input = net->AddInputLayer(0);
134
135 armnn::MeanDescriptor descriptor({ 0, 1 }, false);
136 armnn::IConnectableLayer* meanLayer = net->AddMeanLayer(descriptor);
137
138 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
139
140 input->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
141 meanLayer->GetOutputSlot(0).Connect(output->GetInputSlot(0));
142
143 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 4, 3, 2 }, armnn::DataType::Float32));
144 meanLayer->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 2 }, armnn::DataType::Float32));
145
146 // optimize the network
147 armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000148 armnn::Graph& graph = GetGraphForTesting(optNet.get());
149 graph.AllocateDynamicBuffers();
150 for (auto&& layer : graph)
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100151 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100152 CHECK(layer->GetBackendId() == armnn::Compute::CpuRef);
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100153 }
154}
155
Sadik Armagan1625efc2021-06-10 18:24:34 +0100156TEST_CASE("DebugTestOnCpuRef")
keidav01738c2e62018-12-11 16:14:20 +0000157{
Kevin Mayd92a6e42021-02-04 10:27:41 +0000158 // build up the structure of the network
159 armnn::INetworkPtr net(armnn::INetwork::Create());
keidav01738c2e62018-12-11 16:14:20 +0000160
161 armnn::ActivationDescriptor activation1Descriptor;
162 activation1Descriptor.m_Function = armnn::ActivationFunction::BoundedReLu;
163 activation1Descriptor.m_A = 1.f;
164 activation1Descriptor.m_B = -1.f;
165
166 // Defines layers.
Kevin Mayd92a6e42021-02-04 10:27:41 +0000167 auto input = net->AddInputLayer(0, "InputLayer");
168 auto activation = net->AddActivationLayer(activation1Descriptor, "ActivationLayer");
169 auto output = net->AddOutputLayer(0, "OutputLayer");
keidav01738c2e62018-12-11 16:14:20 +0000170
171 // Connects layers.
172 input->GetOutputSlot(0).Connect(activation->GetInputSlot(0));
173 activation->GetOutputSlot(0).Connect(output->GetInputSlot(0));
174
175 armnn::TensorShape shape({4});
176 armnn::TensorInfo info(shape, armnn::DataType::Float32);
177 input->GetOutputSlot(0).SetTensorInfo(info);
178 activation->GetOutputSlot(0).SetTensorInfo(info);
179
180 armnn::IRuntime::CreationOptions options;
181 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
182
183 std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
184
185 armnn::OptimizerOptions optimizerOptions;
186 optimizerOptions.m_Debug = true;
187
Kevin Mayd92a6e42021-02-04 10:27:41 +0000188 armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec(),
keidav01738c2e62018-12-11 16:14:20 +0000189 optimizerOptions);
190
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000191 armnn::Graph& graph = GetGraphForTesting(optimizedNet.get());
192 graph.AllocateDynamicBuffers();
193
keidav01738c2e62018-12-11 16:14:20 +0000194 // Tests that all layers are present in the graph.
Sadik Armagan1625efc2021-06-10 18:24:34 +0100195 CHECK(graph.GetNumLayers() == 5);
keidav01738c2e62018-12-11 16:14:20 +0000196
197 // Tests that the vertices exist and have correct names.
Sadik Armagan1625efc2021-06-10 18:24:34 +0100198 CHECK(GraphHasNamedLayer(graph, "InputLayer"));
199 CHECK(GraphHasNamedLayer(graph, "DebugLayerAfterInputLayer_0"));
200 CHECK(GraphHasNamedLayer(graph, "ActivationLayer"));
201 CHECK(GraphHasNamedLayer(graph, "DebugLayerAfterActivationLayer_0"));
202 CHECK(GraphHasNamedLayer(graph, "OutputLayer"));
keidav01738c2e62018-12-11 16:14:20 +0000203}
204
Sadik Armagan1625efc2021-06-10 18:24:34 +0100205}