blob: b3a8bbd6a69ae1acbf5ec4de2807198f056515f3 [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>
Jim Flynnf7713212020-07-14 09:50:59 +01009#include <Processes.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <Runtime.hpp>
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010011#include <armnn/TypesUtils.hpp>
telsoa014fcda012018-03-09 14:13:49 +000012
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000013#include <LabelsAndEventClasses.hpp>
14#include <test/ProfilingTestUtils.hpp>
15
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016#include <HeapProfiling.hpp>
17#include <LeakChecking.hpp>
telsoa014fcda012018-03-09 14:13:49 +000018
19#ifdef WITH_VALGRIND
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010020#include <valgrind/memcheck.h>
telsoa014fcda012018-03-09 14:13:49 +000021#endif
22
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010023#include <boost/test/unit_test.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000024#include "RuntimeTests.hpp"
Sadik Armaganea41b572020-03-19 18:16:46 +000025#include "TestUtils.hpp"
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010026
telsoa014fcda012018-03-09 14:13:49 +000027namespace armnn
28{
29
30void RuntimeLoadedNetworksReserve(armnn::Runtime* runtime)
31{
32 runtime->m_LoadedNetworks.reserve(1);
33}
34
35}
36
37BOOST_AUTO_TEST_SUITE(Runtime)
38
39BOOST_AUTO_TEST_CASE(RuntimeUnloadNetwork)
40{
41 // build 2 mock-networks and load them into the runtime
telsoa01c577f2c2018-08-31 09:22:23 +010042 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +000043 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa014fcda012018-03-09 14:13:49 +000044
telsoa01c577f2c2018-08-31 09:22:23 +010045 // Mock network 1.
Keith Davis97da5e22020-03-05 16:25:28 +000046 armnn::NetworkId networkIdentifier1 = 1;
telsoa014fcda012018-03-09 14:13:49 +000047 armnn::INetworkPtr mockNetwork1(armnn::INetwork::Create());
48 mockNetwork1->AddInputLayer(0, "test layer");
Keith Davis97da5e22020-03-05 16:25:28 +000049 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +010050 runtime->LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000051
telsoa01c577f2c2018-08-31 09:22:23 +010052 // Mock network 2.
Keith Davis97da5e22020-03-05 16:25:28 +000053 armnn::NetworkId networkIdentifier2 = 2;
telsoa014fcda012018-03-09 14:13:49 +000054 armnn::INetworkPtr mockNetwork2(armnn::INetwork::Create());
55 mockNetwork2->AddInputLayer(0, "test layer");
telsoa01c577f2c2018-08-31 09:22:23 +010056 runtime->LoadNetwork(networkIdentifier2, Optimize(*mockNetwork2, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000057
telsoa01c577f2c2018-08-31 09:22:23 +010058 // Unloads one by its networkID.
telsoa014fcda012018-03-09 14:13:49 +000059 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Success);
60
61 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Failure);
62}
63
surmeh013537c2c2018-05-18 16:31:43 +010064// Note: the current builds we don't do valgrind and gperftools based leak checking at the same
telsoa01c577f2c2018-08-31 09:22:23 +010065// time, so in practice WITH_VALGRIND and ARMNN_LEAK_CHECKING_ENABLED are exclusive. The
66// valgrind tests can stay for x86 builds, but on hikey Valgrind is just way too slow
67// to be integrated into the CI system.
surmeh013537c2c2018-05-18 16:31:43 +010068
telsoa01c577f2c2018-08-31 09:22:23 +010069#ifdef ARMNN_LEAK_CHECKING_ENABLED
70
71struct DisableGlobalLeakChecking
72{
73 DisableGlobalLeakChecking()
74 {
75 ARMNN_LOCAL_LEAK_CHECKING_ONLY();
76 }
77};
78
79BOOST_GLOBAL_FIXTURE(DisableGlobalLeakChecking);
80
surmeh013537c2c2018-05-18 16:31:43 +010081BOOST_AUTO_TEST_CASE(RuntimeHeapMemoryUsageSanityChecks)
82{
83 BOOST_TEST(ARMNN_LEAK_CHECKER_IS_ACTIVE());
84 {
85 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Outer");
86 {
87 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Inner");
telsoa01c577f2c2018-08-31 09:22:23 +010088 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE() == true);
surmeh013537c2c2018-05-18 16:31:43 +010089 std::unique_ptr<char[]> dummyAllocation(new char[1000]);
telsoa01c577f2c2018-08-31 09:22:23 +010090 BOOST_CHECK_MESSAGE(ARMNN_NO_LEAKS_IN_SCOPE() == false,
91 "A leak of 1000 bytes is expected here. "
92 "Please make sure environment variable: HEAPCHECK=draconian is set!");
93 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 1000);
94 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 1);
surmeh013537c2c2018-05-18 16:31:43 +010095 }
96 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE());
97 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 0);
98 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 0);
99 }
100}
101
surmeh013537c2c2018-05-18 16:31:43 +0100102#endif // ARMNN_LEAK_CHECKING_ENABLED
103
104// 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 +0000105#ifdef WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100106// Run with the following command to get all the amazing output (in the devenv/build folder) :)
telsoa014fcda012018-03-09 14:13:49 +0000107// valgrind --leak-check=full --show-leak-kinds=all --log-file=Valgrind_Memcheck_Leak_Report.txt armnn/test/UnitTests
108BOOST_AUTO_TEST_CASE(RuntimeMemoryLeak)
109{
110 // From documentation:
111
112 // This means that no pointer to the block can be found. The block is classified as "lost",
113 // because the programmer could not possibly have freed it at program exit, since no pointer to it exists.
114 unsigned long leakedBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000115 unsigned long leakedAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000116
117 // A start-pointer or chain of start-pointers to the block is found. Since the block is still pointed at,
118 // the programmer could, at least in principle, have freed it before program exit.
telsoa01c577f2c2018-08-31 09:22:23 +0100119 // We want to test this in case memory is not freed as early as it could have been.
telsoa014fcda012018-03-09 14:13:49 +0000120 unsigned long reachableBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000121 unsigned long reachableAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000122
telsoa01c577f2c2018-08-31 09:22:23 +0100123 // Needed as out params but we don't test them.
Keith Davis97da5e22020-03-05 16:25:28 +0000124 unsigned long dubious = 0;
telsoa014fcda012018-03-09 14:13:49 +0000125 unsigned long suppressed = 0;
126
127 armnn::NetworkId networkIdentifier1 = 1;
128
129 // ensure that runtime is large enough before checking for memory leaks
130 // otherwise when loading the network it will automatically reserve memory that won't be released until destruction
telsoa01c577f2c2018-08-31 09:22:23 +0100131 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000132 armnn::Runtime runtime(options);
telsoa014fcda012018-03-09 14:13:49 +0000133 armnn::RuntimeLoadedNetworksReserve(&runtime);
134
telsoa014fcda012018-03-09 14:13:49 +0000135 {
Keith Davis97da5e22020-03-05 16:25:28 +0000136 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa014fcda012018-03-09 14:13:49 +0000137
138 std::unique_ptr<armnn::Network> mockNetwork1 = std::make_unique<armnn::Network>();
139 mockNetwork1->AddInputLayer(0, "test layer");
140
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000141 // Warm-up load/unload pair to put the runtime in a stable state (memory-wise).
telsoa01c577f2c2018-08-31 09:22:23 +0100142 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000143 runtime.UnloadNetwork(networkIdentifier1);
144
145 // Checks for leaks before we load the network and record them so that we can see the delta after unloading.
146 VALGRIND_DO_QUICK_LEAK_CHECK;
147 VALGRIND_COUNT_LEAKS(leakedBefore, dubious, reachableBefore, suppressed);
148
149 // The actual test.
150 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
151 runtime.UnloadNetwork(networkIdentifier1);
152
153 VALGRIND_DO_ADDED_LEAK_CHECK;
154 VALGRIND_COUNT_LEAKS(leakedAfter, dubious, reachableAfter, suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000155 }
156
telsoa01c577f2c2018-08-31 09:22:23 +0100157 // 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 +0000158 BOOST_TEST(leakedBefore == leakedAfter);
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100159 BOOST_TEST(reachableBefore == reachableAfter);
telsoa014fcda012018-03-09 14:13:49 +0000160
telsoa01c577f2c2018-08-31 09:22:23 +0100161 // These are needed because VALGRIND_COUNT_LEAKS is a macro that assigns to the parameters
162 // so they are assigned to, but still considered unused, causing a warning.
Jan Eilers8eb25602020-03-09 12:13:48 +0000163 IgnoreUnused(dubious);
164 IgnoreUnused(suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000165}
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100166#endif // WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100167
168BOOST_AUTO_TEST_CASE(RuntimeCpuRef)
169{
170 using namespace armnn;
171
172 // Create runtime in which test will run
173 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000174 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100175
176 // build up the structure of the network
177 INetworkPtr net(INetwork::Create());
178
179 IConnectableLayer* input = net->AddInputLayer(0);
180
181 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
182 NormalizationDescriptor descriptor;
183 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
184
185 IConnectableLayer* output = net->AddOutputLayer(0);
186
187 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
188 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
189
190 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
191 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
192
193 // optimize the network
David Beckf0b48452018-10-19 15:20:56 +0100194 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Keith Davis97da5e22020-03-05 16:25:28 +0000195 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100196
197 // Load it into the runtime. It should success.
198 armnn::NetworkId netId;
199 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
200}
201
202BOOST_AUTO_TEST_CASE(RuntimeFallbackToCpuRef)
203{
204 using namespace armnn;
205
206 // Create runtime in which test will run
207 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000208 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100209
210 // build up the structure of the network
211 INetworkPtr net(INetwork::Create());
212
213 IConnectableLayer* input = net->AddInputLayer(0);
214
215 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
216 NormalizationDescriptor descriptor;
217 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
218
219 IConnectableLayer* output = net->AddOutputLayer(0);
220
221 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
222 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
223
224 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
225 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
226
227 // Allow fallback to CpuRef.
David Beckf0b48452018-10-19 15:20:56 +0100228 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc, armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +0100229 // optimize the network
Keith Davis97da5e22020-03-05 16:25:28 +0000230 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100231
232 // Load it into the runtime. It should succeed.
233 armnn::NetworkId netId;
234 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
235}
236
jimfly016b0b53d2018-10-08 14:43:01 +0100237BOOST_AUTO_TEST_CASE(IVGCVSW_1929_QuantizedSoftmaxIssue)
238{
239 // Test for issue reported by Chris Nix in https://jira.arm.com/browse/IVGCVSW-1929
240 using namespace armnn;
241
242 // Create runtime in which test will run
243 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000244 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
jimfly016b0b53d2018-10-08 14:43:01 +0100245
246 // build up the structure of the network
247 INetworkPtr net(INetwork::Create());
Keith Davis97da5e22020-03-05 16:25:28 +0000248 armnn::IConnectableLayer* input = net->AddInputLayer(0,"input");
249 armnn::IConnectableLayer* softmax = net->AddSoftmaxLayer(armnn::SoftmaxDescriptor(), "softmax");
250 armnn::IConnectableLayer* output = net->AddOutputLayer(0, "output");
jimfly016b0b53d2018-10-08 14:43:01 +0100251
252 input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0));
253 softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0));
254
Keith Davis97da5e22020-03-05 16:25:28 +0000255 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
256 armnn::DataType::QAsymmU8,
257 1.0f / 255,
258 0));
jimfly016b0b53d2018-10-08 14:43:01 +0100259
Keith Davis97da5e22020-03-05 16:25:28 +0000260 softmax->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
261 armnn::DataType::QAsymmU8));
jimfly016b0b53d2018-10-08 14:43:01 +0100262
Keith Davis97da5e22020-03-05 16:25:28 +0000263 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
264 std::vector<std::string> errMessages;
Mike Kelly3a613cc2020-09-29 20:50:35 +0100265
266 try
267 {
268 armnn::IOptimizedNetworkPtr optNet = Optimize(*net,
Keith Davis97da5e22020-03-05 16:25:28 +0000269 backends,
270 runtime->GetDeviceSpec(),
271 OptimizerOptions(),
272 errMessages);
Mike Kelly3a613cc2020-09-29 20:50:35 +0100273 BOOST_FAIL("An exception should have been thrown");
274 }
275 catch (const InvalidArgumentException& e)
276 {
277 // Different exceptions are thrown on different backends
278 }
279 BOOST_CHECK(errMessages.size() > 0);
jimfly016b0b53d2018-10-08 14:43:01 +0100280}
281
Derek Lamberti836b27b2019-11-20 10:51:57 +0000282BOOST_AUTO_TEST_CASE(RuntimeBackendOptions)
283{
284 using namespace armnn;
285
286 IRuntime::CreationOptions creationOptions;
287 auto& backendOptions = creationOptions.m_BackendOptions;
288
289
290 // Define Options on explicit construction
291 BackendOptions options1("FakeBackend1",
Keith Davis97da5e22020-03-05 16:25:28 +0000292 {
293 { "Option1", 1.3f },
294 { "Option2", true }
295 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000296
297 // Add an option after construction
Keith Davis97da5e22020-03-05 16:25:28 +0000298 options1.AddOption({ "Option3", "some_value" });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000299
300 // Add the options to CreationOptions struct
301 backendOptions.push_back(options1);
302
303 // Add more Options via inplace explicit construction
Keith Davis97da5e22020-03-05 16:25:28 +0000304 backendOptions.emplace_back(BackendOptions{ "FakeBackend1",
305 {{ "Option4", 42 }}
306 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000307
308
309 // First group
310 BOOST_TEST(backendOptions[0].GetBackendId().Get() == "FakeBackend1");
311 BOOST_TEST(backendOptions[0].GetOption(0).GetName() == "Option1");
312 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().IsFloat() == true);
313 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().AsFloat() == 1.3f);
314
315 BOOST_TEST(backendOptions[0].GetOption(1).GetName() == "Option2");
316 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().IsBool() == true);
317 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().AsBool() == true);
318
319 BOOST_TEST(backendOptions[0].GetOption(2).GetName() == "Option3");
320 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().IsString() == true);
321 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().AsString() == "some_value");
322
323 // Second group
324 BOOST_TEST(backendOptions[1].GetBackendId().Get() == "FakeBackend1");
325 BOOST_TEST(backendOptions[1].GetOption(0).GetName() == "Option4");
326 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().IsInt() == true);
327 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().AsInt() == 42);
328}
329
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000330BOOST_AUTO_TEST_CASE(ProfilingDisable)
331{
332 using namespace armnn;
333
334 // Create runtime in which the test will run
335 armnn::IRuntime::CreationOptions options;
Sadik Armagan3184c902020-03-18 10:57:30 +0000336 armnn::Runtime runtime(options);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000337
338 // build up the structure of the network
339 INetworkPtr net(INetwork::Create());
340
341 IConnectableLayer* input = net->AddInputLayer(0);
342
343 // This layer configuration isn't supported by CpuAcc, should fall back to CpuRef.
344 NormalizationDescriptor descriptor;
345 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
346
347 IConnectableLayer* output = net->AddOutputLayer(0);
348
349 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
350 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
351
352 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
353 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
354
355 // optimize the network
356 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000357 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000358
359 // Load it into the runtime. It should succeed.
360 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000361 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000362
Sadik Armagan3184c902020-03-18 10:57:30 +0000363 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000364 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
365 auto readableBuffer = bufferManager.GetReadableBuffer();
366
367 // Profiling is not enabled, the post-optimisation structure should not be created
368 BOOST_TEST(!readableBuffer);
369}
370
371BOOST_AUTO_TEST_CASE(ProfilingEnableCpuRef)
372{
373 using namespace armnn;
374 using namespace armnn::profiling;
375
376 // Create runtime in which the test will run
377 armnn::IRuntime::CreationOptions options;
378 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100379 options.m_ProfilingOptions.m_TimelineEnabled = true;
380
Sadik Armagan3184c902020-03-18 10:57:30 +0000381 armnn::Runtime runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100382 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
383
384 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
385 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
386 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
387 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000388
389 // build up the structure of the network
390 INetworkPtr net(INetwork::Create());
391
392 IConnectableLayer* input = net->AddInputLayer(0, "input");
393
394 NormalizationDescriptor descriptor;
395 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
396
397 IConnectableLayer* output = net->AddOutputLayer(0, "output");
398
399 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
400 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
401
402 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
403 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
404
405 // optimize the network
406 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000407 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000408
409 ProfilingGuid optNetGuid = optNet->GetGuid();
410
411 // Load it into the runtime. It should succeed.
412 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000413 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000414
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000415 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
416 auto readableBuffer = bufferManager.GetReadableBuffer();
417
418 // Profiling is enabled, the post-optimisation structure should be created
419 BOOST_CHECK(readableBuffer != nullptr);
420
421 unsigned int size = readableBuffer->GetSize();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000422
423 const unsigned char* readableData = readableBuffer->GetReadableData();
424 BOOST_CHECK(readableData != nullptr);
425
426 unsigned int offset = 0;
427
Keith Davis97da5e22020-03-05 16:25:28 +0000428 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +0100429 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Jim Flynn6398a982020-05-27 17:05:21 +0100430 BOOST_TEST_MESSAGE("HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000431
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000432 // Post-optimisation network
433 // Network entity
Jim Flynn6398a982020-05-27 17:05:21 +0100434 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
435 BOOST_TEST_MESSAGE("NETWORK ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000436
437 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000438 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
439 EmptyOptional(),
440 optNetGuid,
441 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000442 LabelsAndEventClasses::TYPE_GUID,
443 readableData,
444 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100445 BOOST_TEST_MESSAGE("NETWORK TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000446
Jim Flynnf7713212020-07-14 09:50:59 +0100447 // Network - START OF LIFE
448 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(EmptyOptional(),
449 EmptyOptional(),
450 EmptyOptional(),
451 readableData,
452 offset);
453 BOOST_TEST_MESSAGE("NETWORK START OF LIFE EVENT OK");
454
455 // Network - START OF LIFE event relationship
456 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
457 EmptyOptional(),
458 optNetGuid,
459 networkSolEventGuid,
460 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
461 readableData,
462 offset);
463 BOOST_TEST_MESSAGE("NETWORK START OF LIFE RELATIONSHIP OK");
464
465 // Process ID Label
466 int processID = armnnUtils::Processes::GetCurrentId();
467 std::stringstream ss;
468 ss << processID;
469 std::string processIdLabel = ss.str();
470 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
471 BOOST_TEST_MESSAGE("PROCESS ID LABEL OK");
472
473 // Entity - Process ID relationship
474 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
475 EmptyOptional(),
476 optNetGuid,
477 EmptyOptional(),
478 LabelsAndEventClasses::PROCESS_ID_GUID,
479 readableData,
480 offset);
481 BOOST_TEST_MESSAGE("NETWORK PROCESS ID RELATIONSHIP OK");
482
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000483 // Input layer
484 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000485 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100486 BOOST_TEST_MESSAGE("INPUT ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000487
488 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100489 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
490 BOOST_TEST_MESSAGE("INPUT 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 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100496 inputLabelGuid,
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("INPUT 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 input->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("INPUT TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000511
512 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000513 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
514 EmptyOptional(),
515 optNetGuid,
516 input->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 - INPUT CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000521
522 // Normalization layer
523 // Normalization layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000524 VerifyTimelineEntityBinaryPacketData(normalize->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100525 BOOST_TEST_MESSAGE("NORMALIZATION LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000526
527 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100528 ProfilingGuid normalizationLayerNameGuid = VerifyTimelineLabelBinaryPacketData(
529 EmptyOptional(), "normalization", readableData, offset);
530 BOOST_TEST_MESSAGE("NORMALIZATION LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000531
532 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000533 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
534 EmptyOptional(),
535 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100536 normalizationLayerNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000537 LabelsAndEventClasses::NAME_GUID,
538 readableData,
539 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100540 BOOST_TEST_MESSAGE("NORMALIZATION LAYER NAME RELATIONSHIP OK");
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 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100546 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000547 LabelsAndEventClasses::TYPE_GUID,
548 readableData,
549 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100550 BOOST_TEST_MESSAGE("NORMALIZATION LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000551
552 // Network - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000553 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
554 EmptyOptional(),
555 optNetGuid,
556 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100557 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000558 readableData,
559 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100560 BOOST_TEST_MESSAGE("NETWORK - NORMALIZATION LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000561
562 // Input layer - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000563 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
564 EmptyOptional(),
565 input->GetGuid(),
566 normalize->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000567 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000568 readableData,
569 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100570 BOOST_TEST_MESSAGE("INPUT - NORMALIZATION LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000571
572 // Normalization workload
573 // Normalization workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100574 ProfilingGuid normalizationWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
575 EmptyOptional(), readableData, offset);
576 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000577
578 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000579 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
580 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100581 normalizationWorkloadGuid,
582 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000583 LabelsAndEventClasses::TYPE_GUID,
584 readableData,
585 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100586 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000587
588 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100589 ProfilingGuid cpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
590 EmptyOptional(), "CpuRef", readableData, offset);
591 BOOST_TEST_MESSAGE("CPUREF LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000592
593 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000594 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
595 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100596 normalizationWorkloadGuid,
597 cpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000598 LabelsAndEventClasses::BACKENDID_GUID,
599 readableData,
600 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100601 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000602
603 // Normalize layer - Normalize workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000604 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
605 EmptyOptional(),
606 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100607 normalizationWorkloadGuid,
608 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("NORMALIZATION LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000612
613 // Output layer
614 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000615 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100616 BOOST_TEST_MESSAGE("OUTPUT LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000617
618 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100619 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
620 EmptyOptional(), "output", readableData, offset);
621 BOOST_TEST_MESSAGE("OUTPUT LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000622
623 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000624 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
625 EmptyOptional(),
626 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100627 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000628 LabelsAndEventClasses::NAME_GUID,
629 readableData,
630 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100631 BOOST_TEST_MESSAGE("OUTPUT LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000632
633 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000634 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
635 EmptyOptional(),
636 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100637 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000638 LabelsAndEventClasses::TYPE_GUID,
639 readableData,
640 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100641 BOOST_TEST_MESSAGE("OUTPUT LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000642
643 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000644 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
645 EmptyOptional(),
646 optNetGuid,
647 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100648 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000649 readableData,
650 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100651 BOOST_TEST_MESSAGE("NETWORK - OUTPUT LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000652
653 // Normalize layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000654 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
655 EmptyOptional(),
656 normalize->GetGuid(),
657 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000658 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000659 readableData,
660 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100661 BOOST_TEST_MESSAGE("NORMALIZE LAYER - OUTPUT LAYER CONNECTION OK");
Derek Lamberti836b27b2019-11-20 10:51:57 +0000662
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000663 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000664
665 // Creates structures for input & output.
666 std::vector<float> inputData(16);
667 std::vector<float> outputData(16);
668
Keith Davis97da5e22020-03-05 16:25:28 +0000669 InputTensors inputTensors
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000670 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000671 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000672 };
673 OutputTensors outputTensors
674 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000675 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000676 };
677
678 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000679 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000680
Finn Williamsb6a402f2020-03-24 13:46:22 +0000681 // Get readable buffer for input workload
682 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
683 BOOST_CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000684
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000685 // Get readable buffer for output workload
686 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
687 BOOST_CHECK(outputReadableBuffer != nullptr);
688
Finn Williamsb6a402f2020-03-24 13:46:22 +0000689 // Get readable buffer for inference timeline
690 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
691 BOOST_CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000692
693 // Validate input workload data
694 size = inputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100695 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000696
697 readableData = inputReadableBuffer->GetReadableData();
698 BOOST_CHECK(readableData != nullptr);
699
700 offset = 0;
701
Keith Davis97da5e22020-03-05 16:25:28 +0000702 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100703 VerifyTimelineHeaderBinary(readableData, offset, 156);
Jim Flynn6398a982020-05-27 17:05:21 +0100704 BOOST_TEST_MESSAGE("INPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000705
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000706 // Input workload
707 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100708 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
709 BOOST_TEST_MESSAGE("INPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000710
711 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000712 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
713 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100714 inputWorkloadGuid,
715 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000716 LabelsAndEventClasses::TYPE_GUID,
717 readableData,
718 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100719 BOOST_TEST_MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000720
721 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100722 ProfilingGuid CpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
723 EmptyOptional(), "CpuRef", readableData, offset);
724 BOOST_TEST_MESSAGE("CPUREF LABEL OK (INPUT WORKLOAD)");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000725
726 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000727 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
728 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100729 inputWorkloadGuid,
730 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000731 LabelsAndEventClasses::BACKENDID_GUID,
732 readableData,
733 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100734 BOOST_TEST_MESSAGE("INPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000735
736 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000737 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
738 EmptyOptional(),
739 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100740 inputWorkloadGuid,
741 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000742 readableData,
743 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100744 BOOST_TEST_MESSAGE("INPUT LAYER - INPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000745
746 bufferManager.MarkRead(inputReadableBuffer);
747
748 // Validate output workload data
749 size = outputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100750 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000751
752 readableData = outputReadableBuffer->GetReadableData();
753 BOOST_CHECK(readableData != nullptr);
754
755 offset = 0;
756
Keith Davis97da5e22020-03-05 16:25:28 +0000757 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100758 VerifyTimelineHeaderBinary(readableData, offset, 156);
Jim Flynn6398a982020-05-27 17:05:21 +0100759 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000760
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000761 // Output workload
762 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100763 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
764 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000765
766 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000767 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
768 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100769 outputWorkloadGuid,
770 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000771 LabelsAndEventClasses::TYPE_GUID,
772 readableData,
773 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100774 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000775
776 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000777 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100778 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD CPU REF LABEL OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000779
780 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000781 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
782 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100783 outputWorkloadGuid,
784 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000785 LabelsAndEventClasses::BACKENDID_GUID,
786 readableData,
787 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100788 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000789
790 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000791 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
792 EmptyOptional(),
793 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100794 outputWorkloadGuid,
795 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000796 readableData,
797 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100798 BOOST_TEST_MESSAGE("OUTPUT LAYER - OUTPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000799
800 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000801
802 // Validate inference data
803 size = inferenceReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100804 BOOST_CHECK(size == 976 + 8 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000805
806 readableData = inferenceReadableBuffer->GetReadableData();
807 BOOST_CHECK(readableData != nullptr);
808
809 offset = 0;
810
Keith Davis97da5e22020-03-05 16:25:28 +0000811 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100812 VerifyTimelineHeaderBinary(readableData, offset, 968 + 8 * ThreadIdSize);
Jim Flynn6398a982020-05-27 17:05:21 +0100813 BOOST_TEST_MESSAGE("INFERENCE HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000814
David Monahan6198fe02019-12-02 08:35:43 +0000815 // Inference timeline trace
816 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100817 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
818 BOOST_TEST_MESSAGE("INFERENCE ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000819
820 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000821 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
822 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100823 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000824 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000825 LabelsAndEventClasses::TYPE_GUID,
826 readableData,
827 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100828 BOOST_TEST_MESSAGE("INFERENCE TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000829
830 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000831 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
832 EmptyOptional(),
833 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100834 inferenceGuid,
835 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000836 readableData,
837 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100838 BOOST_TEST_MESSAGE("NETWORK - INFERENCE EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000839
840 // Start Inference life
841 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100842 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
843 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
844 BOOST_TEST_MESSAGE("INFERENCE START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000845
846 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000847 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
848 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100849 inferenceGuid,
850 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000851 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
852 readableData,
853 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100854 BOOST_TEST_MESSAGE("INFERENCE START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000855
856 // Execution
857 // Input workload execution
858 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100859 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
860 EmptyOptional(), readableData, offset);
861 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000862
863 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000864 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
865 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100866 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000867 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000868 LabelsAndEventClasses::TYPE_GUID,
869 readableData,
870 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100871 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000872
873 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000874 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
875 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100876 inferenceGuid,
877 inputWorkloadExecutionGuid,
878 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000879 readableData,
880 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100881 BOOST_TEST_MESSAGE("INFERENCE - INPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000882
883 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000884 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
885 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100886 inputWorkloadGuid,
887 inputWorkloadExecutionGuid,
888 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000889 readableData,
890 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100891 BOOST_TEST_MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000892
893 // Start Input workload execution life
894 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100895 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
896 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000897
898 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000899 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
900 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100901 inputWorkloadExecutionGuid,
902 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000903 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
904 readableData,
905 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100906 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000907
908 // End of Input workload execution life
909 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100910 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
911 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000912
913 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000914 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
915 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100916 inputWorkloadExecutionGuid,
917 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000918 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
919 readableData,
920 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100921 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000922
923 // Normalize workload execution
924 // Normalize workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100925 ProfilingGuid normalizeWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
926 EmptyOptional(), readableData, offset);
927 BOOST_TEST_MESSAGE("NORMALIZE WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000928
929 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000930 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
931 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100932 normalizeWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000933 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000934 LabelsAndEventClasses::TYPE_GUID,
935 readableData,
936 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100937 BOOST_TEST_MESSAGE("NORMALIZE WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000938
939 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000940 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
941 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100942 inferenceGuid,
943 normalizeWorkloadExecutionGuid,
944 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000945 readableData,
946 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100947 BOOST_TEST_MESSAGE("INFERENCE - NORMALIZE WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000948
949 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000950 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
951 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100952 normalizationWorkloadGuid,
953 normalizeWorkloadExecutionGuid,
954 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000955 readableData,
956 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100957 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD - NORMALIZATION WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000958
959 // Start Normalize workload execution life
960 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100961 ProfilingGuid normalizationWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
962 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
963 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000964
965 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000966 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
967 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100968 normalizeWorkloadExecutionGuid,
969 normalizationWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000970 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
971 readableData,
972 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100973 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000974
975 // End of Normalize workload execution life
976 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100977 ProfilingGuid normalizationWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
978 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
979 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000980
981 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000982 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
983 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100984 normalizeWorkloadExecutionGuid,
985 normalizationWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000986 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
987 readableData,
988 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100989 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000990
991 // Output workload execution
992 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100993 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
994 EmptyOptional(), readableData, offset);
995 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000996
997 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000998 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
999 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001000 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001001 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001002 LabelsAndEventClasses::TYPE_GUID,
1003 readableData,
1004 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001005 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001006
1007 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001008 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1009 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001010 inferenceGuid,
1011 outputWorkloadExecutionGuid,
1012 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001013 readableData,
1014 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001015 BOOST_TEST_MESSAGE("INFERENCE - OUTPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001016
1017 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001018 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1019 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001020 outputWorkloadGuid,
1021 outputWorkloadExecutionGuid,
1022 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001023 readableData,
1024 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001025 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD - OUTPUT WORKLOAD EXECUTION EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001026
1027 // Start Output workload execution life
1028 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001029 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1030 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1031 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001032
1033 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001034 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1035 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001036 outputWorkloadExecutionGuid,
1037 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001038 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1039 readableData,
1040 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001041 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +01001042
David Monahan6198fe02019-12-02 08:35:43 +00001043 // End of Normalize workload execution life
1044 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001045 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1046 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1047 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001048
1049 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001050 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1051 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001052 outputWorkloadExecutionGuid,
1053 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001054 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1055 readableData,
1056 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001057 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001058
1059 // End of Inference life
1060 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001061 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1062 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1063 BOOST_TEST_MESSAGE("INFERENCE END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001064
1065 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001066 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1067 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001068 inferenceGuid,
1069 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001070 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1071 readableData,
1072 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001073 BOOST_TEST_MESSAGE("INFERENCE - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001074
1075 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001076}
1077
1078BOOST_AUTO_TEST_CASE(ProfilingPostOptimisationStructureCpuRef)
1079{
1080 VerifyPostOptimisationStructureTestImpl(armnn::Compute::CpuRef);
1081}
1082
telsoa014fcda012018-03-09 14:13:49 +00001083BOOST_AUTO_TEST_SUITE_END()