blob: d9ed18bdd5cafb6e251cda4be6a8a7b2246e0f12 [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"
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010024
telsoa014fcda012018-03-09 14:13:49 +000025namespace armnn
26{
27
28void RuntimeLoadedNetworksReserve(armnn::Runtime* runtime)
29{
30 runtime->m_LoadedNetworks.reserve(1);
31}
32
33}
34
35BOOST_AUTO_TEST_SUITE(Runtime)
36
37BOOST_AUTO_TEST_CASE(RuntimeUnloadNetwork)
38{
39 // build 2 mock-networks and load them into the runtime
telsoa01c577f2c2018-08-31 09:22:23 +010040 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +000041 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa014fcda012018-03-09 14:13:49 +000042
telsoa01c577f2c2018-08-31 09:22:23 +010043 // Mock network 1.
Keith Davis97da5e22020-03-05 16:25:28 +000044 armnn::NetworkId networkIdentifier1 = 1;
telsoa014fcda012018-03-09 14:13:49 +000045 armnn::INetworkPtr mockNetwork1(armnn::INetwork::Create());
46 mockNetwork1->AddInputLayer(0, "test layer");
Keith Davis97da5e22020-03-05 16:25:28 +000047 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +010048 runtime->LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000049
telsoa01c577f2c2018-08-31 09:22:23 +010050 // Mock network 2.
Keith Davis97da5e22020-03-05 16:25:28 +000051 armnn::NetworkId networkIdentifier2 = 2;
telsoa014fcda012018-03-09 14:13:49 +000052 armnn::INetworkPtr mockNetwork2(armnn::INetwork::Create());
53 mockNetwork2->AddInputLayer(0, "test layer");
telsoa01c577f2c2018-08-31 09:22:23 +010054 runtime->LoadNetwork(networkIdentifier2, Optimize(*mockNetwork2, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000055
telsoa01c577f2c2018-08-31 09:22:23 +010056 // Unloads one by its networkID.
telsoa014fcda012018-03-09 14:13:49 +000057 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Success);
58
59 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Failure);
60}
61
surmeh013537c2c2018-05-18 16:31:43 +010062// Note: the current builds we don't do valgrind and gperftools based leak checking at the same
telsoa01c577f2c2018-08-31 09:22:23 +010063// time, so in practice WITH_VALGRIND and ARMNN_LEAK_CHECKING_ENABLED are exclusive. The
64// valgrind tests can stay for x86 builds, but on hikey Valgrind is just way too slow
65// to be integrated into the CI system.
surmeh013537c2c2018-05-18 16:31:43 +010066
telsoa01c577f2c2018-08-31 09:22:23 +010067#ifdef ARMNN_LEAK_CHECKING_ENABLED
68
69struct DisableGlobalLeakChecking
70{
71 DisableGlobalLeakChecking()
72 {
73 ARMNN_LOCAL_LEAK_CHECKING_ONLY();
74 }
75};
76
77BOOST_GLOBAL_FIXTURE(DisableGlobalLeakChecking);
78
surmeh013537c2c2018-05-18 16:31:43 +010079BOOST_AUTO_TEST_CASE(RuntimeHeapMemoryUsageSanityChecks)
80{
81 BOOST_TEST(ARMNN_LEAK_CHECKER_IS_ACTIVE());
82 {
83 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Outer");
84 {
85 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Inner");
telsoa01c577f2c2018-08-31 09:22:23 +010086 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE() == true);
surmeh013537c2c2018-05-18 16:31:43 +010087 std::unique_ptr<char[]> dummyAllocation(new char[1000]);
telsoa01c577f2c2018-08-31 09:22:23 +010088 BOOST_CHECK_MESSAGE(ARMNN_NO_LEAKS_IN_SCOPE() == false,
89 "A leak of 1000 bytes is expected here. "
90 "Please make sure environment variable: HEAPCHECK=draconian is set!");
91 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 1000);
92 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 1);
surmeh013537c2c2018-05-18 16:31:43 +010093 }
94 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE());
95 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 0);
96 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 0);
97 }
98}
99
surmeh013537c2c2018-05-18 16:31:43 +0100100#endif // ARMNN_LEAK_CHECKING_ENABLED
101
102// 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 +0000103#ifdef WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100104// Run with the following command to get all the amazing output (in the devenv/build folder) :)
telsoa014fcda012018-03-09 14:13:49 +0000105// valgrind --leak-check=full --show-leak-kinds=all --log-file=Valgrind_Memcheck_Leak_Report.txt armnn/test/UnitTests
106BOOST_AUTO_TEST_CASE(RuntimeMemoryLeak)
107{
108 // From documentation:
109
110 // This means that no pointer to the block can be found. The block is classified as "lost",
111 // because the programmer could not possibly have freed it at program exit, since no pointer to it exists.
112 unsigned long leakedBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000113 unsigned long leakedAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000114
115 // A start-pointer or chain of start-pointers to the block is found. Since the block is still pointed at,
116 // the programmer could, at least in principle, have freed it before program exit.
telsoa01c577f2c2018-08-31 09:22:23 +0100117 // We want to test this in case memory is not freed as early as it could have been.
telsoa014fcda012018-03-09 14:13:49 +0000118 unsigned long reachableBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000119 unsigned long reachableAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000120
telsoa01c577f2c2018-08-31 09:22:23 +0100121 // Needed as out params but we don't test them.
Keith Davis97da5e22020-03-05 16:25:28 +0000122 unsigned long dubious = 0;
telsoa014fcda012018-03-09 14:13:49 +0000123 unsigned long suppressed = 0;
124
125 armnn::NetworkId networkIdentifier1 = 1;
126
127 // ensure that runtime is large enough before checking for memory leaks
128 // otherwise when loading the network it will automatically reserve memory that won't be released until destruction
telsoa01c577f2c2018-08-31 09:22:23 +0100129 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000130 armnn::Runtime runtime(options);
telsoa014fcda012018-03-09 14:13:49 +0000131 armnn::RuntimeLoadedNetworksReserve(&runtime);
132
telsoa014fcda012018-03-09 14:13:49 +0000133 {
Keith Davis97da5e22020-03-05 16:25:28 +0000134 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa014fcda012018-03-09 14:13:49 +0000135
136 std::unique_ptr<armnn::Network> mockNetwork1 = std::make_unique<armnn::Network>();
137 mockNetwork1->AddInputLayer(0, "test layer");
138
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000139 // Warm-up load/unload pair to put the runtime in a stable state (memory-wise).
telsoa01c577f2c2018-08-31 09:22:23 +0100140 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000141 runtime.UnloadNetwork(networkIdentifier1);
142
143 // Checks for leaks before we load the network and record them so that we can see the delta after unloading.
144 VALGRIND_DO_QUICK_LEAK_CHECK;
145 VALGRIND_COUNT_LEAKS(leakedBefore, dubious, reachableBefore, suppressed);
146
147 // The actual test.
148 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
149 runtime.UnloadNetwork(networkIdentifier1);
150
151 VALGRIND_DO_ADDED_LEAK_CHECK;
152 VALGRIND_COUNT_LEAKS(leakedAfter, dubious, reachableAfter, suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000153 }
154
telsoa01c577f2c2018-08-31 09:22:23 +0100155 // 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 +0000156 BOOST_TEST(leakedBefore == leakedAfter);
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100157 BOOST_TEST(reachableBefore == reachableAfter);
telsoa014fcda012018-03-09 14:13:49 +0000158
telsoa01c577f2c2018-08-31 09:22:23 +0100159 // These are needed because VALGRIND_COUNT_LEAKS is a macro that assigns to the parameters
160 // so they are assigned to, but still considered unused, causing a warning.
telsoa014fcda012018-03-09 14:13:49 +0000161 boost::ignore_unused(dubious);
162 boost::ignore_unused(suppressed);
163}
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100164#endif // WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100165
166BOOST_AUTO_TEST_CASE(RuntimeCpuRef)
167{
168 using namespace armnn;
169
170 // Create runtime in which test will run
171 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000172 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100173
174 // build up the structure of the network
175 INetworkPtr net(INetwork::Create());
176
177 IConnectableLayer* input = net->AddInputLayer(0);
178
179 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
180 NormalizationDescriptor descriptor;
181 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
182
183 IConnectableLayer* output = net->AddOutputLayer(0);
184
185 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
186 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
187
188 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
189 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
190
191 // optimize the network
David Beckf0b48452018-10-19 15:20:56 +0100192 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Keith Davis97da5e22020-03-05 16:25:28 +0000193 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100194
195 // Load it into the runtime. It should success.
196 armnn::NetworkId netId;
197 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
198}
199
200BOOST_AUTO_TEST_CASE(RuntimeFallbackToCpuRef)
201{
202 using namespace armnn;
203
204 // Create runtime in which test will run
205 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000206 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100207
208 // build up the structure of the network
209 INetworkPtr net(INetwork::Create());
210
211 IConnectableLayer* input = net->AddInputLayer(0);
212
213 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
214 NormalizationDescriptor descriptor;
215 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
216
217 IConnectableLayer* output = net->AddOutputLayer(0);
218
219 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
220 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
221
222 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
223 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
224
225 // Allow fallback to CpuRef.
David Beckf0b48452018-10-19 15:20:56 +0100226 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc, armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +0100227 // optimize the network
Keith Davis97da5e22020-03-05 16:25:28 +0000228 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100229
230 // Load it into the runtime. It should succeed.
231 armnn::NetworkId netId;
232 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
233}
234
jimfly016b0b53d2018-10-08 14:43:01 +0100235BOOST_AUTO_TEST_CASE(IVGCVSW_1929_QuantizedSoftmaxIssue)
236{
237 // Test for issue reported by Chris Nix in https://jira.arm.com/browse/IVGCVSW-1929
238 using namespace armnn;
239
240 // Create runtime in which test will run
241 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000242 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
jimfly016b0b53d2018-10-08 14:43:01 +0100243
244 // build up the structure of the network
245 INetworkPtr net(INetwork::Create());
Keith Davis97da5e22020-03-05 16:25:28 +0000246 armnn::IConnectableLayer* input = net->AddInputLayer(0,"input");
247 armnn::IConnectableLayer* softmax = net->AddSoftmaxLayer(armnn::SoftmaxDescriptor(), "softmax");
248 armnn::IConnectableLayer* output = net->AddOutputLayer(0, "output");
jimfly016b0b53d2018-10-08 14:43:01 +0100249
250 input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0));
251 softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0));
252
Keith Davis97da5e22020-03-05 16:25:28 +0000253 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
254 armnn::DataType::QAsymmU8,
255 1.0f / 255,
256 0));
jimfly016b0b53d2018-10-08 14:43:01 +0100257
Keith Davis97da5e22020-03-05 16:25:28 +0000258 softmax->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
259 armnn::DataType::QAsymmU8));
jimfly016b0b53d2018-10-08 14:43:01 +0100260
Keith Davis97da5e22020-03-05 16:25:28 +0000261 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
262 std::vector<std::string> errMessages;
263 armnn::IOptimizedNetworkPtr optNet = Optimize(*net,
264 backends,
265 runtime->GetDeviceSpec(),
266 OptimizerOptions(),
267 errMessages);
David Beckf0b48452018-10-19 15:20:56 +0100268
jimfly016b0b53d2018-10-08 14:43:01 +0100269 BOOST_TEST(errMessages.size() == 1);
270 BOOST_TEST(errMessages[0] ==
271 "ERROR: output 0 of layer Softmax (softmax) is of type "
272 "Quantized 8 bit but its scale parameter has not been set");
273 BOOST_TEST(!optNet);
274}
275
Derek Lamberti836b27b2019-11-20 10:51:57 +0000276BOOST_AUTO_TEST_CASE(RuntimeBackendOptions)
277{
278 using namespace armnn;
279
280 IRuntime::CreationOptions creationOptions;
281 auto& backendOptions = creationOptions.m_BackendOptions;
282
283
284 // Define Options on explicit construction
285 BackendOptions options1("FakeBackend1",
Keith Davis97da5e22020-03-05 16:25:28 +0000286 {
287 { "Option1", 1.3f },
288 { "Option2", true }
289 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000290
291 // Add an option after construction
Keith Davis97da5e22020-03-05 16:25:28 +0000292 options1.AddOption({ "Option3", "some_value" });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000293
294 // Add the options to CreationOptions struct
295 backendOptions.push_back(options1);
296
297 // Add more Options via inplace explicit construction
Keith Davis97da5e22020-03-05 16:25:28 +0000298 backendOptions.emplace_back(BackendOptions{ "FakeBackend1",
299 {{ "Option4", 42 }}
300 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000301
302
303 // First group
304 BOOST_TEST(backendOptions[0].GetBackendId().Get() == "FakeBackend1");
305 BOOST_TEST(backendOptions[0].GetOption(0).GetName() == "Option1");
306 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().IsFloat() == true);
307 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().AsFloat() == 1.3f);
308
309 BOOST_TEST(backendOptions[0].GetOption(1).GetName() == "Option2");
310 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().IsBool() == true);
311 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().AsBool() == true);
312
313 BOOST_TEST(backendOptions[0].GetOption(2).GetName() == "Option3");
314 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().IsString() == true);
315 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().AsString() == "some_value");
316
317 // Second group
318 BOOST_TEST(backendOptions[1].GetBackendId().Get() == "FakeBackend1");
319 BOOST_TEST(backendOptions[1].GetOption(0).GetName() == "Option4");
320 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().IsInt() == true);
321 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().AsInt() == 42);
322}
323
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000324BOOST_AUTO_TEST_CASE(ProfilingDisable)
325{
326 using namespace armnn;
327
328 // Create runtime in which the test will run
329 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000330 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000331
332 // build up the structure of the network
333 INetworkPtr net(INetwork::Create());
334
335 IConnectableLayer* input = net->AddInputLayer(0);
336
337 // This layer configuration isn't supported by CpuAcc, should fall back to CpuRef.
338 NormalizationDescriptor descriptor;
339 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
340
341 IConnectableLayer* output = net->AddOutputLayer(0);
342
343 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
344 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
345
346 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
347 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
348
349 // optimize the network
350 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Keith Davis97da5e22020-03-05 16:25:28 +0000351 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000352
353 // Load it into the runtime. It should succeed.
354 armnn::NetworkId netId;
355 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
356
357 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper;
358 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
359 auto readableBuffer = bufferManager.GetReadableBuffer();
360
361 // Profiling is not enabled, the post-optimisation structure should not be created
362 BOOST_TEST(!readableBuffer);
363}
364
365BOOST_AUTO_TEST_CASE(ProfilingEnableCpuRef)
366{
367 using namespace armnn;
368 using namespace armnn::profiling;
369
370 // Create runtime in which the test will run
371 armnn::IRuntime::CreationOptions options;
372 options.m_ProfilingOptions.m_EnableProfiling = true;
373 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
374
375 // build up the structure of the network
376 INetworkPtr net(INetwork::Create());
377
378 IConnectableLayer* input = net->AddInputLayer(0, "input");
379
380 NormalizationDescriptor descriptor;
381 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
382
383 IConnectableLayer* output = net->AddOutputLayer(0, "output");
384
385 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
386 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
387
388 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
389 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
390
391 // optimize the network
392 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Keith Davis97da5e22020-03-05 16:25:28 +0000393 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000394
395 ProfilingGuid optNetGuid = optNet->GetGuid();
396
397 // Load it into the runtime. It should succeed.
398 armnn::NetworkId netId;
399 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
400
401 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper;
402 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
403 auto readableBuffer = bufferManager.GetReadableBuffer();
404
405 // Profiling is enabled, the post-optimisation structure should be created
406 BOOST_CHECK(readableBuffer != nullptr);
407
408 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000409 BOOST_CHECK(size == 1068);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000410
411 const unsigned char* readableData = readableBuffer->GetReadableData();
412 BOOST_CHECK(readableData != nullptr);
413
414 unsigned int offset = 0;
415
Keith Davis97da5e22020-03-05 16:25:28 +0000416 // Verify Header
417 VerifyTimelineHeaderBinary(readableData, offset, 1060);
418
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000419 // Post-optimisation network
420 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000421 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset
422 );
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000423
424 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000425 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
426 EmptyOptional(),
427 optNetGuid,
428 LabelsAndEventClasses::NETWORK_GUID,
429 readableData,
430 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000431
432 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000433 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
434 EmptyOptional(),
435 EmptyOptional(),
436 LabelsAndEventClasses::TYPE_GUID,
437 readableData,
438 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000439
440 // Input layer
441 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000442 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000443
444 // Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000445 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000446
447 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000448 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
449 EmptyOptional(),
450 input->GetGuid(),
451 EmptyOptional(),
452 readableData,
453 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000454
455 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000456 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
457 EmptyOptional(),
458 EmptyOptional(),
459 LabelsAndEventClasses::NAME_GUID,
460 readableData,
461 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000462
463 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000464 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
465 EmptyOptional(),
466 input->GetGuid(),
467 EmptyOptional(),
468 readableData,
469 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000470
471 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000472 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
473 EmptyOptional(),
474 EmptyOptional(),
475 LabelsAndEventClasses::TYPE_GUID,
476 readableData,
477 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000478
479 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000480 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
481 EmptyOptional(),
482 optNetGuid,
483 input->GetGuid(),
484 readableData,
485 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000486
487 // Normalization layer
488 // Normalization layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000489 VerifyTimelineEntityBinaryPacketData(normalize->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000490
491 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000492 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "normalization", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000493
494 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000495 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
496 EmptyOptional(),
497 normalize->GetGuid(),
498 EmptyOptional(),
499 readableData,
500 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000501
502 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000503 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
504 EmptyOptional(),
505 EmptyOptional(),
506 LabelsAndEventClasses::NAME_GUID,
507 readableData,
508 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000509
510 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000511 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
512 EmptyOptional(),
513 normalize->GetGuid(),
514 EmptyOptional(),
515 readableData,
516 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000517
518 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000519 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
520 EmptyOptional(),
521 EmptyOptional(),
522 LabelsAndEventClasses::TYPE_GUID,
523 readableData,
524 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000525
526 // Network - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000527 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
528 EmptyOptional(),
529 optNetGuid,
530 normalize->GetGuid(),
531 readableData,
532 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000533
534 // Input layer - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000535 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
536 EmptyOptional(),
537 input->GetGuid(),
538 normalize->GetGuid(),
539 readableData,
540 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000541
542 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000543 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
544 EmptyOptional(),
545 EmptyOptional(),
546 LabelsAndEventClasses::CONNECTION_GUID,
547 readableData,
548 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000549
550 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000551 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
552 EmptyOptional(),
553 EmptyOptional(),
554 LabelsAndEventClasses::TYPE_GUID,
555 readableData,
556 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000557
558 // Normalization workload
559 // Normalization workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000560 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000561
562 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000563 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
564 EmptyOptional(),
565 EmptyOptional(),
566 EmptyOptional(),
567 readableData,
568 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000569
570 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000571 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
572 EmptyOptional(),
573 EmptyOptional(),
574 LabelsAndEventClasses::TYPE_GUID,
575 readableData,
576 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000577
578 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000579 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000580
581 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000582 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
583 EmptyOptional(),
584 EmptyOptional(),
585 EmptyOptional(),
586 readableData,
587 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000588
589 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000590 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
591 EmptyOptional(),
592 EmptyOptional(),
593 LabelsAndEventClasses::BACKENDID_GUID,
594 readableData,
595 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000596
597 // Normalize layer - Normalize workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000598 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
599 EmptyOptional(),
600 normalize->GetGuid(),
601 EmptyOptional(),
602 readableData,
603 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000604
605 // Output layer
606 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000607 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000608
609 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000610 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000611
612 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000613 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
614 EmptyOptional(),
615 output->GetGuid(),
616 EmptyOptional(),
617 readableData,
618 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000619
620 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000621 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
622 EmptyOptional(),
623 EmptyOptional(),
624 LabelsAndEventClasses::NAME_GUID,
625 readableData,
626 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000627
628 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000629 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
630 EmptyOptional(),
631 output->GetGuid(),
632 EmptyOptional(),
633 readableData,
634 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000635
636 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000637 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
638 EmptyOptional(),
639 EmptyOptional(),
640 LabelsAndEventClasses::TYPE_GUID,
641 readableData,
642 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000643
644 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000645 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
646 EmptyOptional(),
647 optNetGuid,
648 output->GetGuid(),
649 readableData,
650 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000651
652 // Normalize layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000653 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
654 EmptyOptional(),
655 normalize->GetGuid(),
656 output->GetGuid(),
657 readableData,
658 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000659
660 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000661 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
662 EmptyOptional(),
663 EmptyOptional(),
664 LabelsAndEventClasses::CONNECTION_GUID,
665 readableData,
666 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000667
668 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000669 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
670 EmptyOptional(),
671 EmptyOptional(),
672 LabelsAndEventClasses::TYPE_GUID,
673 readableData,
674 offset);
Derek Lamberti836b27b2019-11-20 10:51:57 +0000675
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000676 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000677
678 // Creates structures for input & output.
679 std::vector<float> inputData(16);
680 std::vector<float> outputData(16);
681
Keith Davis97da5e22020-03-05 16:25:28 +0000682 InputTensors inputTensors
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000683 {
Keith Davis97da5e22020-03-05 16:25:28 +0000684 { 0, ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data()) }
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000685 };
686 OutputTensors outputTensors
687 {
Keith Davis97da5e22020-03-05 16:25:28 +0000688 { 0, Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data()) }
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000689 };
690
691 // Does the inference.
692 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
693
David Monahan6198fe02019-12-02 08:35:43 +0000694 // Get readable buffer for inference timeline
695 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
696 BOOST_CHECK(inferenceReadableBuffer != nullptr);
697
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000698 // Get readable buffer for output workload
699 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
700 BOOST_CHECK(outputReadableBuffer != nullptr);
701
702 // Get readable buffer for input workload
703 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
704 BOOST_CHECK(inputReadableBuffer != nullptr);
705
706 // Validate input workload data
707 size = inputReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000708 BOOST_CHECK(size == 204);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000709
710 readableData = inputReadableBuffer->GetReadableData();
711 BOOST_CHECK(readableData != nullptr);
712
713 offset = 0;
714
Keith Davis97da5e22020-03-05 16:25:28 +0000715 // Verify Header
716 VerifyTimelineHeaderBinary(readableData, offset, 196);
717
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000718 // Input workload
719 // Input workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000720 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000721
722 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000723 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
724 EmptyOptional(),
725 EmptyOptional(),
726 EmptyOptional(),
727 readableData,
728 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000729
730 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000731 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
732 EmptyOptional(),
733 EmptyOptional(),
734 LabelsAndEventClasses::TYPE_GUID,
735 readableData,
736 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000737
738 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000739 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000740
741 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000742 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
743 EmptyOptional(),
744 EmptyOptional(),
745 EmptyOptional(),
746 readableData,
747 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000748
749 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000750 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
751 EmptyOptional(),
752 EmptyOptional(),
753 LabelsAndEventClasses::BACKENDID_GUID,
754 readableData,
755 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000756
757 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000758 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
759 EmptyOptional(),
760 input->GetGuid(),
761 EmptyOptional(),
762 readableData,
763 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000764
765 bufferManager.MarkRead(inputReadableBuffer);
766
767 // Validate output workload data
768 size = outputReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000769 BOOST_CHECK(size == 204);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000770
771 readableData = outputReadableBuffer->GetReadableData();
772 BOOST_CHECK(readableData != nullptr);
773
774 offset = 0;
775
Keith Davis97da5e22020-03-05 16:25:28 +0000776 // Verify Header
777 VerifyTimelineHeaderBinary(readableData, offset, 196);
778
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000779 // Output workload
780 // Output workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000781 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000782
783 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000784 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
785 EmptyOptional(),
786 EmptyOptional(),
787 EmptyOptional(),
788 readableData,
789 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000790
791 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000792 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
793 EmptyOptional(),
794 EmptyOptional(),
795 LabelsAndEventClasses::TYPE_GUID,
796 readableData,
797 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000798
799 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000800 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000801
802 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000803 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
804 EmptyOptional(),
805 EmptyOptional(),
806 EmptyOptional(),
807 readableData,
808 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000809
810 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000811 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
812 EmptyOptional(),
813 EmptyOptional(),
814 LabelsAndEventClasses::BACKENDID_GUID,
815 readableData,
816 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000817
818 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000819 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
820 EmptyOptional(),
821 output->GetGuid(),
822 EmptyOptional(),
823 readableData,
824 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000825
826 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000827
828 // Validate inference data
829 size = inferenceReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000830 BOOST_CHECK(size == 1272);
David Monahan6198fe02019-12-02 08:35:43 +0000831
832 readableData = inferenceReadableBuffer->GetReadableData();
833 BOOST_CHECK(readableData != nullptr);
834
835 offset = 0;
836
Keith Davis97da5e22020-03-05 16:25:28 +0000837 // Verify Header
838 VerifyTimelineHeaderBinary(readableData, offset, 1264);
839
David Monahan6198fe02019-12-02 08:35:43 +0000840 // Inference timeline trace
841 // Inference entity
Keith Davis97da5e22020-03-05 16:25:28 +0000842 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000843
844 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000845 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
846 EmptyOptional(),
847 EmptyOptional(),
848 LabelsAndEventClasses::INFERENCE_GUID,
849 readableData,
850 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000851
852 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000853 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
854 EmptyOptional(),
855 EmptyOptional(),
856 LabelsAndEventClasses::TYPE_GUID,
857 readableData,
858 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000859
860 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000861 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
862 EmptyOptional(),
863 optNetGuid,
864 EmptyOptional(),
865 readableData,
866 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000867
868 // Start Inference life
869 // Event packet - timeline, threadId, eventGuid
870 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
871
872 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000873 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
874 EmptyOptional(),
875 EmptyOptional(),
876 EmptyOptional(),
877 readableData,
878 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000879
880 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000881 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
882 EmptyOptional(),
883 EmptyOptional(),
884 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
885 readableData,
886 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000887
888 // Execution
889 // Input workload execution
890 // Input workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000891 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000892
893 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000894 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
895 EmptyOptional(),
896 EmptyOptional(),
897 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
898 readableData,
899 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000900
901 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000902 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
903 EmptyOptional(),
904 EmptyOptional(),
905 LabelsAndEventClasses::TYPE_GUID,
906 readableData,
907 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000908
909 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000910 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
911 EmptyOptional(),
912 EmptyOptional(),
913 EmptyOptional(),
914 readableData,
915 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000916
917 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000918 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
919 EmptyOptional(),
920 EmptyOptional(),
921 EmptyOptional(),
922 readableData,
923 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000924
925 // Start Input workload execution life
926 // Event packet - timeline, threadId, eventGuid
927 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
928
929 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000930 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
931 EmptyOptional(),
932 EmptyOptional(),
933 EmptyOptional(),
934 readableData,
935 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000936
937 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000938 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
939 EmptyOptional(),
940 EmptyOptional(),
941 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
942 readableData,
943 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000944
945 // End of Input workload execution life
946 // Event packet - timeline, threadId, eventGuid
947 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
948
949 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000950 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
951 EmptyOptional(),
952 EmptyOptional(),
953 EmptyOptional(),
954 readableData,
955 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000956
957 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000958 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
959 EmptyOptional(),
960 EmptyOptional(),
961 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
962 readableData,
963 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000964
965 // Normalize workload execution
966 // Normalize workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000967 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000968
969 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000970 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
971 EmptyOptional(),
972 EmptyOptional(),
973 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
974 readableData,
975 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000976
977 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000978 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
979 EmptyOptional(),
980 EmptyOptional(),
981 LabelsAndEventClasses::TYPE_GUID,
982 readableData,
983 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000984
985 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000986 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
987 EmptyOptional(),
988 EmptyOptional(),
989 EmptyOptional(),
990 readableData,
991 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000992
993 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000994 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
995 EmptyOptional(),
996 EmptyOptional(),
997 EmptyOptional(),
998 readableData,
999 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001000
1001 // Start Normalize workload execution life
1002 // Event packet - timeline, threadId, eventGuid
1003 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1004
1005 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001006 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1007 EmptyOptional(),
1008 EmptyOptional(),
1009 EmptyOptional(),
1010 readableData,
1011 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001012
1013 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001014 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1015 EmptyOptional(),
1016 EmptyOptional(),
1017 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1018 readableData,
1019 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001020
1021 // End of Normalize workload execution life
1022 // Event packet - timeline, threadId, eventGuid
1023 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1024
1025 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001026 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1027 EmptyOptional(),
1028 EmptyOptional(),
1029 EmptyOptional(),
1030 readableData,
1031 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001032
1033 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001034 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1035 EmptyOptional(),
1036 EmptyOptional(),
1037 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1038 readableData,
1039 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001040
1041 // Output workload execution
1042 // Output workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +00001043 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001044
1045 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001046 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1047 EmptyOptional(),
1048 EmptyOptional(),
1049 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1050 readableData,
1051 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001052
1053 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001054 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1055 EmptyOptional(),
1056 EmptyOptional(),
1057 LabelsAndEventClasses::TYPE_GUID,
1058 readableData,
1059 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001060
1061 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001062 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1063 EmptyOptional(),
1064 EmptyOptional(),
1065 EmptyOptional(),
1066 readableData,
1067 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001068
1069 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001070 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1071 EmptyOptional(),
1072 EmptyOptional(),
1073 EmptyOptional(),
1074 readableData,
1075 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001076
1077 // Start Output workload execution life
1078 // Event packet - timeline, threadId, eventGuid
1079 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1080
1081 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001082 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1083 EmptyOptional(),
1084 EmptyOptional(),
1085 EmptyOptional(),
1086 readableData,
1087 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001088
1089 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001090 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1091 EmptyOptional(),
1092 EmptyOptional(),
1093 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1094 readableData,
1095 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001096
1097 // End of Normalize workload execution life
1098 // Event packet - timeline, threadId, eventGuid
1099 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1100
1101 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001102 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1103 EmptyOptional(),
1104 EmptyOptional(),
1105 EmptyOptional(),
1106 readableData,
1107 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001108
1109 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001110 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1111 EmptyOptional(),
1112 EmptyOptional(),
1113 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1114 readableData,
1115 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001116
1117 // End of Inference life
1118 // Event packet - timeline, threadId, eventGuid
1119 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1120
1121 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001122 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1123 EmptyOptional(),
1124 EmptyOptional(),
1125 EmptyOptional(),
1126 readableData,
1127 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001128
1129 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001130 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1131 EmptyOptional(),
1132 EmptyOptional(),
1133 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1134 readableData,
1135 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001136
1137 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001138}
1139
1140BOOST_AUTO_TEST_CASE(ProfilingPostOptimisationStructureCpuRef)
1141{
1142 VerifyPostOptimisationStructureTestImpl(armnn::Compute::CpuRef);
1143}
1144
telsoa014fcda012018-03-09 14:13:49 +00001145BOOST_AUTO_TEST_SUITE_END()