blob: 12ec8b1ece8e5b2e69a847d61eda8830a5dd5e76 [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;
265 armnn::IOptimizedNetworkPtr optNet = Optimize(*net,
266 backends,
267 runtime->GetDeviceSpec(),
268 OptimizerOptions(),
269 errMessages);
David Beckf0b48452018-10-19 15:20:56 +0100270
jimfly016b0b53d2018-10-08 14:43:01 +0100271 BOOST_TEST(errMessages.size() == 1);
272 BOOST_TEST(errMessages[0] ==
273 "ERROR: output 0 of layer Softmax (softmax) is of type "
274 "Quantized 8 bit but its scale parameter has not been set");
275 BOOST_TEST(!optNet);
276}
277
Derek Lamberti836b27b2019-11-20 10:51:57 +0000278BOOST_AUTO_TEST_CASE(RuntimeBackendOptions)
279{
280 using namespace armnn;
281
282 IRuntime::CreationOptions creationOptions;
283 auto& backendOptions = creationOptions.m_BackendOptions;
284
285
286 // Define Options on explicit construction
287 BackendOptions options1("FakeBackend1",
Keith Davis97da5e22020-03-05 16:25:28 +0000288 {
289 { "Option1", 1.3f },
290 { "Option2", true }
291 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000292
293 // Add an option after construction
Keith Davis97da5e22020-03-05 16:25:28 +0000294 options1.AddOption({ "Option3", "some_value" });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000295
296 // Add the options to CreationOptions struct
297 backendOptions.push_back(options1);
298
299 // Add more Options via inplace explicit construction
Keith Davis97da5e22020-03-05 16:25:28 +0000300 backendOptions.emplace_back(BackendOptions{ "FakeBackend1",
301 {{ "Option4", 42 }}
302 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000303
304
305 // First group
306 BOOST_TEST(backendOptions[0].GetBackendId().Get() == "FakeBackend1");
307 BOOST_TEST(backendOptions[0].GetOption(0).GetName() == "Option1");
308 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().IsFloat() == true);
309 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().AsFloat() == 1.3f);
310
311 BOOST_TEST(backendOptions[0].GetOption(1).GetName() == "Option2");
312 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().IsBool() == true);
313 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().AsBool() == true);
314
315 BOOST_TEST(backendOptions[0].GetOption(2).GetName() == "Option3");
316 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().IsString() == true);
317 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().AsString() == "some_value");
318
319 // Second group
320 BOOST_TEST(backendOptions[1].GetBackendId().Get() == "FakeBackend1");
321 BOOST_TEST(backendOptions[1].GetOption(0).GetName() == "Option4");
322 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().IsInt() == true);
323 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().AsInt() == 42);
324}
325
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000326BOOST_AUTO_TEST_CASE(ProfilingDisable)
327{
328 using namespace armnn;
329
330 // Create runtime in which the test will run
331 armnn::IRuntime::CreationOptions options;
Sadik Armagan3184c902020-03-18 10:57:30 +0000332 armnn::Runtime runtime(options);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000333
334 // build up the structure of the network
335 INetworkPtr net(INetwork::Create());
336
337 IConnectableLayer* input = net->AddInputLayer(0);
338
339 // This layer configuration isn't supported by CpuAcc, should fall back to CpuRef.
340 NormalizationDescriptor descriptor;
341 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
342
343 IConnectableLayer* output = net->AddOutputLayer(0);
344
345 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
346 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
347
348 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
349 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
350
351 // optimize the network
352 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000353 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000354
355 // Load it into the runtime. It should succeed.
356 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000357 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000358
Sadik Armagan3184c902020-03-18 10:57:30 +0000359 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000360 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
361 auto readableBuffer = bufferManager.GetReadableBuffer();
362
363 // Profiling is not enabled, the post-optimisation structure should not be created
364 BOOST_TEST(!readableBuffer);
365}
366
367BOOST_AUTO_TEST_CASE(ProfilingEnableCpuRef)
368{
369 using namespace armnn;
370 using namespace armnn::profiling;
371
372 // Create runtime in which the test will run
373 armnn::IRuntime::CreationOptions options;
374 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100375 options.m_ProfilingOptions.m_TimelineEnabled = true;
376
Sadik Armagan3184c902020-03-18 10:57:30 +0000377 armnn::Runtime runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100378 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
379
380 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
381 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
382 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
383 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000384
385 // build up the structure of the network
386 INetworkPtr net(INetwork::Create());
387
388 IConnectableLayer* input = net->AddInputLayer(0, "input");
389
390 NormalizationDescriptor descriptor;
391 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
392
393 IConnectableLayer* output = net->AddOutputLayer(0, "output");
394
395 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
396 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
397
398 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
399 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
400
401 // optimize the network
402 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000403 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000404
405 ProfilingGuid optNetGuid = optNet->GetGuid();
406
407 // Load it into the runtime. It should succeed.
408 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000409 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000410
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000411 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
412 auto readableBuffer = bufferManager.GetReadableBuffer();
413
414 // Profiling is enabled, the post-optimisation structure should be created
415 BOOST_CHECK(readableBuffer != nullptr);
416
417 unsigned int size = readableBuffer->GetSize();
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 Flynnf7713212020-07-14 09:50:59 +0100425 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Jim Flynn6398a982020-05-27 17:05:21 +0100426 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
Jim Flynnf7713212020-07-14 09:50:59 +0100443 // Network - START OF LIFE
444 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(EmptyOptional(),
445 EmptyOptional(),
446 EmptyOptional(),
447 readableData,
448 offset);
449 BOOST_TEST_MESSAGE("NETWORK START OF LIFE EVENT OK");
450
451 // Network - START OF LIFE event relationship
452 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
453 EmptyOptional(),
454 optNetGuid,
455 networkSolEventGuid,
456 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
457 readableData,
458 offset);
459 BOOST_TEST_MESSAGE("NETWORK START OF LIFE RELATIONSHIP OK");
460
461 // Process ID Label
462 int processID = armnnUtils::Processes::GetCurrentId();
463 std::stringstream ss;
464 ss << processID;
465 std::string processIdLabel = ss.str();
466 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
467 BOOST_TEST_MESSAGE("PROCESS ID LABEL OK");
468
469 // Entity - Process ID relationship
470 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
471 EmptyOptional(),
472 optNetGuid,
473 EmptyOptional(),
474 LabelsAndEventClasses::PROCESS_ID_GUID,
475 readableData,
476 offset);
477 BOOST_TEST_MESSAGE("NETWORK PROCESS ID RELATIONSHIP OK");
478
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000479 // Input layer
480 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000481 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100482 BOOST_TEST_MESSAGE("INPUT ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000483
484 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100485 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
486 BOOST_TEST_MESSAGE("INPUT NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000487
488 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000489 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
490 EmptyOptional(),
491 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100492 inputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000493 LabelsAndEventClasses::NAME_GUID,
494 readableData,
495 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100496 BOOST_TEST_MESSAGE("INPUT NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000497
498 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000499 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
500 EmptyOptional(),
501 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100502 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000503 LabelsAndEventClasses::TYPE_GUID,
504 readableData,
505 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100506 BOOST_TEST_MESSAGE("INPUT TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000507
508 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000509 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
510 EmptyOptional(),
511 optNetGuid,
512 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100513 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000514 readableData,
515 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100516 BOOST_TEST_MESSAGE("NETWORK - INPUT CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000517
518 // Normalization layer
519 // Normalization layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000520 VerifyTimelineEntityBinaryPacketData(normalize->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100521 BOOST_TEST_MESSAGE("NORMALIZATION LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000522
523 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100524 ProfilingGuid normalizationLayerNameGuid = VerifyTimelineLabelBinaryPacketData(
525 EmptyOptional(), "normalization", readableData, offset);
526 BOOST_TEST_MESSAGE("NORMALIZATION LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000527
528 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000529 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
530 EmptyOptional(),
531 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100532 normalizationLayerNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000533 LabelsAndEventClasses::NAME_GUID,
534 readableData,
535 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100536 BOOST_TEST_MESSAGE("NORMALIZATION LAYER NAME RELATIONSHIP 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(),
541 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100542 LabelsAndEventClasses::LAYER_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 LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000547
548 // Network - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000549 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
550 EmptyOptional(),
551 optNetGuid,
552 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100553 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000554 readableData,
555 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100556 BOOST_TEST_MESSAGE("NETWORK - NORMALIZATION LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000557
558 // Input layer - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000559 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
560 EmptyOptional(),
561 input->GetGuid(),
562 normalize->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000563 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000564 readableData,
565 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100566 BOOST_TEST_MESSAGE("INPUT - NORMALIZATION LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000567
568 // Normalization workload
569 // Normalization workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100570 ProfilingGuid normalizationWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
571 EmptyOptional(), readableData, offset);
572 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000573
574 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000575 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
576 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100577 normalizationWorkloadGuid,
578 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000579 LabelsAndEventClasses::TYPE_GUID,
580 readableData,
581 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100582 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000583
584 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100585 ProfilingGuid cpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
586 EmptyOptional(), "CpuRef", readableData, offset);
587 BOOST_TEST_MESSAGE("CPUREF LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000588
589 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000590 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
591 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100592 normalizationWorkloadGuid,
593 cpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000594 LabelsAndEventClasses::BACKENDID_GUID,
595 readableData,
596 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100597 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000598
599 // Normalize layer - Normalize workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000600 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
601 EmptyOptional(),
602 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100603 normalizationWorkloadGuid,
604 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000605 readableData,
606 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100607 BOOST_TEST_MESSAGE("NORMALIZATION LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000608
609 // Output layer
610 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000611 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100612 BOOST_TEST_MESSAGE("OUTPUT LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000613
614 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100615 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
616 EmptyOptional(), "output", readableData, offset);
617 BOOST_TEST_MESSAGE("OUTPUT LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000618
619 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000620 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
621 EmptyOptional(),
622 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100623 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000624 LabelsAndEventClasses::NAME_GUID,
625 readableData,
626 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100627 BOOST_TEST_MESSAGE("OUTPUT LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000628
629 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000630 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
631 EmptyOptional(),
632 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100633 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000634 LabelsAndEventClasses::TYPE_GUID,
635 readableData,
636 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100637 BOOST_TEST_MESSAGE("OUTPUT LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000638
639 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000640 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
641 EmptyOptional(),
642 optNetGuid,
643 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100644 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000645 readableData,
646 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100647 BOOST_TEST_MESSAGE("NETWORK - OUTPUT LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000648
649 // Normalize layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000650 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
651 EmptyOptional(),
652 normalize->GetGuid(),
653 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000654 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000655 readableData,
656 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100657 BOOST_TEST_MESSAGE("NORMALIZE LAYER - OUTPUT LAYER CONNECTION OK");
Derek Lamberti836b27b2019-11-20 10:51:57 +0000658
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000659 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000660
661 // Creates structures for input & output.
662 std::vector<float> inputData(16);
663 std::vector<float> outputData(16);
664
Keith Davis97da5e22020-03-05 16:25:28 +0000665 InputTensors inputTensors
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000666 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000667 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000668 };
669 OutputTensors outputTensors
670 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000671 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000672 };
673
674 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000675 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000676
Finn Williamsb6a402f2020-03-24 13:46:22 +0000677 // Get readable buffer for input workload
678 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
679 BOOST_CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000680
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000681 // Get readable buffer for output workload
682 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
683 BOOST_CHECK(outputReadableBuffer != nullptr);
684
Finn Williamsb6a402f2020-03-24 13:46:22 +0000685 // Get readable buffer for inference timeline
686 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
687 BOOST_CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000688
689 // Validate input workload data
690 size = inputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100691 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000692
693 readableData = inputReadableBuffer->GetReadableData();
694 BOOST_CHECK(readableData != nullptr);
695
696 offset = 0;
697
Keith Davis97da5e22020-03-05 16:25:28 +0000698 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100699 VerifyTimelineHeaderBinary(readableData, offset, 156);
Jim Flynn6398a982020-05-27 17:05:21 +0100700 BOOST_TEST_MESSAGE("INPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000701
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000702 // Input workload
703 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100704 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
705 BOOST_TEST_MESSAGE("INPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000706
707 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000708 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
709 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100710 inputWorkloadGuid,
711 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000712 LabelsAndEventClasses::TYPE_GUID,
713 readableData,
714 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100715 BOOST_TEST_MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000716
717 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100718 ProfilingGuid CpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
719 EmptyOptional(), "CpuRef", readableData, offset);
720 BOOST_TEST_MESSAGE("CPUREF LABEL OK (INPUT WORKLOAD)");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000721
722 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000723 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
724 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100725 inputWorkloadGuid,
726 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000727 LabelsAndEventClasses::BACKENDID_GUID,
728 readableData,
729 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100730 BOOST_TEST_MESSAGE("INPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000731
732 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000733 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
734 EmptyOptional(),
735 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100736 inputWorkloadGuid,
737 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000738 readableData,
739 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100740 BOOST_TEST_MESSAGE("INPUT LAYER - INPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000741
742 bufferManager.MarkRead(inputReadableBuffer);
743
744 // Validate output workload data
745 size = outputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100746 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000747
748 readableData = outputReadableBuffer->GetReadableData();
749 BOOST_CHECK(readableData != nullptr);
750
751 offset = 0;
752
Keith Davis97da5e22020-03-05 16:25:28 +0000753 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100754 VerifyTimelineHeaderBinary(readableData, offset, 156);
Jim Flynn6398a982020-05-27 17:05:21 +0100755 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000756
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000757 // Output workload
758 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100759 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
760 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000761
762 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000763 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
764 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100765 outputWorkloadGuid,
766 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000767 LabelsAndEventClasses::TYPE_GUID,
768 readableData,
769 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100770 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000771
772 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000773 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100774 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD CPU REF LABEL OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000775
776 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000777 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
778 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100779 outputWorkloadGuid,
780 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000781 LabelsAndEventClasses::BACKENDID_GUID,
782 readableData,
783 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100784 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000785
786 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000787 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
788 EmptyOptional(),
789 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100790 outputWorkloadGuid,
791 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000792 readableData,
793 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100794 BOOST_TEST_MESSAGE("OUTPUT LAYER - OUTPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000795
796 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000797
798 // Validate inference data
799 size = inferenceReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100800 BOOST_CHECK(size == 976 + 8 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000801
802 readableData = inferenceReadableBuffer->GetReadableData();
803 BOOST_CHECK(readableData != nullptr);
804
805 offset = 0;
806
Keith Davis97da5e22020-03-05 16:25:28 +0000807 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100808 VerifyTimelineHeaderBinary(readableData, offset, 968 + 8 * ThreadIdSize);
Jim Flynn6398a982020-05-27 17:05:21 +0100809 BOOST_TEST_MESSAGE("INFERENCE HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000810
David Monahan6198fe02019-12-02 08:35:43 +0000811 // Inference timeline trace
812 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100813 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
814 BOOST_TEST_MESSAGE("INFERENCE ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000815
816 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000817 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
818 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100819 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000820 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000821 LabelsAndEventClasses::TYPE_GUID,
822 readableData,
823 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100824 BOOST_TEST_MESSAGE("INFERENCE TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000825
826 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000827 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
828 EmptyOptional(),
829 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100830 inferenceGuid,
831 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000832 readableData,
833 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100834 BOOST_TEST_MESSAGE("NETWORK - INFERENCE EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000835
836 // Start Inference life
837 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100838 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
839 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
840 BOOST_TEST_MESSAGE("INFERENCE START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000841
842 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000843 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
844 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100845 inferenceGuid,
846 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000847 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
848 readableData,
849 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100850 BOOST_TEST_MESSAGE("INFERENCE START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000851
852 // Execution
853 // Input workload execution
854 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100855 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
856 EmptyOptional(), readableData, offset);
857 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000858
859 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000860 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
861 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100862 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000863 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000864 LabelsAndEventClasses::TYPE_GUID,
865 readableData,
866 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100867 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000868
869 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000870 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
871 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100872 inferenceGuid,
873 inputWorkloadExecutionGuid,
874 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000875 readableData,
876 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100877 BOOST_TEST_MESSAGE("INFERENCE - INPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000878
879 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000880 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
881 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100882 inputWorkloadGuid,
883 inputWorkloadExecutionGuid,
884 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000885 readableData,
886 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100887 BOOST_TEST_MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000888
889 // Start Input workload execution life
890 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100891 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
892 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000893
894 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000895 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
896 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100897 inputWorkloadExecutionGuid,
898 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000899 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
900 readableData,
901 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100902 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000903
904 // End of Input workload execution life
905 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100906 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
907 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000908
909 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000910 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
911 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100912 inputWorkloadExecutionGuid,
913 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000914 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
915 readableData,
916 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100917 BOOST_TEST_MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000918
919 // Normalize workload execution
920 // Normalize workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100921 ProfilingGuid normalizeWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
922 EmptyOptional(), readableData, offset);
923 BOOST_TEST_MESSAGE("NORMALIZE WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000924
925 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000926 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
927 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100928 normalizeWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000929 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000930 LabelsAndEventClasses::TYPE_GUID,
931 readableData,
932 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100933 BOOST_TEST_MESSAGE("NORMALIZE WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000934
935 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000936 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
937 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100938 inferenceGuid,
939 normalizeWorkloadExecutionGuid,
940 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000941 readableData,
942 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100943 BOOST_TEST_MESSAGE("INFERENCE - NORMALIZE WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000944
945 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000946 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
947 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100948 normalizationWorkloadGuid,
949 normalizeWorkloadExecutionGuid,
950 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000951 readableData,
952 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100953 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD - NORMALIZATION WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000954
955 // Start Normalize workload execution life
956 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100957 ProfilingGuid normalizationWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
958 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
959 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000960
961 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000962 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
963 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100964 normalizeWorkloadExecutionGuid,
965 normalizationWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000966 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
967 readableData,
968 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100969 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000970
971 // End of Normalize workload execution life
972 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100973 ProfilingGuid normalizationWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
974 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
975 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000976
977 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000978 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
979 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100980 normalizeWorkloadExecutionGuid,
981 normalizationWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000982 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
983 readableData,
984 offset);
Jim Flynn6398a982020-05-27 17:05:21 +0100985 BOOST_TEST_MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000986
987 // Output workload execution
988 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100989 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
990 EmptyOptional(), readableData, offset);
991 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000992
993 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000994 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
995 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100996 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000997 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000998 LabelsAndEventClasses::TYPE_GUID,
999 readableData,
1000 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001001 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001002
1003 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001004 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1005 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001006 inferenceGuid,
1007 outputWorkloadExecutionGuid,
1008 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001009 readableData,
1010 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001011 BOOST_TEST_MESSAGE("INFERENCE - OUTPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001012
1013 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001014 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1015 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001016 outputWorkloadGuid,
1017 outputWorkloadExecutionGuid,
1018 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001019 readableData,
1020 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001021 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD - OUTPUT WORKLOAD EXECUTION EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001022
1023 // Start Output workload execution life
1024 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001025 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1026 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1027 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001028
1029 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001030 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1031 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001032 outputWorkloadExecutionGuid,
1033 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001034 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1035 readableData,
1036 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001037 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +01001038
David Monahan6198fe02019-12-02 08:35:43 +00001039 // End of Normalize workload execution life
1040 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001041 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1042 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1043 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001044
1045 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001046 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1047 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001048 outputWorkloadExecutionGuid,
1049 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001050 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1051 readableData,
1052 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001053 BOOST_TEST_MESSAGE("OUTPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001054
1055 // End of Inference life
1056 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001057 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1058 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1059 BOOST_TEST_MESSAGE("INFERENCE END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001060
1061 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001062 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1063 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001064 inferenceGuid,
1065 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001066 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1067 readableData,
1068 offset);
Jim Flynn6398a982020-05-27 17:05:21 +01001069 BOOST_TEST_MESSAGE("INFERENCE - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001070
1071 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001072}
1073
1074BOOST_AUTO_TEST_CASE(ProfilingPostOptimisationStructureCpuRef)
1075{
1076 VerifyPostOptimisationStructureTestImpl(armnn::Compute::CpuRef);
1077}
1078
telsoa014fcda012018-03-09 14:13:49 +00001079BOOST_AUTO_TEST_SUITE_END()