blob: b07465f077a906883ef8bd80a6cb3aa641dde1b0 [file] [log] [blame]
Keith Davis02356de2019-08-26 18:28:17 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "ProfilingService.hpp"
7
Keith Davise394bd92019-12-02 15:12:19 +00008#include <armnn/BackendId.hpp>
Derek Lamberti08446972019-11-26 16:38:31 +00009#include <armnn/Logging.hpp>
10
Matteo Martincigha84edee2019-10-02 12:50:57 +010011#include <boost/format.hpp>
12
Keith Davis02356de2019-08-26 18:28:17 +010013namespace armnn
14{
15
16namespace profiling
17{
18
Matteo Martincigha84edee2019-10-02 12:50:57 +010019void ProfilingService::ResetExternalProfilingOptions(const ExternalProfilingOptions& options,
20 bool resetProfilingService)
Keith Davis02356de2019-08-26 18:28:17 +010021{
Matteo Martincigha84edee2019-10-02 12:50:57 +010022 // Update the profiling options
23 m_Options = options;
Keith Davis02356de2019-08-26 18:28:17 +010024
Matteo Martincigh54fb9572019-10-02 12:50:57 +010025 // Check if the profiling service needs to be reset
Matteo Martincigha84edee2019-10-02 12:50:57 +010026 if (resetProfilingService)
Keith Davis02356de2019-08-26 18:28:17 +010027 {
Matteo Martincigha84edee2019-10-02 12:50:57 +010028 // Reset the profiling service
Matteo Martincigh54fb9572019-10-02 12:50:57 +010029 Reset();
Keith Davis02356de2019-08-26 18:28:17 +010030 }
31}
32
Keith Davise394bd92019-12-02 15:12:19 +000033bool ProfilingService::IsProfilingEnabled()
34{
35 return m_Options.m_EnableProfiling;
36}
37
Jim Flynn672d06e2019-10-15 10:18:11 +010038ProfilingState ProfilingService::ConfigureProfilingService(
39 const ExternalProfilingOptions& options,
40 bool resetProfilingService)
41{
42 ResetExternalProfilingOptions(options, resetProfilingService);
43 ProfilingState currentState = m_StateMachine.GetCurrentState();
44 if (options.m_EnableProfiling)
45 {
46 switch (currentState)
47 {
48 case ProfilingState::Uninitialised:
49 Update(); // should transition to NotConnected
50 Update(); // will either stay in NotConnected because there is no server
51 // or will enter WaitingForAck.
52 currentState = m_StateMachine.GetCurrentState();
53 if (currentState == ProfilingState::WaitingForAck)
54 {
55 Update(); // poke it again to send out the metadata packet
56 }
57 currentState = m_StateMachine.GetCurrentState();
58 return currentState;
59 case ProfilingState::NotConnected:
60 Update(); // will either stay in NotConnected because there is no server
61 // or will enter WaitingForAck
62 currentState = m_StateMachine.GetCurrentState();
63 if (currentState == ProfilingState::WaitingForAck)
64 {
65 Update(); // poke it again to send out the metadata packet
66 }
67 currentState = m_StateMachine.GetCurrentState();
68 return currentState;
69 default:
70 return currentState;
71 }
72 }
73 else
74 {
75 // Make sure profiling is shutdown
76 switch (currentState)
77 {
78 case ProfilingState::Uninitialised:
79 case ProfilingState::NotConnected:
80 return currentState;
81 default:
82 Stop();
83 return m_StateMachine.GetCurrentState();
84 }
85 }
86}
87
Matteo Martincigh54fb9572019-10-02 12:50:57 +010088void ProfilingService::Update()
Keith Davis02356de2019-08-26 18:28:17 +010089{
Matteo Martincigh54fb9572019-10-02 12:50:57 +010090 if (!m_Options.m_EnableProfiling)
Matteo Martincigha84edee2019-10-02 12:50:57 +010091 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010092 // Don't run if profiling is disabled
93 return;
Matteo Martincigha84edee2019-10-02 12:50:57 +010094 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +010095
96 ProfilingState currentState = m_StateMachine.GetCurrentState();
97 switch (currentState)
Keith Davis02356de2019-08-26 18:28:17 +010098 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010099 case ProfilingState::Uninitialised:
janeil01811ca552019-12-03 17:01:32 +0000100
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100101 // Initialize the profiling service
102 Initialize();
103
104 // Move to the next state
105 m_StateMachine.TransitionToState(ProfilingState::NotConnected);
106 break;
107 case ProfilingState::NotConnected:
Matteo Martincighd0613b52019-10-09 16:47:04 +0100108 // Stop the command thread (if running)
109 m_CommandHandler.Stop();
110
111 // Stop the send thread (if running)
Sadik Armagan3896b472020-02-10 12:24:15 +0000112 m_SendThread.Stop(false);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100113
Matteo Martincighe8485382019-10-10 14:08:21 +0100114 // Stop the periodic counter capture thread (if running)
115 m_PeriodicCounterCapture.Stop();
116
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100117 // Reset any existing profiling connection
118 m_ProfilingConnection.reset();
119
Sadik Armaganbd9e2c52019-09-26 23:13:31 +0100120 try
Keith Davis02356de2019-08-26 18:28:17 +0100121 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100122 // Setup the profiling connection
Matteo Martincighd0613b52019-10-09 16:47:04 +0100123 BOOST_ASSERT(m_ProfilingConnectionFactory);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100124 m_ProfilingConnection = m_ProfilingConnectionFactory->GetProfilingConnection(m_Options);
Keith Davis02356de2019-08-26 18:28:17 +0100125 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100126 catch (const Exception& e)
Sadik Armaganbd9e2c52019-09-26 23:13:31 +0100127 {
Derek Lamberti08446972019-11-26 16:38:31 +0000128 ARMNN_LOG(warning) << "An error has occurred when creating the profiling connection: "
129 << e.what();
Sadik Armaganbd9e2c52019-09-26 23:13:31 +0100130 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100131
132 // Move to the next state
133 m_StateMachine.TransitionToState(m_ProfilingConnection
134 ? ProfilingState::WaitingForAck // Profiling connection obtained, wait for ack
135 : ProfilingState::NotConnected); // Profiling connection failed, stay in the
136 // "NotConnected" state
137 break;
138 case ProfilingState::WaitingForAck:
139 BOOST_ASSERT(m_ProfilingConnection);
140
141 // Start the command thread
142 m_CommandHandler.Start(*m_ProfilingConnection);
143
144 // Start the send thread, while in "WaitingForAck" state it'll send out a "Stream MetaData" packet waiting for
145 // a valid "Connection Acknowledged" packet confirming the connection
Sadik Armagan3896b472020-02-10 12:24:15 +0000146 m_SendThread.Start(*m_ProfilingConnection);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100147
148 // The connection acknowledged command handler will automatically transition the state to "Active" once a
149 // valid "Connection Acknowledged" packet has been received
150
151 break;
152 case ProfilingState::Active:
153
Matteo Martincighe8485382019-10-10 14:08:21 +0100154 // The period counter capture thread is started by the Periodic Counter Selection command handler upon
155 // request by an external profiling service
156
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100157 break;
158 default:
159 throw RuntimeException(boost::str(boost::format("Unknown profiling service state: %1")
160 % static_cast<int>(currentState)));
Sadik Armaganbd9e2c52019-09-26 23:13:31 +0100161 }
Keith Davis02356de2019-08-26 18:28:17 +0100162}
163
Jim Flynn53e46992019-10-14 12:31:10 +0100164void ProfilingService::Disconnect()
165{
166 ProfilingState currentState = m_StateMachine.GetCurrentState();
167 switch (currentState)
168 {
169 case ProfilingState::Uninitialised:
170 case ProfilingState::NotConnected:
171 case ProfilingState::WaitingForAck:
172 return; // NOP
173 case ProfilingState::Active:
174 // Stop the command thread (if running)
175 Stop();
176
177 break;
178 default:
179 throw RuntimeException(boost::str(boost::format("Unknown profiling service state: %1")
180 % static_cast<int>(currentState)));
181 }
182}
183
David Monahanc1536d62020-02-12 15:52:35 +0000184// Store a profiling context returned from a backend that support profiling, and register its counters
185void ProfilingService::AddBackendProfilingContext(const BackendId backendId,
186 std::shared_ptr<armnn::profiling::IBackendProfilingContext> profilingContext)
187{
188 BOOST_ASSERT(profilingContext != nullptr);
189 // Register the backend counters
190 m_MaxGlobalCounterId = profilingContext->RegisterCounters(m_MaxGlobalCounterId);
191 m_BackendProfilingContexts.emplace(backendId, std::move(profilingContext));
192}
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +0100193const ICounterDirectory& ProfilingService::GetCounterDirectory() const
194{
195 return m_CounterDirectory;
196}
197
Jim Flynn97897022020-02-02 12:52:59 +0000198ICounterRegistry& ProfilingService::GetCounterRegistry()
199{
200 return m_CounterDirectory;
201}
202
Matteo Martincigha84edee2019-10-02 12:50:57 +0100203ProfilingState ProfilingService::GetCurrentState() const
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +0100204{
Matteo Martincigha84edee2019-10-02 12:50:57 +0100205 return m_StateMachine.GetCurrentState();
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +0100206}
207
208uint16_t ProfilingService::GetCounterCount() const
209{
210 return m_CounterDirectory.GetCounterCount();
211}
212
Matteo Martincighe8485382019-10-10 14:08:21 +0100213bool ProfilingService::IsCounterRegistered(uint16_t counterUid) const
214{
215 return counterUid < m_CounterIndex.size();
216}
217
Matteo Martincigha84edee2019-10-02 12:50:57 +0100218uint32_t ProfilingService::GetCounterValue(uint16_t counterUid) const
Keith Davis02356de2019-08-26 18:28:17 +0100219{
Matteo Martincighe8485382019-10-10 14:08:21 +0100220 CheckCounterUid(counterUid);
Matteo Martincigha84edee2019-10-02 12:50:57 +0100221 std::atomic<uint32_t>* counterValuePtr = m_CounterIndex.at(counterUid);
222 BOOST_ASSERT(counterValuePtr);
223 return counterValuePtr->load(std::memory_order::memory_order_relaxed);
Keith Davis02356de2019-08-26 18:28:17 +0100224}
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +0100225
Jim Flynn8e0c7a62020-01-30 14:10:55 +0000226const ICounterMappings& ProfilingService::GetCounterMappings() const
227{
228 return m_CounterIdMap;
229}
230
Jim Flynn97897022020-02-02 12:52:59 +0000231IRegisterCounterMapping& ProfilingService::GetCounterMappingRegistry()
Jim Flynn8e0c7a62020-01-30 14:10:55 +0000232{
233 return m_CounterIdMap;
234}
235
James Conroy2dcd3fe2020-02-06 18:34:52 +0000236CaptureData ProfilingService::GetCaptureData()
237{
238 return m_Holder.GetCaptureData();
239}
240
Finn Williams032bc742020-02-12 11:02:34 +0000241void ProfilingService::SetCaptureData(uint32_t capturePeriod,
242 const std::vector<uint16_t>& counterIds,
243 const std::set<BackendId>& activeBackends)
James Conroy2dcd3fe2020-02-06 18:34:52 +0000244{
Finn Williams032bc742020-02-12 11:02:34 +0000245 m_Holder.SetCaptureData(capturePeriod, counterIds, activeBackends);
James Conroy2dcd3fe2020-02-06 18:34:52 +0000246}
247
Matteo Martincigha84edee2019-10-02 12:50:57 +0100248void ProfilingService::SetCounterValue(uint16_t counterUid, uint32_t value)
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +0100249{
Matteo Martincighe8485382019-10-10 14:08:21 +0100250 CheckCounterUid(counterUid);
Matteo Martincigha84edee2019-10-02 12:50:57 +0100251 std::atomic<uint32_t>* counterValuePtr = m_CounterIndex.at(counterUid);
252 BOOST_ASSERT(counterValuePtr);
253 counterValuePtr->store(value, std::memory_order::memory_order_relaxed);
254}
255
256uint32_t ProfilingService::AddCounterValue(uint16_t counterUid, uint32_t value)
257{
Matteo Martincighe8485382019-10-10 14:08:21 +0100258 CheckCounterUid(counterUid);
Matteo Martincigha84edee2019-10-02 12:50:57 +0100259 std::atomic<uint32_t>* counterValuePtr = m_CounterIndex.at(counterUid);
260 BOOST_ASSERT(counterValuePtr);
261 return counterValuePtr->fetch_add(value, std::memory_order::memory_order_relaxed);
262}
263
264uint32_t ProfilingService::SubtractCounterValue(uint16_t counterUid, uint32_t value)
265{
Matteo Martincighe8485382019-10-10 14:08:21 +0100266 CheckCounterUid(counterUid);
Matteo Martincigha84edee2019-10-02 12:50:57 +0100267 std::atomic<uint32_t>* counterValuePtr = m_CounterIndex.at(counterUid);
268 BOOST_ASSERT(counterValuePtr);
269 return counterValuePtr->fetch_sub(value, std::memory_order::memory_order_relaxed);
270}
271
272uint32_t ProfilingService::IncrementCounterValue(uint16_t counterUid)
273{
Matteo Martincighe8485382019-10-10 14:08:21 +0100274 CheckCounterUid(counterUid);
Matteo Martincigha84edee2019-10-02 12:50:57 +0100275 std::atomic<uint32_t>* counterValuePtr = m_CounterIndex.at(counterUid);
276 BOOST_ASSERT(counterValuePtr);
277 return counterValuePtr->operator++(std::memory_order::memory_order_relaxed);
278}
279
Jim Flynn00f3aaf2019-10-24 11:58:06 +0100280ProfilingDynamicGuid ProfilingService::NextGuid()
281{
282 return m_GuidGenerator.NextGuid();
283}
284
285ProfilingStaticGuid ProfilingService::GenerateStaticId(const std::string& str)
286{
287 return m_GuidGenerator.GenerateStaticId(str);
288}
289
Jim Flynn8b200652019-10-24 18:07:44 +0100290std::unique_ptr<ISendTimelinePacket> ProfilingService::GetSendTimelinePacket() const
291{
292 return m_TimelinePacketWriterFactory.GetSendTimelinePacket();
293}
294
Matteo Martincigha84edee2019-10-02 12:50:57 +0100295void ProfilingService::Initialize()
296{
Matteo Martincigha84edee2019-10-02 12:50:57 +0100297 // Register a category for the basic runtime counters
298 if (!m_CounterDirectory.IsCategoryRegistered("ArmNN_Runtime"))
299 {
300 m_CounterDirectory.RegisterCategory("ArmNN_Runtime");
301 }
302
Keith Davise394bd92019-12-02 15:12:19 +0000303 // Register a counter for the number of Network loads
304 if (!m_CounterDirectory.IsCounterRegistered("Network loads"))
Matteo Martincigha84edee2019-10-02 12:50:57 +0100305 {
306 const Counter* loadedNetworksCounter =
Keith Davise394bd92019-12-02 15:12:19 +0000307 m_CounterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
308 armnn::profiling::NETWORK_LOADS,
309 "ArmNN_Runtime",
Matteo Martincigha84edee2019-10-02 12:50:57 +0100310 0,
311 0,
312 1.f,
Keith Davise394bd92019-12-02 15:12:19 +0000313 "Network loads",
Matteo Martincigha84edee2019-10-02 12:50:57 +0100314 "The number of networks loaded at runtime",
315 std::string("networks"));
316 BOOST_ASSERT(loadedNetworksCounter);
317 InitializeCounterValue(loadedNetworksCounter->m_Uid);
318 }
Keith Davise394bd92019-12-02 15:12:19 +0000319 // Register a counter for the number of unloaded networks
320 if (!m_CounterDirectory.IsCounterRegistered("Network unloads"))
Matteo Martincigha84edee2019-10-02 12:50:57 +0100321 {
Keith Davise394bd92019-12-02 15:12:19 +0000322 const Counter* unloadedNetworksCounter =
323 m_CounterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
324 armnn::profiling::NETWORK_UNLOADS,
325 "ArmNN_Runtime",
Matteo Martincigha84edee2019-10-02 12:50:57 +0100326 0,
327 0,
328 1.f,
Keith Davise394bd92019-12-02 15:12:19 +0000329 "Network unloads",
330 "The number of networks unloaded at runtime",
331 std::string("networks"));
332 BOOST_ASSERT(unloadedNetworksCounter);
333 InitializeCounterValue(unloadedNetworksCounter->m_Uid);
334 }
335 // Register a counter for the number of registered backends
336 if (!m_CounterDirectory.IsCounterRegistered("Backends registered"))
337 {
338 const Counter* registeredBackendsCounter =
339 m_CounterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
340 armnn::profiling::REGISTERED_BACKENDS,
341 "ArmNN_Runtime",
342 0,
343 0,
344 1.f,
345 "Backends registered",
Matteo Martincigha84edee2019-10-02 12:50:57 +0100346 "The number of registered backends",
347 std::string("backends"));
348 BOOST_ASSERT(registeredBackendsCounter);
349 InitializeCounterValue(registeredBackendsCounter->m_Uid);
350 }
Keith Davise394bd92019-12-02 15:12:19 +0000351 // Register a counter for the number of registered backends
352 if (!m_CounterDirectory.IsCounterRegistered("Backends unregistered"))
353 {
354 const Counter* unregisteredBackendsCounter =
355 m_CounterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
356 armnn::profiling::UNREGISTERED_BACKENDS,
357 "ArmNN_Runtime",
358 0,
359 0,
360 1.f,
361 "Backends unregistered",
362 "The number of unregistered backends",
363 std::string("backends"));
364 BOOST_ASSERT(unregisteredBackendsCounter);
365 InitializeCounterValue(unregisteredBackendsCounter->m_Uid);
366 }
Matteo Martincigha84edee2019-10-02 12:50:57 +0100367 // Register a counter for the number of inferences run
368 if (!m_CounterDirectory.IsCounterRegistered("Inferences run"))
369 {
370 const Counter* inferencesRunCounter =
Keith Davise394bd92019-12-02 15:12:19 +0000371 m_CounterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
372 armnn::profiling::INFERENCES_RUN,
373 "ArmNN_Runtime",
Matteo Martincigha84edee2019-10-02 12:50:57 +0100374 0,
375 0,
376 1.f,
377 "Inferences run",
378 "The number of inferences run",
379 std::string("inferences"));
380 BOOST_ASSERT(inferencesRunCounter);
381 InitializeCounterValue(inferencesRunCounter->m_Uid);
382 }
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +0100383}
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +0100384
Matteo Martincigha84edee2019-10-02 12:50:57 +0100385void ProfilingService::InitializeCounterValue(uint16_t counterUid)
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +0100386{
Matteo Martincigha84edee2019-10-02 12:50:57 +0100387 // Increase the size of the counter index if necessary
388 if (counterUid >= m_CounterIndex.size())
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +0100389 {
Matteo Martincigha84edee2019-10-02 12:50:57 +0100390 m_CounterIndex.resize(boost::numeric_cast<size_t>(counterUid) + 1);
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +0100391 }
Matteo Martincigha84edee2019-10-02 12:50:57 +0100392
393 // Create a new atomic counter and add it to the list
394 m_CounterValues.emplace_back(0);
395
396 // Register the new counter to the counter index for quick access
397 std::atomic<uint32_t>* counterValuePtr = &(m_CounterValues.back());
398 m_CounterIndex.at(counterUid) = counterValuePtr;
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +0100399}
400
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100401void ProfilingService::Reset()
402{
Matteo Martincigh8d9590e2019-10-15 09:35:29 +0100403 // Stop the profiling service...
Jim Flynn53e46992019-10-14 12:31:10 +0100404 Stop();
Matteo Martincigh8d9590e2019-10-15 09:35:29 +0100405
Jim Flynn53e46992019-10-14 12:31:10 +0100406 // ...then delete all the counter data and configuration...
407 m_CounterIndex.clear();
408 m_CounterValues.clear();
409 m_CounterDirectory.Clear();
Jim Flynn97897022020-02-02 12:52:59 +0000410 m_CounterIdMap.Reset();
Finn Williams09ad6f92019-12-19 17:05:18 +0000411 m_BufferManager.Reset();
Matteo Martincighd0613b52019-10-09 16:47:04 +0100412
Jim Flynn53e46992019-10-14 12:31:10 +0100413 // ...finally reset the profiling state machine
414 m_StateMachine.Reset();
Colm Donelan1aff3932020-02-05 17:48:59 +0000415 m_BackendProfilingContexts.clear();
David Monahanc1536d62020-02-12 15:52:35 +0000416 m_MaxGlobalCounterId = armnn::profiling::INFERENCES_RUN;
Jim Flynn53e46992019-10-14 12:31:10 +0100417}
418
419void ProfilingService::Stop()
420{
Matteo Martincighd0613b52019-10-09 16:47:04 +0100421 // The order in which we reset/stop the components is not trivial!
Finn Williams09ad6f92019-12-19 17:05:18 +0000422 // First stop the producing threads
423 // Command Handler first as it is responsible for launching then Periodic Counter capture thread
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100424 m_CommandHandler.Stop();
Matteo Martincighe8485382019-10-10 14:08:21 +0100425 m_PeriodicCounterCapture.Stop();
Finn Williams09ad6f92019-12-19 17:05:18 +0000426 // The the consuming thread
Sadik Armagan3896b472020-02-10 12:24:15 +0000427 m_SendThread.Stop(false);
Matteo Martincighd0613b52019-10-09 16:47:04 +0100428
Matteo Martincigh8d9590e2019-10-15 09:35:29 +0100429 // ...then close and destroy the profiling connection...
Jim Flynn53e46992019-10-14 12:31:10 +0100430 if (m_ProfilingConnection != nullptr && m_ProfilingConnection->IsOpen())
431 {
432 m_ProfilingConnection->Close();
433 }
Matteo Martincighd0613b52019-10-09 16:47:04 +0100434 m_ProfilingConnection.reset();
435
Matteo Martincigh8d9590e2019-10-15 09:35:29 +0100436 // ...then move to the "NotConnected" state
Jim Flynn53e46992019-10-14 12:31:10 +0100437 m_StateMachine.TransitionToState(ProfilingState::NotConnected);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100438}
439
Matteo Martincighe8485382019-10-10 14:08:21 +0100440inline void ProfilingService::CheckCounterUid(uint16_t counterUid) const
441{
442 if (!IsCounterRegistered(counterUid))
443 {
444 throw InvalidArgumentException(boost::str(boost::format("Counter UID %1% is not registered") % counterUid));
445 }
446}
447
janeil01811ca552019-12-03 17:01:32 +0000448ProfilingService::~ProfilingService()
449{
450 Stop();
451}
452
Keith Davis02356de2019-08-26 18:28:17 +0100453} // namespace profiling
454
Matteo Martincigha84edee2019-10-02 12:50:57 +0100455} // namespace armnn