blob: a41c5f87e97326919eefce3198cf77677818aec9 [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-Tar56055192018-11-12 18:10:43 +00006#include "ClWorkloadFactoryHelper.hpp"
7
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <Network.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +01009
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <test/GraphUtils.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010011
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <cl/ClWorkloadFactory.hpp>
Finn Williams40646322021-02-11 16:16:42 +000013#include <cl/ClBackendContext.hpp>
14
15#include <Filesystem.hpp>
16
Aron Virginas-Tar70104002018-10-24 15:33:28 +010017
18#include <boost/test/unit_test.hpp>
19
20BOOST_AUTO_TEST_SUITE(ClOptimizedNetwork)
21
22BOOST_AUTO_TEST_CASE(OptimizeValidateGpuDeviceSupportLayerNoFallback)
23{
24 // build up the structure of the network
25 armnn::INetworkPtr net(armnn::INetwork::Create());
26
27 armnn::IConnectableLayer* input = net->AddInputLayer(0);
28 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
29
30 input->GetOutputSlot(0).Connect(output->GetInputSlot(0));
31 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
32
33 armnn::IRuntime::CreationOptions options;
34 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
35
36 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
37 armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
38 BOOST_CHECK(optNet);
39 // validate workloads
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000040 armnn::ClWorkloadFactory fact =
41 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000042
43 const armnn::Graph& theGraph = GetGraphForTesting(optNet.get());
44 for (auto&& layer : theGraph)
Aron Virginas-Tar70104002018-10-24 15:33:28 +010045 {
46 BOOST_CHECK(layer->GetBackendId() == armnn::Compute::GpuAcc);
47 BOOST_CHECK_NO_THROW(
Derek Lamberti94a88d22019-12-10 21:12:59 +000048 layer->CreateWorkload(fact));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010049 }
50}
51
52BOOST_AUTO_TEST_CASE(FP16TurboModeTestOnGpuAcc)
53{
54 // Test to check when Fp16 Turbo mode set
55 // it converts the Fp32 network to Fp16 Network
56 // add Fp32ToFp16 conversion layer after the InputLayer
57 // add Fp16ToFp32 conversion layer after the OutputLayer
58 // checks the other layers if they are supported in Fp16
59 // if they are not put the conversion layers before and after
60 // if they are not supported in Fp16 use Fp32 instead
61 // if there are inverse conversion layers remove them with optimization
62 // at the moment FloorLayer is not supported in Fp16 so it rolls back to Fp32
63 // and inverse conversion layers are removed by the optimizer
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000064 armnn::INetworkPtr net(armnn::INetwork::Create());
Aron Virginas-Tar70104002018-10-24 15:33:28 +010065
66 // Defines layers.
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000067 auto input = net->AddInputLayer(0, "input layer");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010068 // ReLu1
69 armnn::ActivationDescriptor activation1Descriptor;
70 activation1Descriptor.m_Function = armnn::ActivationFunction::BoundedReLu;
71 activation1Descriptor.m_A = 1.f;
72 activation1Descriptor.m_B = -1.f;
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000073 auto activation = net->AddActivationLayer(activation1Descriptor, "activation layer");
74 auto output = net->AddOutputLayer(0, "output layer");
Aron Virginas-Tar70104002018-10-24 15:33:28 +010075
76 // Connects layers.
77 input->GetOutputSlot(0).Connect(activation->GetInputSlot(0));
78 activation->GetOutputSlot(0).Connect(output->GetInputSlot(0));
79
80 armnn::TensorShape shape({4});
81 armnn::TensorInfo info(shape, armnn::DataType::Float32);
82 input->GetOutputSlot(0).SetTensorInfo(info);
83 activation->GetOutputSlot(0).SetTensorInfo(info);
84
85 armnn::IRuntime::CreationOptions options;
86 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
87
88 std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
89
90 armnn::OptimizerOptions optimizerOptions;
91 optimizerOptions.m_ReduceFp32ToFp16 = true;
92
93 armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000094 *net, backends, runtime->GetDeviceSpec(), optimizerOptions);
Aron Virginas-Tar70104002018-10-24 15:33:28 +010095
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000096 const armnn::Graph& graph = GetGraphForTesting(optimizedNet.get());
Aron Virginas-Tar70104002018-10-24 15:33:28 +010097
98 // Tests that all layers are present in the graph.
99 BOOST_TEST(graph.GetNumLayers() == 5);
100
101 // Tests that the vertices exist and have correct names.
102 BOOST_TEST(GraphHasNamedLayer(graph, "input layer"));
103 BOOST_TEST(GraphHasNamedLayer(graph, "convert_fp32_to_fp16-0-input layer"));
104 BOOST_TEST(GraphHasNamedLayer(graph, "activation layer"));
105 BOOST_TEST(GraphHasNamedLayer(graph, "convert_fp16_to_fp32-0-output layer"));
106 BOOST_TEST(GraphHasNamedLayer(graph, "output layer"));
107}
108
Sadik Armagan045f6be2020-09-10 13:37:32 +0100109BOOST_AUTO_TEST_CASE(FastMathEnabledTestOnGpuAcc)
110{
111 armnn::INetworkPtr net(armnn::INetwork::Create());
112
113 armnn::IConnectableLayer* input = net->AddInputLayer(0);
114 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
115
116 input->GetOutputSlot(0).Connect(output->GetInputSlot(0));
117 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
118
119 armnn::IRuntime::CreationOptions options;
120 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
121
122 std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
123 armnn::OptimizerOptions optimizerOptions;
124 armnn::BackendOptions modelOptions("GpuAcc", {{"FastMathEnabled", true}});
125 optimizerOptions.m_ModelOptions.push_back(modelOptions);
126
127 armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(
128 *net, backends, runtime->GetDeviceSpec(), optimizerOptions);
129
130 BOOST_CHECK(optimizedNet);
131
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000132 auto modelOptionsOut = GetModelOptionsForTesting(optimizedNet.get());
Sadik Armagan045f6be2020-09-10 13:37:32 +0100133
134 BOOST_TEST(modelOptionsOut.size() == 1);
135 BOOST_TEST(modelOptionsOut[0].GetOption(0).GetName() == "FastMathEnabled");
136 BOOST_TEST(modelOptionsOut[0].GetOption(0).GetValue().AsBool() == true);
137}
138
Finn Williams40646322021-02-11 16:16:42 +0000139BOOST_AUTO_TEST_CASE(CheckMLGOTuningFile)
140{
141 class ClBackendContextTestClass : public armnn::ClBackendContext
142 {
143 public:
144 ClBackendContextTestClass(const armnn::IRuntime::CreationOptions &options) : ClBackendContext(options)
145 {}
146
147 bool call_reload_from_file()
148 {
149 return m_MLGOTuner.reload_from_file(m_MLGOTuningFile);
150 }
151 };
152
153 const std::string validText{
154 "<header>\n"
155 "gemm-version, [1,2,1]\n"
156 "ip-type,gpu\n"
157 "</header>\n"
158 "<heuristics-table>\n"
159 "0, g71 , 8, f32, best-performance, static, gemm-type, [m,n,k,n]\n"
160 "1, g71 , 8, f32, best-performance, static, gemm-config-reshaped-only-rhs, [m,n,k,n]\n"
161 "2, g71 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]\n"
162 "3, g71 , 8, qasymm8, best-performance, static, gemm-type, [m,n,k,n]\n"
163 "4, g71 , 8, qasymm8, best-performance, static, gemm-config-reshaped-only-rhs, [m,n,k,n]\n"
164 "5, g71 , 8, qasymm8, best-performance, static, gemm-config-native, [m,n,k,n]\n"
165 "</heuristics-table>\n"
166 "<heuristic, 0>\n"
167 "b , 0, var, r_mn, >=, num, 2., 1, 2\n"
168 "l , 1, gemm-type, reshaped\n"
169 "l , 2, gemm-type, reshaped-only-rhs\n"
170 "</heuristic>\n"
171 "<heuristic, 1>\n"
172 "l ,0,gemm-config-reshaped-only-rhs, [2, 4,4,4,1,1,0]\n"
173 "</heuristic>\n"
174 "<heuristic, 2>\n"
175 "l ,0,gemm-config-reshaped,[4,2,8,16,16,1,0,1,0]\n"
176 "</heuristic>\n"
177 "<heuristic, 3>\n"
178 "l , 0, gemm-type, native\n"
179 "</heuristic>\n"
180 "<heuristic, 4>\n"
181 "l ,0,gemm-config-reshaped-only-rhs, [2, 4,4,4,1,1,0]\n"
182 "</heuristic>\n"
183 "<heuristic, 5>\n"
184 "l ,0,gemm-config-native,[4,2,8]\n"
185 "</heuristic>\n"};
186
187 const std::string invalidText{"ʕノ•ᴥ•ʔノ ︵ ┻━┻"};
188
189 fs::path validFile = armnnUtils::Filesystem::NamedTempFile("validFile.mlgo");
190 fs::path invalidFile = armnnUtils::Filesystem::NamedTempFile("invalidFile.mlgo");
191
192 try
193 {
194 std::ofstream ofs1{validFile};
195 ofs1 << validText << std::endl;
196 ofs1.close();
197
198 std::ofstream ofs2{invalidFile};
199 ofs2 << invalidText << std::endl;
200 ofs2.close();
201 }
202 catch (std::exception &e)
203 {
204 std::cerr << "Unable to write to file at location [" << validFile.c_str() << "] : " << e.what() << std::endl;
205 BOOST_TEST(false);
206 }
207
208 armnn::IRuntime::CreationOptions creationOptions1;
209 armnn::BackendOptions validOptions
210 {
211 "GpuAcc",
212 {
213 {"MLGOTuningFilePath", validFile.c_str()}
214 }
215 };
216
217 creationOptions1.m_BackendOptions.emplace_back(validOptions);
218 ClBackendContextTestClass clBackendContext1(creationOptions1);
219 BOOST_TEST(clBackendContext1.call_reload_from_file());
220
221 armnn::BackendOptions invalidOptions
222 {
223 "GpuAcc",
224 {
225 {"MLGOTuningFilePath", invalidFile.c_str()}
226 }
227 };
228
229 armnn::IRuntime::CreationOptions creationOptions2;
230 creationOptions2.m_BackendOptions.emplace_back(invalidOptions);
231 ClBackendContextTestClass clBackendContext2(creationOptions2);
232 BOOST_TEST(clBackendContext2.call_reload_from_file() == false);
233
234 armnn::BackendOptions invalidPathOptions
235 {
236 "GpuAcc",
237 {
238 {"MLGOTuningFilePath", "not_a_real_file_path"}
239 }
240 };
241
242 armnn::IRuntime::CreationOptions creationOptions3;
243 creationOptions3.m_BackendOptions.emplace_back(invalidPathOptions);
244 ClBackendContextTestClass clBackendContext3(creationOptions3);
245 BOOST_TEST(clBackendContext3.call_reload_from_file() == false);
246}
247
Matthew Bentham39ef3e52020-01-20 10:09:09 +0000248BOOST_AUTO_TEST_SUITE_END();