blob: 29d258f6ab85fa07334ff311b9971e9b5732ad28 [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
Nikhil Raj77fe76b2021-06-09 14:55:32 +010013#include <common/include/LabelsAndEventClasses.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000014#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
Sadik Armagan1625efc2021-06-10 18:24:34 +010023#include <doctest/doctest.h>
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
Kevin Mayd92a6e42021-02-04 10:27:41 +000030void RuntimeLoadedNetworksReserve(armnn::RuntimeImpl* runtime)
telsoa014fcda012018-03-09 14:13:49 +000031{
32 runtime->m_LoadedNetworks.reserve(1);
33}
34
35}
36
Sadik Armagan1625efc2021-06-10 18:24:34 +010037TEST_SUITE("Runtime")
38{
39TEST_CASE("RuntimeUnloadNetwork")
telsoa014fcda012018-03-09 14:13:49 +000040{
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.
Sadik Armagan1625efc2021-06-10 18:24:34 +010059 CHECK(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Success);
telsoa014fcda012018-03-09 14:13:49 +000060
Sadik Armagan1625efc2021-06-10 18:24:34 +010061 CHECK(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Failure);
telsoa014fcda012018-03-09 14:13:49 +000062}
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
Sadik Armagan1625efc2021-06-10 18:24:34 +010079TEST_CASE_FIXTURE(DisableGlobalLeakChecking, "RuntimeHeapMemoryUsageSanityChecks")
surmeh013537c2c2018-05-18 16:31:43 +010080{
Sadik Armagan1625efc2021-06-10 18:24:34 +010081 CHECK(ARMNN_LEAK_CHECKER_IS_ACTIVE());
surmeh013537c2c2018-05-18 16:31:43 +010082 {
83 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Outer");
84 {
85 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Inner");
Sadik Armagan1625efc2021-06-10 18:24:34 +010086 CHECK(ARMNN_NO_LEAKS_IN_SCOPE() == true);
surmeh013537c2c2018-05-18 16:31:43 +010087 std::unique_ptr<char[]> dummyAllocation(new char[1000]);
Sadik Armagan1625efc2021-06-10 18:24:34 +010088 // "A leak of 1000 bytes is expected here. "
89 // "Please make sure environment variable: HEAPCHECK=draconian is set!"
90 CHECK((ARMNN_NO_LEAKS_IN_SCOPE() == false));
91 CHECK(ARMNN_BYTES_LEAKED_IN_SCOPE() == 1000);
92 CHECK(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 1);
surmeh013537c2c2018-05-18 16:31:43 +010093 }
Sadik Armagan1625efc2021-06-10 18:24:34 +010094 CHECK(ARMNN_NO_LEAKS_IN_SCOPE());
95 CHECK(ARMNN_BYTES_LEAKED_IN_SCOPE() == 0);
96 CHECK(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 0);
surmeh013537c2c2018-05-18 16:31:43 +010097 }
98}
99
surmeh013537c2c2018-05-18 16:31:43 +0100100#endif // ARMNN_LEAK_CHECKING_ENABLED
101
102// Note: this part of the code is due to be removed when we fully trust the gperftools based results.
telsoa014fcda012018-03-09 14:13:49 +0000103#ifdef WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100104// Run with the following command to get all the amazing output (in the devenv/build folder) :)
telsoa014fcda012018-03-09 14:13:49 +0000105// valgrind --leak-check=full --show-leak-kinds=all --log-file=Valgrind_Memcheck_Leak_Report.txt armnn/test/UnitTests
Sadik Armagan1625efc2021-06-10 18:24:34 +0100106TEST_CASE("RuntimeMemoryLeak")
telsoa014fcda012018-03-09 14:13:49 +0000107{
Sadik Armagan1625efc2021-06-10 18:24:34 +0100108 MESSAGE("RuntimeMemoryLeak");
telsoa014fcda012018-03-09 14:13:49 +0000109 // From documentation:
110
111 // This means that no pointer to the block can be found. The block is classified as "lost",
112 // because the programmer could not possibly have freed it at program exit, since no pointer to it exists.
113 unsigned long leakedBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000114 unsigned long leakedAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000115
116 // A start-pointer or chain of start-pointers to the block is found. Since the block is still pointed at,
117 // the programmer could, at least in principle, have freed it before program exit.
telsoa01c577f2c2018-08-31 09:22:23 +0100118 // We want to test this in case memory is not freed as early as it could have been.
telsoa014fcda012018-03-09 14:13:49 +0000119 unsigned long reachableBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000120 unsigned long reachableAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000121
telsoa01c577f2c2018-08-31 09:22:23 +0100122 // Needed as out params but we don't test them.
Keith Davis97da5e22020-03-05 16:25:28 +0000123 unsigned long dubious = 0;
telsoa014fcda012018-03-09 14:13:49 +0000124 unsigned long suppressed = 0;
125
126 armnn::NetworkId networkIdentifier1 = 1;
127
128 // ensure that runtime is large enough before checking for memory leaks
129 // otherwise when loading the network it will automatically reserve memory that won't be released until destruction
telsoa01c577f2c2018-08-31 09:22:23 +0100130 armnn::IRuntime::CreationOptions options;
Kevin Mayd92a6e42021-02-04 10:27:41 +0000131 armnn::RuntimeImpl runtime(options);
telsoa014fcda012018-03-09 14:13:49 +0000132 armnn::RuntimeLoadedNetworksReserve(&runtime);
133
telsoa014fcda012018-03-09 14:13:49 +0000134 {
Keith Davis97da5e22020-03-05 16:25:28 +0000135 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa014fcda012018-03-09 14:13:49 +0000136
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000137 armnn::INetworkPtr mockNetwork1(armnn::INetwork::Create());
telsoa014fcda012018-03-09 14:13:49 +0000138 mockNetwork1->AddInputLayer(0, "test layer");
139
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000140 // Warm-up load/unload pair to put the runtime in a stable state (memory-wise).
telsoa01c577f2c2018-08-31 09:22:23 +0100141 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000142 runtime.UnloadNetwork(networkIdentifier1);
143
144 // Checks for leaks before we load the network and record them so that we can see the delta after unloading.
145 VALGRIND_DO_QUICK_LEAK_CHECK;
146 VALGRIND_COUNT_LEAKS(leakedBefore, dubious, reachableBefore, suppressed);
147
148 // The actual test.
149 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
150 runtime.UnloadNetwork(networkIdentifier1);
151
152 VALGRIND_DO_ADDED_LEAK_CHECK;
153 VALGRIND_COUNT_LEAKS(leakedAfter, dubious, reachableAfter, suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000154 }
155
telsoa01c577f2c2018-08-31 09:22:23 +0100156 // If we're not running under Valgrind, these vars will have been initialised to 0, so this will always pass.
Sadik Armagan1625efc2021-06-10 18:24:34 +0100157 CHECK(leakedBefore == leakedAfter);
158 CHECK(reachableBefore == reachableAfter);
telsoa014fcda012018-03-09 14:13:49 +0000159
telsoa01c577f2c2018-08-31 09:22:23 +0100160 // These are needed because VALGRIND_COUNT_LEAKS is a macro that assigns to the parameters
161 // so they are assigned to, but still considered unused, causing a warning.
Jan Eilers8eb25602020-03-09 12:13:48 +0000162 IgnoreUnused(dubious);
163 IgnoreUnused(suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000164}
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100165#endif // WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100166
Sadik Armagan1625efc2021-06-10 18:24:34 +0100167TEST_CASE("RuntimeCpuRef")
telsoa01c577f2c2018-08-31 09:22:23 +0100168{
169 using namespace armnn;
170
171 // Create runtime in which test will run
172 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000173 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100174
175 // build up the structure of the network
176 INetworkPtr net(INetwork::Create());
177
178 IConnectableLayer* input = net->AddInputLayer(0);
179
180 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
181 NormalizationDescriptor descriptor;
182 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
183
184 IConnectableLayer* output = net->AddOutputLayer(0);
185
186 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
187 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
188
189 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
190 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
191
192 // optimize the network
David Beckf0b48452018-10-19 15:20:56 +0100193 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Keith Davis97da5e22020-03-05 16:25:28 +0000194 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100195
196 // Load it into the runtime. It should success.
197 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100198 CHECK(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
telsoa01c577f2c2018-08-31 09:22:23 +0100199}
200
Sadik Armagan1625efc2021-06-10 18:24:34 +0100201TEST_CASE("RuntimeFallbackToCpuRef")
telsoa01c577f2c2018-08-31 09:22:23 +0100202{
203 using namespace armnn;
204
205 // Create runtime in which test will run
206 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000207 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100208
209 // build up the structure of the network
210 INetworkPtr net(INetwork::Create());
211
212 IConnectableLayer* input = net->AddInputLayer(0);
213
214 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
215 NormalizationDescriptor descriptor;
216 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
217
218 IConnectableLayer* output = net->AddOutputLayer(0);
219
220 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
221 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
222
223 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
224 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
225
226 // Allow fallback to CpuRef.
David Beckf0b48452018-10-19 15:20:56 +0100227 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc, armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +0100228 // optimize the network
Keith Davis97da5e22020-03-05 16:25:28 +0000229 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100230
231 // Load it into the runtime. It should succeed.
232 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100233 CHECK(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
telsoa01c577f2c2018-08-31 09:22:23 +0100234}
235
Sadik Armagan1625efc2021-06-10 18:24:34 +0100236TEST_CASE("IVGCVSW_1929_QuantizedSoftmaxIssue")
jimfly016b0b53d2018-10-08 14:43:01 +0100237{
238 // Test for issue reported by Chris Nix in https://jira.arm.com/browse/IVGCVSW-1929
239 using namespace armnn;
240
241 // Create runtime in which test will run
242 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000243 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
jimfly016b0b53d2018-10-08 14:43:01 +0100244
245 // build up the structure of the network
246 INetworkPtr net(INetwork::Create());
Keith Davis97da5e22020-03-05 16:25:28 +0000247 armnn::IConnectableLayer* input = net->AddInputLayer(0,"input");
248 armnn::IConnectableLayer* softmax = net->AddSoftmaxLayer(armnn::SoftmaxDescriptor(), "softmax");
249 armnn::IConnectableLayer* output = net->AddOutputLayer(0, "output");
jimfly016b0b53d2018-10-08 14:43:01 +0100250
251 input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0));
252 softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0));
253
Keith Davis97da5e22020-03-05 16:25:28 +0000254 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
255 armnn::DataType::QAsymmU8,
256 1.0f / 255,
257 0));
jimfly016b0b53d2018-10-08 14:43:01 +0100258
Keith Davis97da5e22020-03-05 16:25:28 +0000259 softmax->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
260 armnn::DataType::QAsymmU8));
jimfly016b0b53d2018-10-08 14:43:01 +0100261
Keith Davis97da5e22020-03-05 16:25:28 +0000262 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
263 std::vector<std::string> errMessages;
Mike Kelly3a613cc2020-09-29 20:50:35 +0100264
265 try
266 {
267 armnn::IOptimizedNetworkPtr optNet = Optimize(*net,
Keith Davis97da5e22020-03-05 16:25:28 +0000268 backends,
269 runtime->GetDeviceSpec(),
270 OptimizerOptions(),
271 errMessages);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100272 FAIL("An exception should have been thrown");
Mike Kelly3a613cc2020-09-29 20:50:35 +0100273 }
274 catch (const InvalidArgumentException& e)
275 {
276 // Different exceptions are thrown on different backends
277 }
Sadik Armagan1625efc2021-06-10 18:24:34 +0100278 CHECK(errMessages.size() > 0);
jimfly016b0b53d2018-10-08 14:43:01 +0100279}
280
Sadik Armagan1625efc2021-06-10 18:24:34 +0100281TEST_CASE("RuntimeBackendOptions")
Derek Lamberti836b27b2019-11-20 10:51:57 +0000282{
283 using namespace armnn;
284
285 IRuntime::CreationOptions creationOptions;
286 auto& backendOptions = creationOptions.m_BackendOptions;
287
288
289 // Define Options on explicit construction
290 BackendOptions options1("FakeBackend1",
Keith Davis97da5e22020-03-05 16:25:28 +0000291 {
292 { "Option1", 1.3f },
293 { "Option2", true }
294 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000295
296 // Add an option after construction
Keith Davis97da5e22020-03-05 16:25:28 +0000297 options1.AddOption({ "Option3", "some_value" });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000298
299 // Add the options to CreationOptions struct
300 backendOptions.push_back(options1);
301
302 // Add more Options via inplace explicit construction
Keith Davis97da5e22020-03-05 16:25:28 +0000303 backendOptions.emplace_back(BackendOptions{ "FakeBackend1",
304 {{ "Option4", 42 }}
305 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000306
307
308 // First group
Sadik Armagan1625efc2021-06-10 18:24:34 +0100309 CHECK(backendOptions[0].GetBackendId().Get() == "FakeBackend1");
310 CHECK(backendOptions[0].GetOption(0).GetName() == "Option1");
311 CHECK(backendOptions[0].GetOption(0).GetValue().IsFloat() == true);
312 CHECK(backendOptions[0].GetOption(0).GetValue().AsFloat() == 1.3f);
Derek Lamberti836b27b2019-11-20 10:51:57 +0000313
Sadik Armagan1625efc2021-06-10 18:24:34 +0100314 CHECK(backendOptions[0].GetOption(1).GetName() == "Option2");
315 CHECK(backendOptions[0].GetOption(1).GetValue().IsBool() == true);
316 CHECK(backendOptions[0].GetOption(1).GetValue().AsBool() == true);
Derek Lamberti836b27b2019-11-20 10:51:57 +0000317
Sadik Armagan1625efc2021-06-10 18:24:34 +0100318 CHECK(backendOptions[0].GetOption(2).GetName() == "Option3");
319 CHECK(backendOptions[0].GetOption(2).GetValue().IsString() == true);
320 CHECK(backendOptions[0].GetOption(2).GetValue().AsString() == "some_value");
Derek Lamberti836b27b2019-11-20 10:51:57 +0000321
322 // Second group
Sadik Armagan1625efc2021-06-10 18:24:34 +0100323 CHECK(backendOptions[1].GetBackendId().Get() == "FakeBackend1");
324 CHECK(backendOptions[1].GetOption(0).GetName() == "Option4");
325 CHECK(backendOptions[1].GetOption(0).GetValue().IsInt() == true);
326 CHECK(backendOptions[1].GetOption(0).GetValue().AsInt() == 42);
Derek Lamberti836b27b2019-11-20 10:51:57 +0000327}
328
Sadik Armagan1625efc2021-06-10 18:24:34 +0100329TEST_CASE("ProfilingDisable")
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000330{
331 using namespace armnn;
332
333 // Create runtime in which the test will run
334 armnn::IRuntime::CreationOptions options;
Kevin Mayd92a6e42021-02-04 10:27:41 +0000335 armnn::RuntimeImpl runtime(options);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000336
337 // build up the structure of the network
338 INetworkPtr net(INetwork::Create());
339
340 IConnectableLayer* input = net->AddInputLayer(0);
341
342 // This layer configuration isn't supported by CpuAcc, should fall back to CpuRef.
343 NormalizationDescriptor descriptor;
344 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
345
346 IConnectableLayer* output = net->AddOutputLayer(0);
347
348 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
349 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
350
351 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
352 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
353
354 // optimize the network
355 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000356 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000357
358 // Load it into the runtime. It should succeed.
359 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100360 CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000361
Sadik Armagan3184c902020-03-18 10:57:30 +0000362 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000363 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
364 auto readableBuffer = bufferManager.GetReadableBuffer();
365
366 // Profiling is not enabled, the post-optimisation structure should not be created
Sadik Armagan1625efc2021-06-10 18:24:34 +0100367 CHECK(!readableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000368}
369
Sadik Armagan1625efc2021-06-10 18:24:34 +0100370TEST_CASE("ProfilingEnableCpuRef")
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000371{
372 using namespace armnn;
373 using namespace armnn::profiling;
374
375 // Create runtime in which the test will run
376 armnn::IRuntime::CreationOptions options;
377 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100378 options.m_ProfilingOptions.m_TimelineEnabled = true;
379
Kevin Mayd92a6e42021-02-04 10:27:41 +0000380 armnn::RuntimeImpl runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100381 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
382
383 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
384 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
385 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
386 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000387
388 // build up the structure of the network
389 INetworkPtr net(INetwork::Create());
390
391 IConnectableLayer* input = net->AddInputLayer(0, "input");
392
393 NormalizationDescriptor descriptor;
394 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
395
396 IConnectableLayer* output = net->AddOutputLayer(0, "output");
397
398 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
399 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
400
401 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
402 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
403
404 // optimize the network
405 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000406 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000407
408 ProfilingGuid optNetGuid = optNet->GetGuid();
409
410 // Load it into the runtime. It should succeed.
411 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100412 CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000413
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000414 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
415 auto readableBuffer = bufferManager.GetReadableBuffer();
416
417 // Profiling is enabled, the post-optimisation structure should be created
Sadik Armagan1625efc2021-06-10 18:24:34 +0100418 CHECK(readableBuffer != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000419
420 unsigned int size = readableBuffer->GetSize();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000421
422 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100423 CHECK(readableData != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000424
425 unsigned int offset = 0;
426
Keith Davis97da5e22020-03-05 16:25:28 +0000427 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +0100428 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100429 MESSAGE("HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000430
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000431 // Post-optimisation network
432 // Network entity
Jim Flynn6398a982020-05-27 17:05:21 +0100433 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100434 MESSAGE("NETWORK ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000435
436 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000437 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
438 EmptyOptional(),
439 optNetGuid,
440 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000441 LabelsAndEventClasses::TYPE_GUID,
442 readableData,
443 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100444 MESSAGE("NETWORK TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000445
Jim Flynnf7713212020-07-14 09:50:59 +0100446 // Network - START OF LIFE
447 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(EmptyOptional(),
448 EmptyOptional(),
449 EmptyOptional(),
450 readableData,
451 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100452 MESSAGE("NETWORK START OF LIFE EVENT OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100453
454 // Network - START OF LIFE event relationship
455 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
456 EmptyOptional(),
457 optNetGuid,
458 networkSolEventGuid,
459 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
460 readableData,
461 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100462 MESSAGE("NETWORK START OF LIFE RELATIONSHIP OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100463
464 // Process ID Label
465 int processID = armnnUtils::Processes::GetCurrentId();
466 std::stringstream ss;
467 ss << processID;
468 std::string processIdLabel = ss.str();
469 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100470 MESSAGE("PROCESS ID LABEL OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100471
472 // Entity - Process ID relationship
473 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
474 EmptyOptional(),
475 optNetGuid,
476 EmptyOptional(),
477 LabelsAndEventClasses::PROCESS_ID_GUID,
478 readableData,
479 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100480 MESSAGE("NETWORK PROCESS ID RELATIONSHIP OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100481
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000482 // Input layer
483 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000484 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100485 MESSAGE("INPUT ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000486
487 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100488 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100489 MESSAGE("INPUT NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000490
491 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000492 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
493 EmptyOptional(),
494 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100495 inputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000496 LabelsAndEventClasses::NAME_GUID,
497 readableData,
498 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100499 MESSAGE("INPUT NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000500
501 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000502 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
503 EmptyOptional(),
504 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100505 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000506 LabelsAndEventClasses::TYPE_GUID,
507 readableData,
508 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100509 MESSAGE("INPUT TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000510
511 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000512 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
513 EmptyOptional(),
514 optNetGuid,
515 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100516 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000517 readableData,
518 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100519 MESSAGE("NETWORK - INPUT CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000520
521 // Normalization layer
522 // Normalization layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000523 VerifyTimelineEntityBinaryPacketData(normalize->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100524 MESSAGE("NORMALIZATION LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000525
526 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100527 ProfilingGuid normalizationLayerNameGuid = VerifyTimelineLabelBinaryPacketData(
528 EmptyOptional(), "normalization", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100529 MESSAGE("NORMALIZATION LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000530
531 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000532 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
533 EmptyOptional(),
534 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100535 normalizationLayerNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000536 LabelsAndEventClasses::NAME_GUID,
537 readableData,
538 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100539 MESSAGE("NORMALIZATION LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000540
541 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000542 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
543 EmptyOptional(),
544 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100545 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000546 LabelsAndEventClasses::TYPE_GUID,
547 readableData,
548 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100549 MESSAGE("NORMALIZATION LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000550
551 // Network - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000552 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
553 EmptyOptional(),
554 optNetGuid,
555 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100556 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000557 readableData,
558 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100559 MESSAGE("NETWORK - NORMALIZATION LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000560
561 // Input layer - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000562 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
563 EmptyOptional(),
564 input->GetGuid(),
565 normalize->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000566 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000567 readableData,
568 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100569 MESSAGE("INPUT - NORMALIZATION LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000570
571 // Normalization workload
572 // Normalization workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100573 ProfilingGuid normalizationWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
574 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100575 MESSAGE("NORMALIZATION WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000576
577 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000578 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
579 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100580 normalizationWorkloadGuid,
581 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000582 LabelsAndEventClasses::TYPE_GUID,
583 readableData,
584 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100585 MESSAGE("NORMALIZATION WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000586
587 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100588 ProfilingGuid cpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
589 EmptyOptional(), "CpuRef", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100590 MESSAGE("CPUREF LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000591
592 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000593 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
594 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100595 normalizationWorkloadGuid,
596 cpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000597 LabelsAndEventClasses::BACKENDID_GUID,
598 readableData,
599 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100600 MESSAGE("NORMALIZATION WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000601
602 // Normalize layer - Normalize workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000603 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
604 EmptyOptional(),
605 normalize->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100606 normalizationWorkloadGuid,
607 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000608 readableData,
609 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100610 MESSAGE("NORMALIZATION LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000611
612 // Output layer
613 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000614 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100615 MESSAGE("OUTPUT LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000616
617 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100618 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
619 EmptyOptional(), "output", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100620 MESSAGE("OUTPUT LAYER NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000621
622 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000623 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
624 EmptyOptional(),
625 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100626 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000627 LabelsAndEventClasses::NAME_GUID,
628 readableData,
629 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100630 MESSAGE("OUTPUT LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000631
632 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000633 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
634 EmptyOptional(),
635 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100636 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000637 LabelsAndEventClasses::TYPE_GUID,
638 readableData,
639 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100640 MESSAGE("OUTPUT LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000641
642 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000643 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
644 EmptyOptional(),
645 optNetGuid,
646 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100647 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000648 readableData,
649 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100650 MESSAGE("NETWORK - OUTPUT LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000651
652 // Normalize layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000653 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
654 EmptyOptional(),
655 normalize->GetGuid(),
656 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000657 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000658 readableData,
659 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100660 MESSAGE("NORMALIZE LAYER - OUTPUT LAYER CONNECTION OK");
Derek Lamberti836b27b2019-11-20 10:51:57 +0000661
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000662 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000663
664 // Creates structures for input & output.
665 std::vector<float> inputData(16);
666 std::vector<float> outputData(16);
667
Keith Davis97da5e22020-03-05 16:25:28 +0000668 InputTensors inputTensors
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000669 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000670 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000671 };
672 OutputTensors outputTensors
673 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000674 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000675 };
676
677 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000678 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000679
Finn Williamsb6a402f2020-03-24 13:46:22 +0000680 // Get readable buffer for input workload
681 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100682 CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000683
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000684 // Get readable buffer for output workload
685 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100686 CHECK(outputReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000687
Finn Williamsb6a402f2020-03-24 13:46:22 +0000688 // Get readable buffer for inference timeline
689 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100690 CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000691
692 // Validate input workload data
693 size = inputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100694 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000695
696 readableData = inputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100697 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000698
699 offset = 0;
700
Keith Davis97da5e22020-03-05 16:25:28 +0000701 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100702 VerifyTimelineHeaderBinary(readableData, offset, 156);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100703 MESSAGE("INPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000704
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000705 // Input workload
706 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100707 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100708 MESSAGE("INPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000709
710 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000711 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
712 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100713 inputWorkloadGuid,
714 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000715 LabelsAndEventClasses::TYPE_GUID,
716 readableData,
717 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100718 MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000719
720 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100721 ProfilingGuid CpuRefLabelGuid = VerifyTimelineLabelBinaryPacketData(
722 EmptyOptional(), "CpuRef", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100723 MESSAGE("CPUREF LABEL OK (INPUT WORKLOAD)");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000724
725 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000726 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
727 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100728 inputWorkloadGuid,
729 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000730 LabelsAndEventClasses::BACKENDID_GUID,
731 readableData,
732 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100733 MESSAGE("INPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000734
735 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000736 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
737 EmptyOptional(),
738 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100739 inputWorkloadGuid,
740 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000741 readableData,
742 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100743 MESSAGE("INPUT LAYER - INPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000744
745 bufferManager.MarkRead(inputReadableBuffer);
746
747 // Validate output workload data
748 size = outputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100749 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000750
751 readableData = outputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100752 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000753
754 offset = 0;
755
Keith Davis97da5e22020-03-05 16:25:28 +0000756 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100757 VerifyTimelineHeaderBinary(readableData, offset, 156);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100758 MESSAGE("OUTPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000759
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000760 // Output workload
761 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100762 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100763 MESSAGE("OUTPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000764
765 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000766 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
767 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100768 outputWorkloadGuid,
769 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000770 LabelsAndEventClasses::TYPE_GUID,
771 readableData,
772 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100773 MESSAGE("OUTPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000774
775 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000776 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100777 MESSAGE("OUTPUT WORKLOAD CPU REF LABEL OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000778
779 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000780 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
781 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100782 outputWorkloadGuid,
783 CpuRefLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000784 LabelsAndEventClasses::BACKENDID_GUID,
785 readableData,
786 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100787 MESSAGE("OUTPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000788
789 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000790 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
791 EmptyOptional(),
792 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100793 outputWorkloadGuid,
794 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000795 readableData,
796 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100797 MESSAGE("OUTPUT LAYER - OUTPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000798
799 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000800
801 // Validate inference data
802 size = inferenceReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100803 CHECK(size == 976 + 8 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000804
805 readableData = inferenceReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100806 CHECK(readableData != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000807
808 offset = 0;
809
Keith Davis97da5e22020-03-05 16:25:28 +0000810 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100811 VerifyTimelineHeaderBinary(readableData, offset, 968 + 8 * ThreadIdSize);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100812 MESSAGE("INFERENCE HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000813
David Monahan6198fe02019-12-02 08:35:43 +0000814 // Inference timeline trace
815 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100816 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100817 MESSAGE("INFERENCE ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000818
819 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000820 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
821 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100822 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000823 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000824 LabelsAndEventClasses::TYPE_GUID,
825 readableData,
826 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100827 MESSAGE("INFERENCE TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000828
829 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000830 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
831 EmptyOptional(),
832 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100833 inferenceGuid,
834 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000835 readableData,
836 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100837 MESSAGE("NETWORK - INFERENCE EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000838
839 // Start Inference life
840 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100841 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
842 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100843 MESSAGE("INFERENCE START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000844
845 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000846 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
847 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100848 inferenceGuid,
849 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000850 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
851 readableData,
852 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100853 MESSAGE("INFERENCE START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000854
855 // Execution
856 // Input workload execution
857 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100858 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
859 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100860 MESSAGE("INPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000861
862 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000863 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
864 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100865 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000866 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000867 LabelsAndEventClasses::TYPE_GUID,
868 readableData,
869 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100870 MESSAGE("INPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000871
872 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000873 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
874 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100875 inferenceGuid,
876 inputWorkloadExecutionGuid,
877 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000878 readableData,
879 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100880 MESSAGE("INFERENCE - INPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000881
882 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000883 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
884 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100885 inputWorkloadGuid,
886 inputWorkloadExecutionGuid,
887 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000888 readableData,
889 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100890 MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000891
892 // Start Input workload execution life
893 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100894 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
895 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000896
897 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000898 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
899 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100900 inputWorkloadExecutionGuid,
901 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000902 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
903 readableData,
904 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100905 MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000906
907 // End of Input workload execution life
908 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100909 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
910 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000911
912 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000913 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
914 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100915 inputWorkloadExecutionGuid,
916 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000917 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
918 readableData,
919 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100920 MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000921
922 // Normalize workload execution
923 // Normalize workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100924 ProfilingGuid normalizeWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
925 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100926 MESSAGE("NORMALIZE WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000927
928 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000929 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
930 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100931 normalizeWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000932 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000933 LabelsAndEventClasses::TYPE_GUID,
934 readableData,
935 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100936 MESSAGE("NORMALIZE WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000937
938 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000939 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
940 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100941 inferenceGuid,
942 normalizeWorkloadExecutionGuid,
943 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000944 readableData,
945 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100946 MESSAGE("INFERENCE - NORMALIZE WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000947
948 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000949 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
950 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100951 normalizationWorkloadGuid,
952 normalizeWorkloadExecutionGuid,
953 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000954 readableData,
955 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100956 MESSAGE("NORMALIZATION WORKLOAD - NORMALIZATION WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000957
958 // Start Normalize workload execution life
959 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100960 ProfilingGuid normalizationWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
961 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100962 MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000963
964 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000965 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
966 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100967 normalizeWorkloadExecutionGuid,
968 normalizationWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000969 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
970 readableData,
971 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100972 MESSAGE("NORMALIZATION WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000973
974 // End of Normalize workload execution life
975 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100976 ProfilingGuid normalizationWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
977 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100978 MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000979
980 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000981 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
982 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100983 normalizeWorkloadExecutionGuid,
984 normalizationWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000985 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
986 readableData,
987 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100988 MESSAGE("NORMALIZATION WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000989
990 // Output workload execution
991 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100992 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
993 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100994 MESSAGE("OUTPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000995
996 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000997 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
998 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100999 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001000 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001001 LabelsAndEventClasses::TYPE_GUID,
1002 readableData,
1003 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001004 MESSAGE("OUTPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001005
1006 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001007 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1008 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001009 inferenceGuid,
1010 outputWorkloadExecutionGuid,
1011 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001012 readableData,
1013 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001014 MESSAGE("INFERENCE - OUTPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001015
1016 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001017 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1018 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001019 outputWorkloadGuid,
1020 outputWorkloadExecutionGuid,
1021 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001022 readableData,
1023 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001024 MESSAGE("OUTPUT WORKLOAD - OUTPUT WORKLOAD EXECUTION EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001025
1026 // Start Output workload execution life
1027 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001028 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1029 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001030 MESSAGE("OUTPUT WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001031
1032 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001033 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1034 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001035 outputWorkloadExecutionGuid,
1036 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001037 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1038 readableData,
1039 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001040 MESSAGE("OUTPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +01001041
David Monahan6198fe02019-12-02 08:35:43 +00001042 // End of Normalize workload execution life
1043 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001044 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1045 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001046 MESSAGE("OUTPUT WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001047
1048 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001049 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1050 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001051 outputWorkloadExecutionGuid,
1052 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001053 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1054 readableData,
1055 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001056 MESSAGE("OUTPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001057
1058 // End of Inference life
1059 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001060 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1061 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001062 MESSAGE("INFERENCE END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001063
1064 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001065 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1066 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001067 inferenceGuid,
1068 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001069 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1070 readableData,
1071 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001072 MESSAGE("INFERENCE - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001073
1074 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001075}
1076
Sadik Armagan1625efc2021-06-10 18:24:34 +01001077TEST_CASE("ProfilingPostOptimisationStructureCpuRef")
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001078{
1079 VerifyPostOptimisationStructureTestImpl(armnn::Compute::CpuRef);
1080}
1081
Sadik Armagan1625efc2021-06-10 18:24:34 +01001082}