blob: 2fc4b50a54c66f9835dd06f94814536b954b5e64 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
telsoa014fcda012018-03-09 14:13:49 +00005
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +01006#include <armnn/Descriptors.hpp>
7#include <armnn/IRuntime.hpp>
8#include <armnn/INetwork.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <Runtime.hpp>
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010010#include <armnn/TypesUtils.hpp>
telsoa014fcda012018-03-09 14:13:49 +000011
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000012#include <LabelsAndEventClasses.hpp>
13#include <test/ProfilingTestUtils.hpp>
14
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <HeapProfiling.hpp>
16#include <LeakChecking.hpp>
telsoa014fcda012018-03-09 14:13:49 +000017
18#ifdef WITH_VALGRIND
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010019#include <valgrind/memcheck.h>
telsoa014fcda012018-03-09 14:13:49 +000020#endif
21
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010022#include <boost/test/unit_test.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000023#include "RuntimeTests.hpp"
Sadik Armaganea41b572020-03-19 18:16:46 +000024#include "TestUtils.hpp"
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +010025
telsoa014fcda012018-03-09 14:13:49 +000026namespace armnn
27{
28
29void RuntimeLoadedNetworksReserve(armnn::Runtime* runtime)
30{
31 runtime->m_LoadedNetworks.reserve(1);
32}
33
34}
35
36BOOST_AUTO_TEST_SUITE(Runtime)
37
38BOOST_AUTO_TEST_CASE(RuntimeUnloadNetwork)
39{
40 // build 2 mock-networks and load them into the runtime
telsoa01c577f2c2018-08-31 09:22:23 +010041 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +000042 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa014fcda012018-03-09 14:13:49 +000043
telsoa01c577f2c2018-08-31 09:22:23 +010044 // Mock network 1.
Keith Davis97da5e22020-03-05 16:25:28 +000045 armnn::NetworkId networkIdentifier1 = 1;
telsoa014fcda012018-03-09 14:13:49 +000046 armnn::INetworkPtr mockNetwork1(armnn::INetwork::Create());
47 mockNetwork1->AddInputLayer(0, "test layer");
Keith Davis97da5e22020-03-05 16:25:28 +000048 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +010049 runtime->LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000050
telsoa01c577f2c2018-08-31 09:22:23 +010051 // Mock network 2.
Keith Davis97da5e22020-03-05 16:25:28 +000052 armnn::NetworkId networkIdentifier2 = 2;
telsoa014fcda012018-03-09 14:13:49 +000053 armnn::INetworkPtr mockNetwork2(armnn::INetwork::Create());
54 mockNetwork2->AddInputLayer(0, "test layer");
telsoa01c577f2c2018-08-31 09:22:23 +010055 runtime->LoadNetwork(networkIdentifier2, Optimize(*mockNetwork2, backends, runtime->GetDeviceSpec()));
telsoa014fcda012018-03-09 14:13:49 +000056
telsoa01c577f2c2018-08-31 09:22:23 +010057 // Unloads one by its networkID.
telsoa014fcda012018-03-09 14:13:49 +000058 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Success);
59
60 BOOST_TEST(runtime->UnloadNetwork(networkIdentifier1) == armnn::Status::Failure);
61}
62
surmeh013537c2c2018-05-18 16:31:43 +010063// Note: the current builds we don't do valgrind and gperftools based leak checking at the same
telsoa01c577f2c2018-08-31 09:22:23 +010064// time, so in practice WITH_VALGRIND and ARMNN_LEAK_CHECKING_ENABLED are exclusive. The
65// valgrind tests can stay for x86 builds, but on hikey Valgrind is just way too slow
66// to be integrated into the CI system.
surmeh013537c2c2018-05-18 16:31:43 +010067
telsoa01c577f2c2018-08-31 09:22:23 +010068#ifdef ARMNN_LEAK_CHECKING_ENABLED
69
70struct DisableGlobalLeakChecking
71{
72 DisableGlobalLeakChecking()
73 {
74 ARMNN_LOCAL_LEAK_CHECKING_ONLY();
75 }
76};
77
78BOOST_GLOBAL_FIXTURE(DisableGlobalLeakChecking);
79
surmeh013537c2c2018-05-18 16:31:43 +010080BOOST_AUTO_TEST_CASE(RuntimeHeapMemoryUsageSanityChecks)
81{
82 BOOST_TEST(ARMNN_LEAK_CHECKER_IS_ACTIVE());
83 {
84 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Outer");
85 {
86 ARMNN_SCOPED_LEAK_CHECKER("Sanity_Check_Inner");
telsoa01c577f2c2018-08-31 09:22:23 +010087 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE() == true);
surmeh013537c2c2018-05-18 16:31:43 +010088 std::unique_ptr<char[]> dummyAllocation(new char[1000]);
telsoa01c577f2c2018-08-31 09:22:23 +010089 BOOST_CHECK_MESSAGE(ARMNN_NO_LEAKS_IN_SCOPE() == false,
90 "A leak of 1000 bytes is expected here. "
91 "Please make sure environment variable: HEAPCHECK=draconian is set!");
92 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 1000);
93 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 1);
surmeh013537c2c2018-05-18 16:31:43 +010094 }
95 BOOST_TEST(ARMNN_NO_LEAKS_IN_SCOPE());
96 BOOST_TEST(ARMNN_BYTES_LEAKED_IN_SCOPE() == 0);
97 BOOST_TEST(ARMNN_OBJECTS_LEAKED_IN_SCOPE() == 0);
98 }
99}
100
surmeh013537c2c2018-05-18 16:31:43 +0100101#endif // ARMNN_LEAK_CHECKING_ENABLED
102
103// Note: this part of the code is due to be removed when we fully trust the gperftools based results.
telsoa014fcda012018-03-09 14:13:49 +0000104#ifdef WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100105// Run with the following command to get all the amazing output (in the devenv/build folder) :)
telsoa014fcda012018-03-09 14:13:49 +0000106// valgrind --leak-check=full --show-leak-kinds=all --log-file=Valgrind_Memcheck_Leak_Report.txt armnn/test/UnitTests
107BOOST_AUTO_TEST_CASE(RuntimeMemoryLeak)
108{
109 // From documentation:
110
111 // This means that no pointer to the block can be found. The block is classified as "lost",
112 // because the programmer could not possibly have freed it at program exit, since no pointer to it exists.
113 unsigned long leakedBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000114 unsigned long leakedAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000115
116 // A start-pointer or chain of start-pointers to the block is found. Since the block is still pointed at,
117 // the programmer could, at least in principle, have freed it before program exit.
telsoa01c577f2c2018-08-31 09:22:23 +0100118 // We want to test this in case memory is not freed as early as it could have been.
telsoa014fcda012018-03-09 14:13:49 +0000119 unsigned long reachableBefore = 0;
Keith Davis97da5e22020-03-05 16:25:28 +0000120 unsigned long reachableAfter = 0;
telsoa014fcda012018-03-09 14:13:49 +0000121
telsoa01c577f2c2018-08-31 09:22:23 +0100122 // Needed as out params but we don't test them.
Keith Davis97da5e22020-03-05 16:25:28 +0000123 unsigned long dubious = 0;
telsoa014fcda012018-03-09 14:13:49 +0000124 unsigned long suppressed = 0;
125
126 armnn::NetworkId networkIdentifier1 = 1;
127
128 // ensure that runtime is large enough before checking for memory leaks
129 // otherwise when loading the network it will automatically reserve memory that won't be released until destruction
telsoa01c577f2c2018-08-31 09:22:23 +0100130 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000131 armnn::Runtime runtime(options);
telsoa014fcda012018-03-09 14:13:49 +0000132 armnn::RuntimeLoadedNetworksReserve(&runtime);
133
telsoa014fcda012018-03-09 14:13:49 +0000134 {
Keith Davis97da5e22020-03-05 16:25:28 +0000135 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
telsoa014fcda012018-03-09 14:13:49 +0000136
137 std::unique_ptr<armnn::Network> mockNetwork1 = std::make_unique<armnn::Network>();
138 mockNetwork1->AddInputLayer(0, "test layer");
139
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000140 // Warm-up load/unload pair to put the runtime in a stable state (memory-wise).
telsoa01c577f2c2018-08-31 09:22:23 +0100141 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
Matteo Martincigh9326aab2018-11-15 10:54:54 +0000142 runtime.UnloadNetwork(networkIdentifier1);
143
144 // Checks for leaks before we load the network and record them so that we can see the delta after unloading.
145 VALGRIND_DO_QUICK_LEAK_CHECK;
146 VALGRIND_COUNT_LEAKS(leakedBefore, dubious, reachableBefore, suppressed);
147
148 // The actual test.
149 runtime.LoadNetwork(networkIdentifier1, Optimize(*mockNetwork1, backends, runtime.GetDeviceSpec()));
150 runtime.UnloadNetwork(networkIdentifier1);
151
152 VALGRIND_DO_ADDED_LEAK_CHECK;
153 VALGRIND_COUNT_LEAKS(leakedAfter, dubious, reachableAfter, suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000154 }
155
telsoa01c577f2c2018-08-31 09:22:23 +0100156 // If we're not running under Valgrind, these vars will have been initialised to 0, so this will always pass.
Keith Davis97da5e22020-03-05 16:25:28 +0000157 BOOST_TEST(leakedBefore == leakedAfter);
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100158 BOOST_TEST(reachableBefore == reachableAfter);
telsoa014fcda012018-03-09 14:13:49 +0000159
telsoa01c577f2c2018-08-31 09:22:23 +0100160 // These are needed because VALGRIND_COUNT_LEAKS is a macro that assigns to the parameters
161 // so they are assigned to, but still considered unused, causing a warning.
Jan Eilers8eb25602020-03-09 12:13:48 +0000162 IgnoreUnused(dubious);
163 IgnoreUnused(suppressed);
telsoa014fcda012018-03-09 14:13:49 +0000164}
Aron Virginas-Tarc26ba752018-10-22 13:32:01 +0100165#endif // WITH_VALGRIND
telsoa01c577f2c2018-08-31 09:22:23 +0100166
167BOOST_AUTO_TEST_CASE(RuntimeCpuRef)
168{
169 using namespace armnn;
170
171 // Create runtime in which test will run
172 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000173 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100174
175 // build up the structure of the network
176 INetworkPtr net(INetwork::Create());
177
178 IConnectableLayer* input = net->AddInputLayer(0);
179
180 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
181 NormalizationDescriptor descriptor;
182 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
183
184 IConnectableLayer* output = net->AddOutputLayer(0);
185
186 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
187 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
188
189 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
190 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
191
192 // optimize the network
David Beckf0b48452018-10-19 15:20:56 +0100193 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Keith Davis97da5e22020-03-05 16:25:28 +0000194 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100195
196 // Load it into the runtime. It should success.
197 armnn::NetworkId netId;
198 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
199}
200
201BOOST_AUTO_TEST_CASE(RuntimeFallbackToCpuRef)
202{
203 using namespace armnn;
204
205 // Create runtime in which test will run
206 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000207 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
telsoa01c577f2c2018-08-31 09:22:23 +0100208
209 // build up the structure of the network
210 INetworkPtr net(INetwork::Create());
211
212 IConnectableLayer* input = net->AddInputLayer(0);
213
214 // This layer configuration isn't supported by CpuAcc, should be fall back to CpuRef.
215 NormalizationDescriptor descriptor;
216 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
217
218 IConnectableLayer* output = net->AddOutputLayer(0);
219
220 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
221 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
222
223 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
224 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
225
226 // Allow fallback to CpuRef.
David Beckf0b48452018-10-19 15:20:56 +0100227 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc, armnn::Compute::CpuRef };
telsoa01c577f2c2018-08-31 09:22:23 +0100228 // optimize the network
Keith Davis97da5e22020-03-05 16:25:28 +0000229 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
telsoa01c577f2c2018-08-31 09:22:23 +0100230
231 // Load it into the runtime. It should succeed.
232 armnn::NetworkId netId;
233 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
234}
235
jimfly016b0b53d2018-10-08 14:43:01 +0100236BOOST_AUTO_TEST_CASE(IVGCVSW_1929_QuantizedSoftmaxIssue)
237{
238 // Test for issue reported by Chris Nix in https://jira.arm.com/browse/IVGCVSW-1929
239 using namespace armnn;
240
241 // Create runtime in which test will run
242 armnn::IRuntime::CreationOptions options;
Keith Davis97da5e22020-03-05 16:25:28 +0000243 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
jimfly016b0b53d2018-10-08 14:43:01 +0100244
245 // build up the structure of the network
246 INetworkPtr net(INetwork::Create());
Keith Davis97da5e22020-03-05 16:25:28 +0000247 armnn::IConnectableLayer* input = net->AddInputLayer(0,"input");
248 armnn::IConnectableLayer* softmax = net->AddSoftmaxLayer(armnn::SoftmaxDescriptor(), "softmax");
249 armnn::IConnectableLayer* output = net->AddOutputLayer(0, "output");
jimfly016b0b53d2018-10-08 14:43:01 +0100250
251 input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0));
252 softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0));
253
Keith Davis97da5e22020-03-05 16:25:28 +0000254 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
255 armnn::DataType::QAsymmU8,
256 1.0f / 255,
257 0));
jimfly016b0b53d2018-10-08 14:43:01 +0100258
Keith Davis97da5e22020-03-05 16:25:28 +0000259 softmax->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo(armnn::TensorShape({ 1, 5 }),
260 armnn::DataType::QAsymmU8));
jimfly016b0b53d2018-10-08 14:43:01 +0100261
Keith Davis97da5e22020-03-05 16:25:28 +0000262 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
263 std::vector<std::string> errMessages;
264 armnn::IOptimizedNetworkPtr optNet = Optimize(*net,
265 backends,
266 runtime->GetDeviceSpec(),
267 OptimizerOptions(),
268 errMessages);
David Beckf0b48452018-10-19 15:20:56 +0100269
jimfly016b0b53d2018-10-08 14:43:01 +0100270 BOOST_TEST(errMessages.size() == 1);
271 BOOST_TEST(errMessages[0] ==
272 "ERROR: output 0 of layer Softmax (softmax) is of type "
273 "Quantized 8 bit but its scale parameter has not been set");
274 BOOST_TEST(!optNet);
275}
276
Derek Lamberti836b27b2019-11-20 10:51:57 +0000277BOOST_AUTO_TEST_CASE(RuntimeBackendOptions)
278{
279 using namespace armnn;
280
281 IRuntime::CreationOptions creationOptions;
282 auto& backendOptions = creationOptions.m_BackendOptions;
283
284
285 // Define Options on explicit construction
286 BackendOptions options1("FakeBackend1",
Keith Davis97da5e22020-03-05 16:25:28 +0000287 {
288 { "Option1", 1.3f },
289 { "Option2", true }
290 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000291
292 // Add an option after construction
Keith Davis97da5e22020-03-05 16:25:28 +0000293 options1.AddOption({ "Option3", "some_value" });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000294
295 // Add the options to CreationOptions struct
296 backendOptions.push_back(options1);
297
298 // Add more Options via inplace explicit construction
Keith Davis97da5e22020-03-05 16:25:28 +0000299 backendOptions.emplace_back(BackendOptions{ "FakeBackend1",
300 {{ "Option4", 42 }}
301 });
Derek Lamberti836b27b2019-11-20 10:51:57 +0000302
303
304 // First group
305 BOOST_TEST(backendOptions[0].GetBackendId().Get() == "FakeBackend1");
306 BOOST_TEST(backendOptions[0].GetOption(0).GetName() == "Option1");
307 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().IsFloat() == true);
308 BOOST_TEST(backendOptions[0].GetOption(0).GetValue().AsFloat() == 1.3f);
309
310 BOOST_TEST(backendOptions[0].GetOption(1).GetName() == "Option2");
311 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().IsBool() == true);
312 BOOST_TEST(backendOptions[0].GetOption(1).GetValue().AsBool() == true);
313
314 BOOST_TEST(backendOptions[0].GetOption(2).GetName() == "Option3");
315 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().IsString() == true);
316 BOOST_TEST(backendOptions[0].GetOption(2).GetValue().AsString() == "some_value");
317
318 // Second group
319 BOOST_TEST(backendOptions[1].GetBackendId().Get() == "FakeBackend1");
320 BOOST_TEST(backendOptions[1].GetOption(0).GetName() == "Option4");
321 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().IsInt() == true);
322 BOOST_TEST(backendOptions[1].GetOption(0).GetValue().AsInt() == 42);
323}
324
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000325BOOST_AUTO_TEST_CASE(ProfilingDisable)
326{
327 using namespace armnn;
328
329 // Create runtime in which the test will run
330 armnn::IRuntime::CreationOptions options;
Sadik Armagan3184c902020-03-18 10:57:30 +0000331 armnn::Runtime runtime(options);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000332
333 // build up the structure of the network
334 INetworkPtr net(INetwork::Create());
335
336 IConnectableLayer* input = net->AddInputLayer(0);
337
338 // This layer configuration isn't supported by CpuAcc, should fall back to CpuRef.
339 NormalizationDescriptor descriptor;
340 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
341
342 IConnectableLayer* output = net->AddOutputLayer(0);
343
344 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
345 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
346
347 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
348 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
349
350 // optimize the network
351 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000352 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000353
354 // Load it into the runtime. It should succeed.
355 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000356 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000357
Sadik Armagan3184c902020-03-18 10:57:30 +0000358 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000359 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
360 auto readableBuffer = bufferManager.GetReadableBuffer();
361
362 // Profiling is not enabled, the post-optimisation structure should not be created
363 BOOST_TEST(!readableBuffer);
364}
365
366BOOST_AUTO_TEST_CASE(ProfilingEnableCpuRef)
367{
368 using namespace armnn;
369 using namespace armnn::profiling;
370
371 // Create runtime in which the test will run
372 armnn::IRuntime::CreationOptions options;
373 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100374 options.m_ProfilingOptions.m_TimelineEnabled = true;
375
Sadik Armagan3184c902020-03-18 10:57:30 +0000376 armnn::Runtime runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100377 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
378
379 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
380 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
381 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
382 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000383
384 // build up the structure of the network
385 INetworkPtr net(INetwork::Create());
386
387 IConnectableLayer* input = net->AddInputLayer(0, "input");
388
389 NormalizationDescriptor descriptor;
390 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
391
392 IConnectableLayer* output = net->AddOutputLayer(0, "output");
393
394 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
395 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
396
397 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
398 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
399
400 // optimize the network
401 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan3184c902020-03-18 10:57:30 +0000402 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000403
404 ProfilingGuid optNetGuid = optNet->GetGuid();
405
406 // Load it into the runtime. It should succeed.
407 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000408 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000409
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000410 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
411 auto readableBuffer = bufferManager.GetReadableBuffer();
412
413 // Profiling is enabled, the post-optimisation structure should be created
414 BOOST_CHECK(readableBuffer != nullptr);
415
416 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000417 BOOST_CHECK(size == 1068);
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
425 VerifyTimelineHeaderBinary(readableData, offset, 1060);
426
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000427 // Post-optimisation network
428 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000429 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset
430 );
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000431
432 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000433 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
434 EmptyOptional(),
435 optNetGuid,
436 LabelsAndEventClasses::NETWORK_GUID,
437 readableData,
438 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000439
440 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000441 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
442 EmptyOptional(),
443 EmptyOptional(),
444 LabelsAndEventClasses::TYPE_GUID,
445 readableData,
446 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000447
448 // Input layer
449 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000450 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000451
452 // Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000453 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000454
455 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000456 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
457 EmptyOptional(),
458 input->GetGuid(),
459 EmptyOptional(),
460 readableData,
461 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000462
463 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000464 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
465 EmptyOptional(),
466 EmptyOptional(),
467 LabelsAndEventClasses::NAME_GUID,
468 readableData,
469 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000470
471 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000472 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
473 EmptyOptional(),
474 input->GetGuid(),
475 EmptyOptional(),
476 readableData,
477 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000478
479 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000480 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
481 EmptyOptional(),
482 EmptyOptional(),
483 LabelsAndEventClasses::TYPE_GUID,
484 readableData,
485 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000486
487 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000488 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
489 EmptyOptional(),
490 optNetGuid,
491 input->GetGuid(),
492 readableData,
493 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000494
495 // Normalization layer
496 // Normalization layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000497 VerifyTimelineEntityBinaryPacketData(normalize->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000498
499 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000500 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "normalization", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000501
502 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000503 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
504 EmptyOptional(),
505 normalize->GetGuid(),
506 EmptyOptional(),
507 readableData,
508 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000509
510 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000511 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
512 EmptyOptional(),
513 EmptyOptional(),
514 LabelsAndEventClasses::NAME_GUID,
515 readableData,
516 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000517
518 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000519 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
520 EmptyOptional(),
521 normalize->GetGuid(),
522 EmptyOptional(),
523 readableData,
524 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000525
526 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000527 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
528 EmptyOptional(),
529 EmptyOptional(),
530 LabelsAndEventClasses::TYPE_GUID,
531 readableData,
532 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000533
534 // Network - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000535 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
536 EmptyOptional(),
537 optNetGuid,
538 normalize->GetGuid(),
539 readableData,
540 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000541
542 // Input layer - Normalize layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000543 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
544 EmptyOptional(),
545 input->GetGuid(),
546 normalize->GetGuid(),
547 readableData,
548 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000549
550 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000551 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
552 EmptyOptional(),
553 EmptyOptional(),
554 LabelsAndEventClasses::CONNECTION_GUID,
555 readableData,
556 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000557
558 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000559 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
560 EmptyOptional(),
561 EmptyOptional(),
562 LabelsAndEventClasses::TYPE_GUID,
563 readableData,
564 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000565
566 // Normalization workload
567 // Normalization workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000568 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000569
570 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000571 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
572 EmptyOptional(),
573 EmptyOptional(),
574 EmptyOptional(),
575 readableData,
576 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000577
578 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000579 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
580 EmptyOptional(),
581 EmptyOptional(),
582 LabelsAndEventClasses::TYPE_GUID,
583 readableData,
584 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000585
586 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000587 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
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(),
592 EmptyOptional(),
593 EmptyOptional(),
594 readableData,
595 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000596
597 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000598 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
599 EmptyOptional(),
600 EmptyOptional(),
601 LabelsAndEventClasses::BACKENDID_GUID,
602 readableData,
603 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000604
605 // Normalize layer - Normalize workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000606 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
607 EmptyOptional(),
608 normalize->GetGuid(),
609 EmptyOptional(),
610 readableData,
611 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000612
613 // Output layer
614 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000615 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000616
617 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000618 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000619
620 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000621 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
622 EmptyOptional(),
623 output->GetGuid(),
624 EmptyOptional(),
625 readableData,
626 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000627
628 // Name label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000629 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
630 EmptyOptional(),
631 EmptyOptional(),
632 LabelsAndEventClasses::NAME_GUID,
633 readableData,
634 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000635
636 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000637 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
638 EmptyOptional(),
639 output->GetGuid(),
640 EmptyOptional(),
641 readableData,
642 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000643
644 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000645 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
646 EmptyOptional(),
647 EmptyOptional(),
648 LabelsAndEventClasses::TYPE_GUID,
649 readableData,
650 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000651
652 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000653 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
654 EmptyOptional(),
655 optNetGuid,
656 output->GetGuid(),
657 readableData,
658 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000659
660 // Normalize layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000661 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
662 EmptyOptional(),
663 normalize->GetGuid(),
664 output->GetGuid(),
665 readableData,
666 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000667
668 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000669 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
670 EmptyOptional(),
671 EmptyOptional(),
672 LabelsAndEventClasses::CONNECTION_GUID,
673 readableData,
674 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000675
676 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000677 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
678 EmptyOptional(),
679 EmptyOptional(),
680 LabelsAndEventClasses::TYPE_GUID,
681 readableData,
682 offset);
Derek Lamberti836b27b2019-11-20 10:51:57 +0000683
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000684 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000685
686 // Creates structures for input & output.
687 std::vector<float> inputData(16);
688 std::vector<float> outputData(16);
689
Keith Davis97da5e22020-03-05 16:25:28 +0000690 InputTensors inputTensors
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000691 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000692 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000693 };
694 OutputTensors outputTensors
695 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000696 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000697 };
698
699 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000700 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000701
Finn Williamsb6a402f2020-03-24 13:46:22 +0000702 // Get readable buffer for input workload
703 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
704 BOOST_CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000705
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000706 // Get readable buffer for output workload
707 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
708 BOOST_CHECK(outputReadableBuffer != nullptr);
709
Finn Williamsb6a402f2020-03-24 13:46:22 +0000710 // Get readable buffer for inference timeline
711 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
712 BOOST_CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000713
714 // Validate input workload data
715 size = inputReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000716 BOOST_CHECK(size == 204);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000717
718 readableData = inputReadableBuffer->GetReadableData();
719 BOOST_CHECK(readableData != nullptr);
720
721 offset = 0;
722
Keith Davis97da5e22020-03-05 16:25:28 +0000723 // Verify Header
724 VerifyTimelineHeaderBinary(readableData, offset, 196);
725
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000726 // Input workload
727 // Input workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000728 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000729
730 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000731 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
732 EmptyOptional(),
733 EmptyOptional(),
734 EmptyOptional(),
735 readableData,
736 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000737
738 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000739 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
740 EmptyOptional(),
741 EmptyOptional(),
742 LabelsAndEventClasses::TYPE_GUID,
743 readableData,
744 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000745
746 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000747 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000748
749 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000750 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
751 EmptyOptional(),
752 EmptyOptional(),
753 EmptyOptional(),
754 readableData,
755 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000756
757 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000758 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
759 EmptyOptional(),
760 EmptyOptional(),
761 LabelsAndEventClasses::BACKENDID_GUID,
762 readableData,
763 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000764
765 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000766 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
767 EmptyOptional(),
768 input->GetGuid(),
769 EmptyOptional(),
770 readableData,
771 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000772
773 bufferManager.MarkRead(inputReadableBuffer);
774
775 // Validate output workload data
776 size = outputReadableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000777 BOOST_CHECK(size == 204);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000778
779 readableData = outputReadableBuffer->GetReadableData();
780 BOOST_CHECK(readableData != nullptr);
781
782 offset = 0;
783
Keith Davis97da5e22020-03-05 16:25:28 +0000784 // Verify Header
785 VerifyTimelineHeaderBinary(readableData, offset, 196);
786
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000787 // Output workload
788 // Output workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000789 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000790
791 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000792 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
793 EmptyOptional(),
794 EmptyOptional(),
795 EmptyOptional(),
796 readableData,
797 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000798
799 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000800 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
801 EmptyOptional(),
802 EmptyOptional(),
803 LabelsAndEventClasses::TYPE_GUID,
804 readableData,
805 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000806
807 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000808 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "CpuRef", readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000809
810 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000811 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
812 EmptyOptional(),
813 EmptyOptional(),
814 EmptyOptional(),
815 readableData,
816 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000817
818 // BackendId label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000819 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
820 EmptyOptional(),
821 EmptyOptional(),
822 LabelsAndEventClasses::BACKENDID_GUID,
823 readableData,
824 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000825
826 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000827 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
828 EmptyOptional(),
829 output->GetGuid(),
830 EmptyOptional(),
831 readableData,
832 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000833
834 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000835
836 // Validate inference data
837 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000838 unsigned int threadId_size = sizeof(std::thread::id); // Is platform dependent
839 BOOST_CHECK(size == 1208 + 8 * threadId_size);
David Monahan6198fe02019-12-02 08:35:43 +0000840
841 readableData = inferenceReadableBuffer->GetReadableData();
842 BOOST_CHECK(readableData != nullptr);
843
844 offset = 0;
845
Keith Davis97da5e22020-03-05 16:25:28 +0000846 // Verify Header
Jan Eilersa10e2a22020-03-26 12:04:54 +0000847 VerifyTimelineHeaderBinary(readableData, offset, 1200 + 8 * threadId_size);
Keith Davis97da5e22020-03-05 16:25:28 +0000848
David Monahan6198fe02019-12-02 08:35:43 +0000849 // Inference timeline trace
850 // Inference entity
Keith Davis97da5e22020-03-05 16:25:28 +0000851 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000852
853 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000854 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
855 EmptyOptional(),
856 EmptyOptional(),
857 LabelsAndEventClasses::INFERENCE_GUID,
858 readableData,
859 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000860
861 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000862 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
863 EmptyOptional(),
864 EmptyOptional(),
865 LabelsAndEventClasses::TYPE_GUID,
866 readableData,
867 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000868
869 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000870 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
871 EmptyOptional(),
872 optNetGuid,
873 EmptyOptional(),
874 readableData,
875 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000876
877 // Start Inference life
878 // Event packet - timeline, threadId, eventGuid
879 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
880
881 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000882 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
883 EmptyOptional(),
884 EmptyOptional(),
885 EmptyOptional(),
886 readableData,
887 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000888
889 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000890 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
891 EmptyOptional(),
892 EmptyOptional(),
893 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
894 readableData,
895 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000896
897 // Execution
898 // Input workload execution
899 // Input workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000900 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000901
902 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000903 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
904 EmptyOptional(),
905 EmptyOptional(),
906 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
907 readableData,
908 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000909
910 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000911 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
912 EmptyOptional(),
913 EmptyOptional(),
914 LabelsAndEventClasses::TYPE_GUID,
915 readableData,
916 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000917
918 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000919 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
920 EmptyOptional(),
921 EmptyOptional(),
922 EmptyOptional(),
923 readableData,
924 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000925
926 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000927 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
928 EmptyOptional(),
929 EmptyOptional(),
930 EmptyOptional(),
931 readableData,
932 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000933
934 // Start Input workload execution life
935 // Event packet - timeline, threadId, eventGuid
936 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
937
938 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000939 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
940 EmptyOptional(),
941 EmptyOptional(),
942 EmptyOptional(),
943 readableData,
944 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000945
946 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000947 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
948 EmptyOptional(),
949 EmptyOptional(),
950 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
951 readableData,
952 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000953
954 // End of Input workload execution life
955 // Event packet - timeline, threadId, eventGuid
956 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
957
958 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000959 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
960 EmptyOptional(),
961 EmptyOptional(),
962 EmptyOptional(),
963 readableData,
964 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000965
966 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000967 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
968 EmptyOptional(),
969 EmptyOptional(),
970 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
971 readableData,
972 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000973
974 // Normalize workload execution
975 // Normalize workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000976 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000977
978 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000979 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
980 EmptyOptional(),
981 EmptyOptional(),
982 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
983 readableData,
984 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000985
986 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000987 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
988 EmptyOptional(),
989 EmptyOptional(),
990 LabelsAndEventClasses::TYPE_GUID,
991 readableData,
992 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000993
994 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000995 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
996 EmptyOptional(),
997 EmptyOptional(),
998 EmptyOptional(),
999 readableData,
1000 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001001
1002 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001003 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1004 EmptyOptional(),
1005 EmptyOptional(),
1006 EmptyOptional(),
1007 readableData,
1008 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001009
1010 // Start Normalize workload execution life
1011 // Event packet - timeline, threadId, eventGuid
1012 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1013
1014 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001015 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1016 EmptyOptional(),
1017 EmptyOptional(),
1018 EmptyOptional(),
1019 readableData,
1020 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001021
1022 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001023 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1024 EmptyOptional(),
1025 EmptyOptional(),
1026 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1027 readableData,
1028 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001029
1030 // End of Normalize workload execution life
1031 // Event packet - timeline, threadId, eventGuid
1032 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1033
1034 // Normalize workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001035 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1036 EmptyOptional(),
1037 EmptyOptional(),
1038 EmptyOptional(),
1039 readableData,
1040 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001041
1042 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001043 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1044 EmptyOptional(),
1045 EmptyOptional(),
1046 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1047 readableData,
1048 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001049
1050 // Output workload execution
1051 // Output workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +00001052 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001053
1054 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001055 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1056 EmptyOptional(),
1057 EmptyOptional(),
1058 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1059 readableData,
1060 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001061
1062 // Type label relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001063 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1064 EmptyOptional(),
1065 EmptyOptional(),
1066 LabelsAndEventClasses::TYPE_GUID,
1067 readableData,
1068 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001069
1070 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001071 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1072 EmptyOptional(),
1073 EmptyOptional(),
1074 EmptyOptional(),
1075 readableData,
1076 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001077
1078 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001079 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1080 EmptyOptional(),
1081 EmptyOptional(),
1082 EmptyOptional(),
1083 readableData,
1084 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001085
1086 // Start Output workload execution life
1087 // Event packet - timeline, threadId, eventGuid
1088 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1089
1090 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001091 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1092 EmptyOptional(),
1093 EmptyOptional(),
1094 EmptyOptional(),
1095 readableData,
1096 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001097
1098 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001099 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1100 EmptyOptional(),
1101 EmptyOptional(),
1102 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1103 readableData,
1104 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001105
1106 // End of Normalize workload execution life
1107 // Event packet - timeline, threadId, eventGuid
1108 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1109
1110 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001111 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1112 EmptyOptional(),
1113 EmptyOptional(),
1114 EmptyOptional(),
1115 readableData,
1116 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001117
1118 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001119 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1120 EmptyOptional(),
1121 EmptyOptional(),
1122 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1123 readableData,
1124 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001125
1126 // End of Inference life
1127 // Event packet - timeline, threadId, eventGuid
1128 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1129
1130 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001131 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1132 EmptyOptional(),
1133 EmptyOptional(),
1134 EmptyOptional(),
1135 readableData,
1136 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001137
1138 // Event - event class relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001139 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
1140 EmptyOptional(),
1141 EmptyOptional(),
1142 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1143 readableData,
1144 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001145
1146 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001147}
1148
1149BOOST_AUTO_TEST_CASE(ProfilingPostOptimisationStructureCpuRef)
1150{
1151 VerifyPostOptimisationStructureTestImpl(armnn::Compute::CpuRef);
1152}
1153
telsoa014fcda012018-03-09 14:13:49 +00001154BOOST_AUTO_TEST_SUITE_END()