blob: 7e9acb7d79f34f7ffaa33154b3f2bd03d0013546 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2017 Arm Ltd and Contributors. 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;
Keith Davis33ed2212020-03-30 10:43:41 +0100374 options.m_ProfilingOptions.m_TimelineEnabled = true;
375
Sadik Armagan3184c902020-03-18 10:57:30 +0000376 armnn::Runtime runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100377 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
378
379 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
380 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
381 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
382 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000383
384 // build up the structure of the network
385 INetworkPtr net(INetwork::Create());
386
387 IConnectableLayer* input = net->AddInputLayer(0, "input");
388
389 NormalizationDescriptor descriptor;
390 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
391
392 IConnectableLayer* output = net->AddOutputLayer(0, "output");
393
394 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
395 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
396
397 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
398 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
399
400 // optimize the network
401 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000402 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000403
404 ProfilingGuid optNetGuid = optNet->GetGuid();
405
406 // Load it into the runtime. It should succeed.
407 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000408 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000409
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000410 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
411 auto readableBuffer = bufferManager.GetReadableBuffer();
412
413 // Profiling is enabled, the post-optimisation structure should be created
414 BOOST_CHECK(readableBuffer != nullptr);
415
416 unsigned int size = readableBuffer->GetSize();
Jim Flynn6398a982020-05-27 17:05:21 +0100417 BOOST_CHECK(size == 772);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000418
419 const unsigned char* readableData = readableBuffer->GetReadableData();
420 BOOST_CHECK(readableData != nullptr);
421
422 unsigned int offset = 0;
423
Keith Davis97da5e22020-03-05 16:25:28 +0000424 // Verify Header
Jim Flynn6398a982020-05-27 17:05:21 +0100425 VerifyTimelineHeaderBinary(readableData, offset, 764);
426 BOOST_TEST_MESSAGE("HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000427
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000428 // Post-optimisation network
429 // Network entity
Jim Flynn6398a982020-05-27 17:05:21 +0100430 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
431 BOOST_TEST_MESSAGE("NETWORK ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000432
433 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000434 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
435 EmptyOptional(),
436 optNetGuid,
437 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000438 LabelsAndEventClasses::TYPE_GUID,
439 readableData,
440 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100441 BOOST_TEST_MESSAGE("NETWORK TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000442
443 // Input layer
444 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000445 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100446 BOOST_TEST_MESSAGE("INPUT ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000447
448 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100449 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
450 BOOST_TEST_MESSAGE("INPUT NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000451
452 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000453 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
454 EmptyOptional(),
455 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100456 inputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000457 LabelsAndEventClasses::NAME_GUID,
458 readableData,
459 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100460 BOOST_TEST_MESSAGE("INPUT NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000461
462 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000463 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
464 EmptyOptional(),
465 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100466 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000467 LabelsAndEventClasses::TYPE_GUID,
468 readableData,
469 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100470 BOOST_TEST_MESSAGE("INPUT TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000471
472 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000473 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
474 EmptyOptional(),
475 optNetGuid,
476 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100477 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000478 readableData,
479 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100480 BOOST_TEST_MESSAGE("NETWORK - INPUT CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000481
482 // Normalization layer
483 // Normalization layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000484 VerifyTimelineEntityBinaryPacketData(normalize->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100485 BOOST_TEST_MESSAGE("NORMALIZATION LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000486
487 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100488 ProfilingGuid normalizationLayerNameGuid = VerifyTimelineLabelBinaryPacketData(
489 EmptyOptional(), "normalization", readableData, offset);
490 BOOST_TEST_MESSAGE("NORMALIZATION LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000491
492 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000493 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
494 EmptyOptional(),
495 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100496 normalizationLayerNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000497 LabelsAndEventClasses::NAME_GUID,
498 readableData,
499 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100500 BOOST_TEST_MESSAGE("NORMALIZATION LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000501
502 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000503 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
504 EmptyOptional(),
505 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100506 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000507 LabelsAndEventClasses::TYPE_GUID,
508 readableData,
509 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100510 BOOST_TEST_MESSAGE("NORMALIZATION LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000511
512 // Network - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000513 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
514 EmptyOptional(),
515 optNetGuid,
516 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100517 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000518 readableData,
519 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100520 BOOST_TEST_MESSAGE("NETWORK - NORMALIZATION LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000521
522 // Input layer - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000523 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
524 EmptyOptional(),
525 input->GetGuid(),
526 normalize->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000527 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000528 readableData,
529 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100530 BOOST_TEST_MESSAGE("INPUT - NORMALIZATION LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000531
532 // Normalization workload
533 // Normalization workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100534 ProfilingGuid normalizationWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
535 EmptyOptional(), readableData, offset);
536 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000537
538 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000539 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
540 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100541 normalizationWorkloadGuid,
542 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000543 LabelsAndEventClasses::TYPE_GUID,
544 readableData,
545 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100546 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000547
548 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100549 ProfilingGuid cpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
550 EmptyOptional(), "CpuRef", readableData, offset);
551 BOOST_TEST_MESSAGE("CPUREF LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000552
553 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000554 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
555 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100556 normalizationWorkloadGuid,
557 cpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000558 LabelsAndEventClasses::BACKENDID_GUID,
559 readableData,
560 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100561 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000562
563 // Normalize layer - Normalize workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000564 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
565 EmptyOptional(),
566 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100567 normalizationWorkloadGuid,
568 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000569 readableData,
570 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100571 BOOST_TEST_MESSAGE("NORMALIZATION LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000572
573 // Output layer
574 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000575 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100576 BOOST_TEST_MESSAGE("OUTPUT LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000577
578 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100579 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
580 EmptyOptional(), "output", readableData, offset);
581 BOOST_TEST_MESSAGE("OUTPUT LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000582
583 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000584 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
585 EmptyOptional(),
586 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100587 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000588 LabelsAndEventClasses::NAME_GUID,
589 readableData,
590 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100591 BOOST_TEST_MESSAGE("OUTPUT LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000592
593 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000594 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
595 EmptyOptional(),
596 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100597 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000598 LabelsAndEventClasses::TYPE_GUID,
599 readableData,
600 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100601 BOOST_TEST_MESSAGE("OUTPUT LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000602
603 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000604 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
605 EmptyOptional(),
606 optNetGuid,
607 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100608 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000609 readableData,
610 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100611 BOOST_TEST_MESSAGE("NETWORK - OUTPUT LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000612
613 // Normalize layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000614 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
615 EmptyOptional(),
616 normalize->GetGuid(),
617 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000618 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000619 readableData,
620 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100621 BOOST_TEST_MESSAGE("NORMALIZE LAYER - OUTPUT LAYER CONNECTION OK");
Derek Lamberti836b27b2019-11-20 10:51:57 +0000622
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000623 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000624
625 // Creates structures for input & output.
626 std::vector<float> inputData(16);
627 std::vector<float> outputData(16);
628
Keith Davis97da5e22020-03-05 16:25:28 +0000629 InputTensors inputTensors
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000630 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000631 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000632 };
633 OutputTensors outputTensors
634 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000635 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000636 };
637
638 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000639 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000640
Finn Williamsb6a402f2020-03-24 13:46:22 +0000641 // Get readable buffer for input workload
642 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
643 BOOST_CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000644
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000645 // Get readable buffer for output workload
646 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
647 BOOST_CHECK(outputReadableBuffer != nullptr);
648
Finn Williamsb6a402f2020-03-24 13:46:22 +0000649 // Get readable buffer for inference timeline
650 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
651 BOOST_CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000652
653 // Validate input workload data
654 size = inputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100655 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000656
657 readableData = inputReadableBuffer->GetReadableData();
658 BOOST_CHECK(readableData != nullptr);
659
660 offset = 0;
661
Keith Davis97da5e22020-03-05 16:25:28 +0000662 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100663 VerifyTimelineHeaderBinary(readableData, offset, 156);
Jim Flynn6398a982020-05-27 17:05:21 +0100664 BOOST_TEST_MESSAGE("INPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000665
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000666 // Input workload
667 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100668 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
669 BOOST_TEST_MESSAGE("INPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000670
671 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000672 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
673 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100674 inputWorkloadGuid,
675 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000676 LabelsAndEventClasses::TYPE_GUID,
677 readableData,
678 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100679 BOOST_TEST_MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000680
681 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100682 ProfilingGuid CpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
683 EmptyOptional(), "CpuRef", readableData, offset);
684 BOOST_TEST_MESSAGE("CPUREF LABEL OK (INPUT WORKLOAD)");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000685
686 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000687 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
688 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100689 inputWorkloadGuid,
690 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000691 LabelsAndEventClasses::BACKENDID_GUID,
692 readableData,
693 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100694 BOOST_TEST_MESSAGE("INPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000695
696 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000697 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
698 EmptyOptional(),
699 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100700 inputWorkloadGuid,
701 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000702 readableData,
703 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100704 BOOST_TEST_MESSAGE("INPUT LAYER - INPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000705
706 bufferManager.MarkRead(inputReadableBuffer);
707
708 // Validate output workload data
709 size = outputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100710 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000711
712 readableData = outputReadableBuffer->GetReadableData();
713 BOOST_CHECK(readableData != nullptr);
714
715 offset = 0;
716
Keith Davis97da5e22020-03-05 16:25:28 +0000717 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100718 VerifyTimelineHeaderBinary(readableData, offset, 156);
Jim Flynn6398a982020-05-27 17:05:21 +0100719 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000720
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000721 // Output workload
722 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100723 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
724 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000725
726 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000727 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
728 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100729 outputWorkloadGuid,
730 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000731 LabelsAndEventClasses::TYPE_GUID,
732 readableData,
733 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100734 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000735
736 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000737 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100738 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD CPU REF LABEL OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000739
740 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000741 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
742 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100743 outputWorkloadGuid,
744 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000745 LabelsAndEventClasses::BACKENDID_GUID,
746 readableData,
747 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100748 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000749
750 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000751 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
752 EmptyOptional(),
753 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100754 outputWorkloadGuid,
755 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000756 readableData,
757 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100758 BOOST_TEST_MESSAGE("OUTPUT LAYER - OUTPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000759
760 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000761
762 // Validate inference data
763 size = inferenceReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100764 BOOST_CHECK(size == 976 + 8 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000765
766 readableData = inferenceReadableBuffer->GetReadableData();
767 BOOST_CHECK(readableData != nullptr);
768
769 offset = 0;
770
Keith Davis97da5e22020-03-05 16:25:28 +0000771 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100772 VerifyTimelineHeaderBinary(readableData, offset, 968 + 8 * ThreadIdSize);
Jim Flynn6398a982020-05-27 17:05:21 +0100773 BOOST_TEST_MESSAGE("INFERENCE HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000774
David Monahan6198fe02019-12-02 08:35:43 +0000775 // Inference timeline trace
776 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100777 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
778 BOOST_TEST_MESSAGE("INFERENCE ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000779
780 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000781 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
782 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100783 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000784 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000785 LabelsAndEventClasses::TYPE_GUID,
786 readableData,
787 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100788 BOOST_TEST_MESSAGE("INFERENCE TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000789
790 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000791 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
792 EmptyOptional(),
793 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100794 inferenceGuid,
795 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000796 readableData,
797 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100798 BOOST_TEST_MESSAGE("NETWORK - INFERENCE EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000799
800 // Start Inference life
801 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100802 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
803 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
804 BOOST_TEST_MESSAGE("INFERENCE START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000805
806 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000807 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
808 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100809 inferenceGuid,
810 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000811 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
812 readableData,
813 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100814 BOOST_TEST_MESSAGE("INFERENCE START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000815
816 // Execution
817 // Input workload execution
818 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100819 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
820 EmptyOptional(), readableData, offset);
821 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000822
823 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000824 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
825 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100826 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000827 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000828 LabelsAndEventClasses::TYPE_GUID,
829 readableData,
830 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100831 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000832
833 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000834 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
835 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100836 inferenceGuid,
837 inputWorkloadExecutionGuid,
838 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000839 readableData,
840 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100841 BOOST_TEST_MESSAGE("INFERENCE - INPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000842
843 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000844 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
845 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100846 inputWorkloadGuid,
847 inputWorkloadExecutionGuid,
848 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000849 readableData,
850 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100851 BOOST_TEST_MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000852
853 // Start Input workload execution life
854 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100855 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
856 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000857
858 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000859 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
860 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100861 inputWorkloadExecutionGuid,
862 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000863 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
864 readableData,
865 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100866 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000867
868 // End of Input workload execution life
869 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100870 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
871 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000872
873 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000874 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
875 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100876 inputWorkloadExecutionGuid,
877 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000878 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
879 readableData,
880 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100881 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000882
883 // Normalize workload execution
884 // Normalize workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100885 ProfilingGuid normalizeWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
886 EmptyOptional(), readableData, offset);
887 BOOST_TEST_MESSAGE("NORMALIZE WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000888
889 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000890 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
891 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100892 normalizeWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000893 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000894 LabelsAndEventClasses::TYPE_GUID,
895 readableData,
896 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100897 BOOST_TEST_MESSAGE("NORMALIZE WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000898
899 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000900 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
901 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100902 inferenceGuid,
903 normalizeWorkloadExecutionGuid,
904 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000905 readableData,
906 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100907 BOOST_TEST_MESSAGE("INFERENCE - NORMALIZE WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000908
909 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000910 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
911 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100912 normalizationWorkloadGuid,
913 normalizeWorkloadExecutionGuid,
914 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000915 readableData,
916 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100917 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD - NORMALIZATION WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000918
919 // Start Normalize workload execution life
920 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100921 ProfilingGuid normalizationWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
922 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
923 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000924
925 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000926 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
927 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100928 normalizeWorkloadExecutionGuid,
929 normalizationWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000930 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
931 readableData,
932 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100933 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000934
935 // End of Normalize workload execution life
936 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100937 ProfilingGuid normalizationWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
938 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
939 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000940
941 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000942 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
943 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100944 normalizeWorkloadExecutionGuid,
945 normalizationWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000946 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
947 readableData,
948 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100949 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000950
951 // Output workload execution
952 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100953 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
954 EmptyOptional(), readableData, offset);
955 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000956
957 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000958 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
959 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100960 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000961 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000962 LabelsAndEventClasses::TYPE_GUID,
963 readableData,
964 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100965 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000966
967 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000968 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
969 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100970 inferenceGuid,
971 outputWorkloadExecutionGuid,
972 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000973 readableData,
974 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100975 BOOST_TEST_MESSAGE("INFERENCE - OUTPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000976
977 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000978 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
979 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100980 outputWorkloadGuid,
981 outputWorkloadExecutionGuid,
982 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000983 readableData,
984 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100985 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD - OUTPUT WORKLOAD EXECUTION EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000986
987 // Start Output workload execution life
988 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100989 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
990 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
991 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000992
993 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000994 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
995 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100996 outputWorkloadExecutionGuid,
997 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000998 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
999 readableData,
1000 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001001 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +01001002
David Monahan6198fe02019-12-02 08:35:43 +00001003 // End of Normalize workload execution life
1004 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001005 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1006 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1007 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001008
1009 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001010 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1011 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001012 outputWorkloadExecutionGuid,
1013 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001014 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1015 readableData,
1016 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001017 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001018
1019 // End of Inference life
1020 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001021 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1022 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1023 BOOST_TEST_MESSAGE("INFERENCE END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001024
1025 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001026 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1027 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001028 inferenceGuid,
1029 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001030 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1031 readableData,
1032 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001033 BOOST_TEST_MESSAGE("INFERENCE - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001034
1035 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001036}
1037
1038BOOST_AUTO_TEST_CASE(ProfilingPostOptimisationStructureCpuRef)
1039{
1040 VerifyPostOptimisationStructureTestImpl(armnn::Compute::CpuRef);
1041}
1042
telsoa014fcda012018-03-09 14:13:49 +00001043BOOST_AUTO_TEST_SUITE_END()