blob: eca4bf8b135a4da29f981c6c8f7a4d051815628f [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
telsoa014fcda012018-03-09 14:13:49 +00005
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +01006#include <armnn/Descriptors.hpp>
7#include <armnn/IRuntime.hpp>
8#include <armnn/INetwork.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <Runtime.hpp>
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010010#include <armnn/TypesUtils.hpp>
telsoa014fcda012018-03-09 14:13:49 +000011
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000012#include <LabelsAndEventClasses.hpp>
13#include <test/ProfilingTestUtils.hpp>
14
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <HeapProfiling.hpp>
16#include <LeakChecking.hpp>
telsoa014fcda012018-03-09 14:13:49 +000017
18#ifdef WITH_VALGRIND
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010019#include <valgrind/memcheck.h>
telsoa014fcda012018-03-09 14:13:49 +000020#endif
21
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010022#include <boost/test/unit_test.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000023#include "RuntimeTests.hpp"
Sadik Armaganea41b572020-03-19 18:16:46 +000024#include "TestUtils.hpp"
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010025
telsoa014fcda012018-03-09 14:13:49 +000026namespace armnn
27{
28
29void RuntimeLoadedNetworksReserve(armnn::Runtime* runtime)
30{
31 runtime->m_LoadedNetworks.reserve(1);
32}
33
34}
35
36BOOST_AUTO_TEST_SUITE(Runtime)
37
38BOOST_AUTO_TEST_CASE(RuntimeUnloadNetwork)
39{
40 // build 2 mock-networks and load them into the runtime
telsoa01c577f2c2018-08-31 09:22:23 +010041 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +000042 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa014fcda012018-03-09 14:13:49 +000043
telsoa01c577f2c2018-08-31 09:22:23 +010044 // Mock network 1.
Keith Davis97da5e22020-03-05 16:25:28 +000045 armnn::NetworkId networkIdentifier1 = 1;
telsoa014fcda012018-03-09 14:13:49 +000046 armnn::INetworkPtr mockNetwork1(armnn::INetwork::Create());
47 mockNetwork1->AddInputLayer(0, "test layer");
Keith Davis97da5e22020-03-05 16:25:28 +000048 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +010049 runtime->LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000050
telsoa01c577f2c2018-08-31 09:22:23 +010051 // Mock network 2.
Keith Davis97da5e22020-03-05 16:25:28 +000052 armnn::NetworkId networkIdentifier2 = 2;
telsoa014fcda012018-03-09 14:13:49 +000053 armnn::INetworkPtr mockNetwork2(armnn::INetwork::Create());
54 mockNetwork2->AddInputLayer(0, "test layer");
telsoa01c577f2c2018-08-31 09:22:23 +010055 runtime->LoadNetwork(networkIdentifier2, Optimize(*mockNetwork2, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000056
telsoa01c577f2c2018-08-31 09:22:23 +010057 // Unloads one by its networkID.
telsoa014fcda012018-03-09 14:13:49 +000058 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Success);
59
60 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Failure);
61}
62
surmeh013537c2c2018-05-18 16:31:43 +010063// Note: the current builds we don't do valgrind and gperftools based leak checking at the same
telsoa01c577f2c2018-08-31 09:22:23 +010064// time, so in practice WITH_VALGRIND and ARMNN_LEAK_CHECKING_ENABLED are exclusive. The
65// valgrind tests can stay for x86 builds, but on hikey Valgrind is just way too slow
66// to be integrated into the CI system.
surmeh013537c2c2018-05-18 16:31:43 +010067
telsoa01c577f2c2018-08-31 09:22:23 +010068#ifdef ARMNN_LEAK_CHECKING_ENABLED
69
70struct DisableGlobalLeakChecking
71{
72 DisableGlobalLeakChecking()
73 {
74 ARMNN_LOCAL_LEAK_CHECKING_ONLY();
75 }
76};
77
78BOOST_GLOBAL_FIXTURE(DisableGlobalLeakChecking);
79
surmeh013537c2c2018-05-18 16:31:43 +010080BOOST_AUTO_TEST_CASE(RuntimeHeapMemoryUsageSanityChecks)
81{
82 BOOST_TEST(ARMNN_LEAK_CHECKER_IS_ACTIVE());
83 {
84 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Outer");
85 {
86 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Inner");
telsoa01c577f2c2018-08-31 09:22:23 +010087 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE() == true);
surmeh013537c2c2018-05-18 16:31:43 +010088 std::unique_ptr<char[]> dummyAllocation(new char[1000]);
telsoa01c577f2c2018-08-31 09:22:23 +010089 BOOST_CHECK_MESSAGE(ARMNN_NO_LEAKS_IN_SCOPE() == false,
90 "A leak of 1000 bytes is expected here. "
91 "Please make sure environment variable: HEAPCHECK=draconian is set!");
92 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 1000);
93 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 1);
surmeh013537c2c2018-05-18 16:31:43 +010094 }
95 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE());
96 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 0);
97 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 0);
98 }
99}
100
surmeh013537c2c2018-05-18 16:31:43 +0100101#endif // ARMNN_LEAK_CHECKING_ENABLED
102
103// Note: this part of the code is due to be removed when we fully trust the gperftools based results.
telsoa014fcda012018-03-09 14:13:49 +0000104#ifdef WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100105// Run with the following command to get all the amazing output (in the devenv/build folder) :)
telsoa014fcda012018-03-09 14:13:49 +0000106// valgrind --leak-check=full --show-leak-kinds=all --log-file=Valgrind_Memcheck_Leak_Report.txt armnn/test/UnitTests
107BOOST_AUTO_TEST_CASE(RuntimeMemoryLeak)
108{
109 // From documentation:
110
111 // This means that no pointer to the block can be found. The block is classified as "lost",
112 // because the programmer could not possibly have freed it at program exit, since no pointer to it exists.
113 unsigned long leakedBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000114 unsigned long leakedAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000115
116 // A start-pointer or chain of start-pointers to the block is found. Since the block is still pointed at,
117 // the programmer could, at least in principle, have freed it before program exit.
telsoa01c577f2c2018-08-31 09:22:23 +0100118 // We want to test this in case memory is not freed as early as it could have been.
telsoa014fcda012018-03-09 14:13:49 +0000119 unsigned long reachableBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000120 unsigned long reachableAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000121
telsoa01c577f2c2018-08-31 09:22:23 +0100122 // Needed as out params but we don't test them.
Keith Davis97da5e22020-03-05 16:25:28 +0000123 unsigned long dubious = 0;
telsoa014fcda012018-03-09 14:13:49 +0000124 unsigned long suppressed = 0;
125
126 armnn::NetworkId networkIdentifier1 = 1;
127
128 // ensure that runtime is large enough before checking for memory leaks
129 // otherwise when loading the network it will automatically reserve memory that won't be released until destruction
telsoa01c577f2c2018-08-31 09:22:23 +0100130 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000131 armnn::Runtime runtime(options);
telsoa014fcda012018-03-09 14:13:49 +0000132 armnn::RuntimeLoadedNetworksReserve(&runtime);
133
telsoa014fcda012018-03-09 14:13:49 +0000134 {
Keith Davis97da5e22020-03-05 16:25:28 +0000135 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa014fcda012018-03-09 14:13:49 +0000136
137 std::unique_ptr<armnn::Network> mockNetwork1 = std::make_unique<armnn::Network>();
138 mockNetwork1->AddInputLayer(0, "test layer");
139
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000140 // Warm-up load/unload pair to put the runtime in a stable state (memory-wise).
telsoa01c577f2c2018-08-31 09:22:23 +0100141 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000142 runtime.UnloadNetwork(networkIdentifier1);
143
144 // Checks for leaks before we load the network and record them so that we can see the delta after unloading.
145 VALGRIND_DO_QUICK_LEAK_CHECK;
146 VALGRIND_COUNT_LEAKS(leakedBefore, dubious, reachableBefore, suppressed);
147
148 // The actual test.
149 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
150 runtime.UnloadNetwork(networkIdentifier1);
151
152 VALGRIND_DO_ADDED_LEAK_CHECK;
153 VALGRIND_COUNT_LEAKS(leakedAfter, dubious, reachableAfter, suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000154 }
155
telsoa01c577f2c2018-08-31 09:22:23 +0100156 // If we're not running under Valgrind, these vars will have been initialised to 0, so this will always pass.
Keith Davis97da5e22020-03-05 16:25:28 +0000157 BOOST_TEST(leakedBefore == leakedAfter);
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100158 BOOST_TEST(reachableBefore == reachableAfter);
telsoa014fcda012018-03-09 14:13:49 +0000159
telsoa01c577f2c2018-08-31 09:22:23 +0100160 // These are needed because VALGRIND_COUNT_LEAKS is a macro that assigns to the parameters
161 // so they are assigned to, but still considered unused, causing a warning.
Jan Eilers8eb25602020-03-09 12:13:48 +0000162 IgnoreUnused(dubious);
163 IgnoreUnused(suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000164}
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100165#endif // WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100166
167BOOST_AUTO_TEST_CASE(RuntimeCpuRef)
168{
169 using namespace armnn;
170
171 // Create runtime in which test will run
172 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000173 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100174
175 // build up the structure of the network
176 INetworkPtr net(INetwork::Create());
177
178 IConnectableLayer* input = net->AddInputLayer(0);
179
180 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
181 NormalizationDescriptor descriptor;
182 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
183
184 IConnectableLayer* output = net->AddOutputLayer(0);
185
186 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
187 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
188
189 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
190 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
191
192 // optimize the network
David Beckf0b48452018-10-19 15:20:56 +0100193 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Keith Davis97da5e22020-03-05 16:25:28 +0000194 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100195
196 // Load it into the runtime. It should success.
197 armnn::NetworkId netId;
198 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
199}
200
201BOOST_AUTO_TEST_CASE(RuntimeFallbackToCpuRef)
202{
203 using namespace armnn;
204
205 // Create runtime in which test will run
206 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000207 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100208
209 // build up the structure of the network
210 INetworkPtr net(INetwork::Create());
211
212 IConnectableLayer* input = net->AddInputLayer(0);
213
214 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
215 NormalizationDescriptor descriptor;
216 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
217
218 IConnectableLayer* output = net->AddOutputLayer(0);
219
220 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
221 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
222
223 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
224 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
225
226 // Allow fallback to CpuRef.
David Beckf0b48452018-10-19 15:20:56 +0100227 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc, armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +0100228 // optimize the network
Keith Davis97da5e22020-03-05 16:25:28 +0000229 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100230
231 // Load it into the runtime. It should succeed.
232 armnn::NetworkId netId;
233 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
234}
235
jimfly016b0b53d2018-10-08 14:43:01 +0100236BOOST_AUTO_TEST_CASE(IVGCVSW_1929_QuantizedSoftmaxIssue)
237{
238 // Test for issue reported by Chris Nix in https://jira.arm.com/browse/IVGCVSW-1929
239 using namespace armnn;
240
241 // Create runtime in which test will run
242 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000243 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
jimfly016b0b53d2018-10-08 14:43:01 +0100244
245 // build up the structure of the network
246 INetworkPtr net(INetwork::Create());
Keith Davis97da5e22020-03-05 16:25:28 +0000247 armnn::IConnectableLayer* input = net->AddInputLayer(0,"input");
248 armnn::IConnectableLayer* softmax = net->AddSoftmaxLayer(armnn::SoftmaxDescriptor(), "softmax");
249 armnn::IConnectableLayer* output = net->AddOutputLayer(0, "output");
jimfly016b0b53d2018-10-08 14:43:01 +0100250
251 input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0));
252 softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0));
253
Keith Davis97da5e22020-03-05 16:25:28 +0000254 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
255 armnn::DataType::QAsymmU8,
256 1.0f / 255,
257 0));
jimfly016b0b53d2018-10-08 14:43:01 +0100258
Keith Davis97da5e22020-03-05 16:25:28 +0000259 softmax->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
260 armnn::DataType::QAsymmU8));
jimfly016b0b53d2018-10-08 14:43:01 +0100261
Keith Davis97da5e22020-03-05 16:25:28 +0000262 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
263 std::vector<std::string> errMessages;
264 armnn::IOptimizedNetworkPtr optNet = Optimize(*net,
265 backends,
266 runtime->GetDeviceSpec(),
267 OptimizerOptions(),
268 errMessages);
David Beckf0b48452018-10-19 15:20:56 +0100269
jimfly016b0b53d2018-10-08 14:43:01 +0100270 BOOST_TEST(errMessages.size() == 1);
271 BOOST_TEST(errMessages[0] ==
272 "ERROR: output 0 of layer Softmax (softmax) is of type "
273 "Quantized 8 bit but its scale parameter has not been set");
274 BOOST_TEST(!optNet);
275}
276
Derek Lamberti836b27b2019-11-20 10:51:57 +0000277BOOST_AUTO_TEST_CASE(RuntimeBackendOptions)
278{
279 using namespace armnn;
280
281 IRuntime::CreationOptions creationOptions;
282 auto& backendOptions = creationOptions.m_BackendOptions;
283
284
285 // Define Options on explicit construction
286 BackendOptions options1("FakeBackend1",
Keith Davis97da5e22020-03-05 16:25:28 +0000287 {
288 { "Option1", 1.3f },
289 { "Option2", true }
290 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000291
292 // Add an option after construction
Keith Davis97da5e22020-03-05 16:25:28 +0000293 options1.AddOption({ "Option3", "some_value" });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000294
295 // Add the options to CreationOptions struct
296 backendOptions.push_back(options1);
297
298 // Add more Options via inplace explicit construction
Keith Davis97da5e22020-03-05 16:25:28 +0000299 backendOptions.emplace_back(BackendOptions{ "FakeBackend1",
300 {{ "Option4", 42 }}
301 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000302
303
304 // First group
305 BOOST_TEST(backendOptions[0].GetBackendId().Get() == "FakeBackend1");
306 BOOST_TEST(backendOptions[0].GetOption(0).GetName() == "Option1");
307 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().IsFloat() == true);
308 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().AsFloat() == 1.3f);
309
310 BOOST_TEST(backendOptions[0].GetOption(1).GetName() == "Option2");
311 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().IsBool() == true);
312 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().AsBool() == true);
313
314 BOOST_TEST(backendOptions[0].GetOption(2).GetName() == "Option3");
315 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().IsString() == true);
316 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().AsString() == "some_value");
317
318 // Second group
319 BOOST_TEST(backendOptions[1].GetBackendId().Get() == "FakeBackend1");
320 BOOST_TEST(backendOptions[1].GetOption(0).GetName() == "Option4");
321 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().IsInt() == true);
322 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().AsInt() == 42);
323}
324
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000325BOOST_AUTO_TEST_CASE(ProfilingDisable)
326{
327 using namespace armnn;
328
329 // Create runtime in which the test will run
330 armnn::IRuntime::CreationOptions options;
Sadik Armagan3184c902020-03-18 10:57:30 +0000331 armnn::Runtime runtime(options);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000332
333 // build up the structure of the network
334 INetworkPtr net(INetwork::Create());
335
336 IConnectableLayer* input = net->AddInputLayer(0);
337
338 // This layer configuration isn't supported by CpuAcc, should fall back to CpuRef.
339 NormalizationDescriptor descriptor;
340 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
341
342 IConnectableLayer* output = net->AddOutputLayer(0);
343
344 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
345 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
346
347 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
348 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
349
350 // optimize the network
351 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000352 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000353
354 // Load it into the runtime. It should succeed.
355 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000356 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000357
Sadik Armagan3184c902020-03-18 10:57:30 +0000358 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000359 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
360 auto readableBuffer = bufferManager.GetReadableBuffer();
361
362 // Profiling is not enabled, the post-optimisation structure should not be created
363 BOOST_TEST(!readableBuffer);
364}
365
366BOOST_AUTO_TEST_CASE(ProfilingEnableCpuRef)
367{
368 using namespace armnn;
369 using namespace armnn::profiling;
370
371 // Create runtime in which the test will run
372 armnn::IRuntime::CreationOptions options;
373 options.m_ProfilingOptions.m_EnableProfiling = true;
Sadik Armagan3184c902020-03-18 10:57:30 +0000374 armnn::Runtime runtime(options);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000375
376 // build up the structure of the network
377 INetworkPtr net(INetwork::Create());
378
379 IConnectableLayer* input = net->AddInputLayer(0, "input");
380
381 NormalizationDescriptor descriptor;
382 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
383
384 IConnectableLayer* output = net->AddOutputLayer(0, "output");
385
386 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
387 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
388
389 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
390 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
391
392 // optimize the network
393 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000394 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000395
396 ProfilingGuid optNetGuid = optNet->GetGuid();
397
398 // Load it into the runtime. It should succeed.
399 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000400 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000401
Sadik Armagan3184c902020-03-18 10:57:30 +0000402 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000403 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
404 auto readableBuffer = bufferManager.GetReadableBuffer();
405
406 // Profiling is enabled, the post-optimisation structure should be created
407 BOOST_CHECK(readableBuffer != nullptr);
408
409 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000410 BOOST_CHECK(size == 1068);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000411
412 const unsigned char* readableData = readableBuffer->GetReadableData();
413 BOOST_CHECK(readableData != nullptr);
414
415 unsigned int offset = 0;
416
Keith Davis97da5e22020-03-05 16:25:28 +0000417 // Verify Header
418 VerifyTimelineHeaderBinary(readableData, offset, 1060);
419
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000420 // Post-optimisation network
421 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000422 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset
423 );
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000424
425 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000426 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
427 EmptyOptional(),
428 optNetGuid,
429 LabelsAndEventClasses::NETWORK_GUID,
430 readableData,
431 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000432
433 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000434 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
435 EmptyOptional(),
436 EmptyOptional(),
437 LabelsAndEventClasses::TYPE_GUID,
438 readableData,
439 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000440
441 // Input layer
442 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000443 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000444
445 // Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000446 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000447
448 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000449 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
450 EmptyOptional(),
451 input->GetGuid(),
452 EmptyOptional(),
453 readableData,
454 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000455
456 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000457 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
458 EmptyOptional(),
459 EmptyOptional(),
460 LabelsAndEventClasses::NAME_GUID,
461 readableData,
462 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000463
464 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000465 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
466 EmptyOptional(),
467 input->GetGuid(),
468 EmptyOptional(),
469 readableData,
470 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000471
472 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000473 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
474 EmptyOptional(),
475 EmptyOptional(),
476 LabelsAndEventClasses::TYPE_GUID,
477 readableData,
478 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000479
480 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000481 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
482 EmptyOptional(),
483 optNetGuid,
484 input->GetGuid(),
485 readableData,
486 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000487
488 // Normalization layer
489 // Normalization layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000490 VerifyTimelineEntityBinaryPacketData(normalize->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000491
492 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000493 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "normalization", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000494
495 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000496 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
497 EmptyOptional(),
498 normalize->GetGuid(),
499 EmptyOptional(),
500 readableData,
501 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000502
503 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000504 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
505 EmptyOptional(),
506 EmptyOptional(),
507 LabelsAndEventClasses::NAME_GUID,
508 readableData,
509 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000510
511 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000512 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
513 EmptyOptional(),
514 normalize->GetGuid(),
515 EmptyOptional(),
516 readableData,
517 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000518
519 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000520 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
521 EmptyOptional(),
522 EmptyOptional(),
523 LabelsAndEventClasses::TYPE_GUID,
524 readableData,
525 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000526
527 // Network - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000528 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
529 EmptyOptional(),
530 optNetGuid,
531 normalize->GetGuid(),
532 readableData,
533 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000534
535 // Input layer - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000536 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
537 EmptyOptional(),
538 input->GetGuid(),
539 normalize->GetGuid(),
540 readableData,
541 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000542
543 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000544 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
545 EmptyOptional(),
546 EmptyOptional(),
547 LabelsAndEventClasses::CONNECTION_GUID,
548 readableData,
549 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000550
551 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000552 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
553 EmptyOptional(),
554 EmptyOptional(),
555 LabelsAndEventClasses::TYPE_GUID,
556 readableData,
557 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000558
559 // Normalization workload
560 // Normalization workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000561 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000562
563 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000564 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
565 EmptyOptional(),
566 EmptyOptional(),
567 EmptyOptional(),
568 readableData,
569 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000570
571 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000572 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
573 EmptyOptional(),
574 EmptyOptional(),
575 LabelsAndEventClasses::TYPE_GUID,
576 readableData,
577 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000578
579 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000580 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000581
582 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000583 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
584 EmptyOptional(),
585 EmptyOptional(),
586 EmptyOptional(),
587 readableData,
588 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000589
590 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000591 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
592 EmptyOptional(),
593 EmptyOptional(),
594 LabelsAndEventClasses::BACKENDID_GUID,
595 readableData,
596 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000597
598 // Normalize layer - Normalize workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000599 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
600 EmptyOptional(),
601 normalize->GetGuid(),
602 EmptyOptional(),
603 readableData,
604 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000605
606 // Output layer
607 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000608 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000609
610 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000611 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000612
613 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000614 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
615 EmptyOptional(),
616 output->GetGuid(),
617 EmptyOptional(),
618 readableData,
619 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000620
621 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000622 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
623 EmptyOptional(),
624 EmptyOptional(),
625 LabelsAndEventClasses::NAME_GUID,
626 readableData,
627 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000628
629 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000630 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
631 EmptyOptional(),
632 output->GetGuid(),
633 EmptyOptional(),
634 readableData,
635 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000636
637 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000638 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
639 EmptyOptional(),
640 EmptyOptional(),
641 LabelsAndEventClasses::TYPE_GUID,
642 readableData,
643 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000644
645 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000646 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
647 EmptyOptional(),
648 optNetGuid,
649 output->GetGuid(),
650 readableData,
651 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000652
653 // Normalize layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000654 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
655 EmptyOptional(),
656 normalize->GetGuid(),
657 output->GetGuid(),
658 readableData,
659 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000660
661 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000662 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
663 EmptyOptional(),
664 EmptyOptional(),
665 LabelsAndEventClasses::CONNECTION_GUID,
666 readableData,
667 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000668
669 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000670 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
671 EmptyOptional(),
672 EmptyOptional(),
673 LabelsAndEventClasses::TYPE_GUID,
674 readableData,
675 offset);
Derek Lamberti836b27b2019-11-20 10:51:57 +0000676
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000677 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000678
679 // Creates structures for input & output.
680 std::vector<float> inputData(16);
681 std::vector<float> outputData(16);
682
Keith Davis97da5e22020-03-05 16:25:28 +0000683 InputTensors inputTensors
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000684 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000685 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000686 };
687 OutputTensors outputTensors
688 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000689 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000690 };
691
692 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000693 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000694
Finn Williamsb6a402f2020-03-24 13:46:22 +0000695 // Get readable buffer for input workload
696 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
697 BOOST_CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000698
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000699 // Get readable buffer for output workload
700 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
701 BOOST_CHECK(outputReadableBuffer != nullptr);
702
Finn Williamsb6a402f2020-03-24 13:46:22 +0000703 // Get readable buffer for inference timeline
704 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
705 BOOST_CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000706
707 // Validate input workload data
708 size = inputReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000709 BOOST_CHECK(size == 204);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000710
711 readableData = inputReadableBuffer->GetReadableData();
712 BOOST_CHECK(readableData != nullptr);
713
714 offset = 0;
715
Keith Davis97da5e22020-03-05 16:25:28 +0000716 // Verify Header
717 VerifyTimelineHeaderBinary(readableData, offset, 196);
718
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000719 // Input workload
720 // Input workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000721 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000722
723 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000724 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
725 EmptyOptional(),
726 EmptyOptional(),
727 EmptyOptional(),
728 readableData,
729 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000730
731 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000732 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
733 EmptyOptional(),
734 EmptyOptional(),
735 LabelsAndEventClasses::TYPE_GUID,
736 readableData,
737 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000738
739 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000740 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000741
742 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000743 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
744 EmptyOptional(),
745 EmptyOptional(),
746 EmptyOptional(),
747 readableData,
748 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000749
750 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000751 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
752 EmptyOptional(),
753 EmptyOptional(),
754 LabelsAndEventClasses::BACKENDID_GUID,
755 readableData,
756 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000757
758 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000759 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
760 EmptyOptional(),
761 input->GetGuid(),
762 EmptyOptional(),
763 readableData,
764 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000765
766 bufferManager.MarkRead(inputReadableBuffer);
767
768 // Validate output workload data
769 size = outputReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000770 BOOST_CHECK(size == 204);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000771
772 readableData = outputReadableBuffer->GetReadableData();
773 BOOST_CHECK(readableData != nullptr);
774
775 offset = 0;
776
Keith Davis97da5e22020-03-05 16:25:28 +0000777 // Verify Header
778 VerifyTimelineHeaderBinary(readableData, offset, 196);
779
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000780 // Output workload
781 // Output workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000782 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000783
784 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000785 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
786 EmptyOptional(),
787 EmptyOptional(),
788 EmptyOptional(),
789 readableData,
790 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000791
792 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000793 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
794 EmptyOptional(),
795 EmptyOptional(),
796 LabelsAndEventClasses::TYPE_GUID,
797 readableData,
798 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000799
800 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000801 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000802
803 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000804 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
805 EmptyOptional(),
806 EmptyOptional(),
807 EmptyOptional(),
808 readableData,
809 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000810
811 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000812 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
813 EmptyOptional(),
814 EmptyOptional(),
815 LabelsAndEventClasses::BACKENDID_GUID,
816 readableData,
817 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000818
819 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000820 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
821 EmptyOptional(),
822 output->GetGuid(),
823 EmptyOptional(),
824 readableData,
825 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000826
827 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000828
829 // Validate inference data
830 size = inferenceReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000831 BOOST_CHECK(size == 1272);
David Monahan6198fe02019-12-02 08:35:43 +0000832
833 readableData = inferenceReadableBuffer->GetReadableData();
834 BOOST_CHECK(readableData != nullptr);
835
836 offset = 0;
837
Keith Davis97da5e22020-03-05 16:25:28 +0000838 // Verify Header
839 VerifyTimelineHeaderBinary(readableData, offset, 1264);
840
David Monahan6198fe02019-12-02 08:35:43 +0000841 // Inference timeline trace
842 // Inference entity
Keith Davis97da5e22020-03-05 16:25:28 +0000843 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000844
845 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000846 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
847 EmptyOptional(),
848 EmptyOptional(),
849 LabelsAndEventClasses::INFERENCE_GUID,
850 readableData,
851 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000852
853 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000854 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
855 EmptyOptional(),
856 EmptyOptional(),
857 LabelsAndEventClasses::TYPE_GUID,
858 readableData,
859 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000860
861 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000862 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
863 EmptyOptional(),
864 optNetGuid,
865 EmptyOptional(),
866 readableData,
867 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000868
869 // Start Inference life
870 // Event packet - timeline, threadId, eventGuid
871 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
872
873 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000874 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
875 EmptyOptional(),
876 EmptyOptional(),
877 EmptyOptional(),
878 readableData,
879 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000880
881 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000882 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
883 EmptyOptional(),
884 EmptyOptional(),
885 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
886 readableData,
887 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000888
889 // Execution
890 // Input workload execution
891 // Input workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000892 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000893
894 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000895 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
896 EmptyOptional(),
897 EmptyOptional(),
898 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
899 readableData,
900 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000901
902 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000903 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
904 EmptyOptional(),
905 EmptyOptional(),
906 LabelsAndEventClasses::TYPE_GUID,
907 readableData,
908 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000909
910 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000911 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
912 EmptyOptional(),
913 EmptyOptional(),
914 EmptyOptional(),
915 readableData,
916 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000917
918 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000919 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
920 EmptyOptional(),
921 EmptyOptional(),
922 EmptyOptional(),
923 readableData,
924 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000925
926 // Start Input workload execution life
927 // Event packet - timeline, threadId, eventGuid
928 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
929
930 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000931 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
932 EmptyOptional(),
933 EmptyOptional(),
934 EmptyOptional(),
935 readableData,
936 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000937
938 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000939 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
940 EmptyOptional(),
941 EmptyOptional(),
942 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
943 readableData,
944 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000945
946 // End of Input workload execution life
947 // Event packet - timeline, threadId, eventGuid
948 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
949
950 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000951 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
952 EmptyOptional(),
953 EmptyOptional(),
954 EmptyOptional(),
955 readableData,
956 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000957
958 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000959 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
960 EmptyOptional(),
961 EmptyOptional(),
962 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
963 readableData,
964 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000965
966 // Normalize workload execution
967 // Normalize workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000968 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000969
970 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000971 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
972 EmptyOptional(),
973 EmptyOptional(),
974 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
975 readableData,
976 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000977
978 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000979 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
980 EmptyOptional(),
981 EmptyOptional(),
982 LabelsAndEventClasses::TYPE_GUID,
983 readableData,
984 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000985
986 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000987 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
988 EmptyOptional(),
989 EmptyOptional(),
990 EmptyOptional(),
991 readableData,
992 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000993
994 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000995 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
996 EmptyOptional(),
997 EmptyOptional(),
998 EmptyOptional(),
999 readableData,
1000 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001001
1002 // Start Normalize workload execution life
1003 // Event packet - timeline, threadId, eventGuid
1004 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1005
1006 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001007 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1008 EmptyOptional(),
1009 EmptyOptional(),
1010 EmptyOptional(),
1011 readableData,
1012 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001013
1014 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001015 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1016 EmptyOptional(),
1017 EmptyOptional(),
1018 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1019 readableData,
1020 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001021
1022 // End of Normalize workload execution life
1023 // Event packet - timeline, threadId, eventGuid
1024 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1025
1026 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001027 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1028 EmptyOptional(),
1029 EmptyOptional(),
1030 EmptyOptional(),
1031 readableData,
1032 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001033
1034 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001035 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1036 EmptyOptional(),
1037 EmptyOptional(),
1038 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1039 readableData,
1040 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001041
1042 // Output workload execution
1043 // Output workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +00001044 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001045
1046 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001047 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1048 EmptyOptional(),
1049 EmptyOptional(),
1050 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1051 readableData,
1052 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001053
1054 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001055 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1056 EmptyOptional(),
1057 EmptyOptional(),
1058 LabelsAndEventClasses::TYPE_GUID,
1059 readableData,
1060 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001061
1062 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001063 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1064 EmptyOptional(),
1065 EmptyOptional(),
1066 EmptyOptional(),
1067 readableData,
1068 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001069
1070 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001071 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1072 EmptyOptional(),
1073 EmptyOptional(),
1074 EmptyOptional(),
1075 readableData,
1076 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001077
1078 // Start Output workload execution life
1079 // Event packet - timeline, threadId, eventGuid
1080 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1081
1082 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001083 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1084 EmptyOptional(),
1085 EmptyOptional(),
1086 EmptyOptional(),
1087 readableData,
1088 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001089
1090 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001091 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1092 EmptyOptional(),
1093 EmptyOptional(),
1094 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1095 readableData,
1096 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001097
1098 // End of Normalize workload execution life
1099 // Event packet - timeline, threadId, eventGuid
1100 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1101
1102 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001103 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1104 EmptyOptional(),
1105 EmptyOptional(),
1106 EmptyOptional(),
1107 readableData,
1108 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001109
1110 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001111 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1112 EmptyOptional(),
1113 EmptyOptional(),
1114 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1115 readableData,
1116 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001117
1118 // End of Inference life
1119 // Event packet - timeline, threadId, eventGuid
1120 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1121
1122 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001123 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1124 EmptyOptional(),
1125 EmptyOptional(),
1126 EmptyOptional(),
1127 readableData,
1128 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001129
1130 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001131 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1132 EmptyOptional(),
1133 EmptyOptional(),
1134 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1135 readableData,
1136 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001137
1138 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001139}
1140
1141BOOST_AUTO_TEST_CASE(ProfilingPostOptimisationStructureCpuRef)
1142{
1143 VerifyPostOptimisationStructureTestImpl(armnn::Compute::CpuRef);
1144}
1145
telsoa014fcda012018-03-09 14:13:49 +00001146BOOST_AUTO_TEST_SUITE_END()