IVGCVSW-4317 Implement the Profiling Context Initialisation
* Call CreateBackendProfilingContext on each backend from Runtime passing
an instance of the BackendProfiling interface.
* Modify the signature of CreateBackendProfilingContext to remove const
and return a shared_ptr to BackendProfilingContext
* Add concrete BackendProfiling class.
* Store BackendProfilingContexts in Profiling service.
Signed-off-by: Colm Donelan <Colm.Donelan@arm.com>
Change-Id: I975eaa2093ae91fa623835f65f9e5b25eb65117a
diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp
index 47c998a..c1416f9 100644
--- a/src/armnn/Runtime.cpp
+++ b/src/armnn/Runtime.cpp
@@ -16,6 +16,7 @@
#include <iostream>
#include <boost/polymorphic_cast.hpp>
+#include <backends/BackendProfiling.hpp>
using namespace armnn;
using namespace std;
@@ -181,6 +182,19 @@
m_BackendContexts.emplace(std::make_pair(id, std::move(context)));
}
supportedBackends.emplace(id);
+
+ unique_ptr<armnn::profiling::IBackendProfiling> profilingIface =
+ std::make_unique<armnn::profiling::BackendProfiling>(armnn::profiling::BackendProfiling(
+ options, armnn::profiling::ProfilingService::Instance(), id));
+
+ // Backends may also provide a profiling context. Ask for it now.
+ auto profilingContext = backend->CreateBackendProfilingContext(options, profilingIface);
+ // Backends that don't support profiling will return a null profiling context.
+ if (profilingContext)
+ {
+ // Pass the context onto the profiling service.
+ armnn::profiling::ProfilingService::Instance().AddBackendProfilingContext(id, profilingContext);
+ }
}
catch (const BackendUnavailableException&)
{
@@ -230,9 +244,11 @@
}
}
+
// Clear all dynamic backends.
DynamicBackendUtils::DeregisterDynamicBackends(m_DeviceSpec.GetDynamicBackends());
m_DeviceSpec.ClearDynamicBackends();
+ m_BackendContexts.clear();
}
LoadedNetwork* Runtime::GetLoadedNetworkPtr(NetworkId networkId) const
diff --git a/src/backends/backendsCommon/IBackendInternal.cpp b/src/backends/backendsCommon/IBackendInternal.cpp
index c86d026..a9d5a54 100644
--- a/src/backends/backendsCommon/IBackendInternal.cpp
+++ b/src/backends/backendsCommon/IBackendInternal.cpp
@@ -45,7 +45,7 @@
}
IBackendInternal::IBackendProfilingContextPtr IBackendInternal::CreateBackendProfilingContext(
- const IRuntime::CreationOptions&, armnn::profiling::IBackendProfiling&) const
+ const IRuntime::CreationOptions&, IBackendProfilingPtr&)
{
return IBackendProfilingContextPtr{};
}
diff --git a/src/backends/backendsCommon/test/MockBackend.cpp b/src/backends/backendsCommon/test/MockBackend.cpp
index d8f8cfe..ac99738 100644
--- a/src/backends/backendsCommon/test/MockBackend.cpp
+++ b/src/backends/backendsCommon/test/MockBackend.cpp
@@ -99,7 +99,7 @@
}
IBackendInternal::IBackendProfilingContextPtr MockBackend::CreateBackendProfilingContext(
- const IRuntime::CreationOptions&, armnn::profiling::IBackendProfiling&) const
+ const IRuntime::CreationOptions&, IBackendProfilingPtr&)
{
return IBackendProfilingContextPtr{};
}
diff --git a/src/backends/backendsCommon/test/MockBackend.hpp b/src/backends/backendsCommon/test/MockBackend.hpp
index 3fe3100..d1a0082 100644
--- a/src/backends/backendsCommon/test/MockBackend.hpp
+++ b/src/backends/backendsCommon/test/MockBackend.hpp
@@ -5,14 +5,15 @@
#pragma once
+#include <LayerSupportCommon.hpp>
#include <armnn/backends/IBackendInternal.hpp>
#include <armnn/backends/OptimizationViews.hpp>
-#include <LayerSupportCommon.hpp>
#include <backendsCommon/LayerSupportBase.hpp>
namespace armnn
{
+
class MockBackend : public IBackendInternal
{
public:
@@ -20,17 +21,20 @@
~MockBackend() = default;
static const BackendId& GetIdStatic();
- const BackendId& GetId() const override { return GetIdStatic(); }
+ const BackendId& GetId() const override
+ {
+ return GetIdStatic();
+ }
IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
- IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
- const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
+ IBackendInternal::IWorkloadFactoryPtr
+ CreateWorkloadFactory(const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
- IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
- const IRuntime::CreationOptions& creationOptions,
- armnn::profiling::IBackendProfiling& backendProfiling) const override;
+ IBackendInternal::IBackendProfilingContextPtr
+ CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
+ IBackendProfilingPtr& backendProfiling) override;
IBackendInternal::Optimizations GetOptimizations() const override;
IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
@@ -38,7 +42,8 @@
OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const override;
};
-class MockLayerSupport : public LayerSupportBase {
+class MockLayerSupport : public LayerSupportBase
+{
public:
bool IsInputSupported(const TensorInfo& /*input*/,
Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
@@ -47,7 +52,7 @@
}
bool IsOutputSupported(const TensorInfo& /*input*/,
- Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
+ Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
{
return true;
}
@@ -71,4 +76,4 @@
}
};
-} // namespace armnn
+} // namespace armnn
diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp
index 8e839ae..f662754 100644
--- a/src/backends/cl/ClBackend.cpp
+++ b/src/backends/cl/ClBackend.cpp
@@ -75,8 +75,7 @@
}
IBackendInternal::IBackendProfilingContextPtr ClBackend::CreateBackendProfilingContext(
- const IRuntime::CreationOptions&,
- armnn::profiling::IBackendProfiling&) const
+ const IRuntime::CreationOptions&, IBackendProfilingPtr&)
{
return IBackendProfilingContextPtr{};
}
diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp
index 703ae17..e85c616 100644
--- a/src/backends/cl/ClBackend.hpp
+++ b/src/backends/cl/ClBackend.hpp
@@ -31,8 +31,8 @@
void RegisterTensorHandleFactories(TensorHandleFactoryRegistry& registry) override;
IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
- IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(const IRuntime::CreationOptions&,
- armnn::profiling::IBackendProfiling&) const override;
+ IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
+ const IRuntime::CreationOptions&, IBackendProfilingPtr& backendProfiling) override;
IBackendInternal::Optimizations GetOptimizations() const override;
IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp
index 1d48297..4201ba8 100644
--- a/src/backends/neon/NeonBackend.cpp
+++ b/src/backends/neon/NeonBackend.cpp
@@ -62,8 +62,7 @@
}
IBackendInternal::IBackendProfilingContextPtr NeonBackend::CreateBackendProfilingContext(
- const IRuntime::CreationOptions&,
- armnn::profiling::IBackendProfiling&) const
+ const IRuntime::CreationOptions&, IBackendProfilingPtr&)
{
return IBackendProfilingContextPtr{};
}
diff --git a/src/backends/neon/NeonBackend.hpp b/src/backends/neon/NeonBackend.hpp
index b1eeeb6..ad4ac8d 100644
--- a/src/backends/neon/NeonBackend.hpp
+++ b/src/backends/neon/NeonBackend.hpp
@@ -27,8 +27,8 @@
class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const override;
IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
- IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(const IRuntime::CreationOptions&,
- armnn::profiling::IBackendProfiling&) const override;
+ IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
+ const IRuntime::CreationOptions&, IBackendProfilingPtr& backendProfiling) override;
IBackendInternal::Optimizations GetOptimizations() const override;
IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp
index d006c72..584ce78 100644
--- a/src/backends/reference/RefBackend.cpp
+++ b/src/backends/reference/RefBackend.cpp
@@ -49,7 +49,7 @@
}
IBackendInternal::IBackendProfilingContextPtr RefBackend::CreateBackendProfilingContext(
- const IRuntime::CreationOptions&, armnn::profiling::IBackendProfiling&) const
+ const IRuntime::CreationOptions&, IBackendProfilingPtr&)
{
return IBackendProfilingContextPtr{};
}
diff --git a/src/backends/reference/RefBackend.hpp b/src/backends/reference/RefBackend.hpp
index e647b75..92d392d 100644
--- a/src/backends/reference/RefBackend.hpp
+++ b/src/backends/reference/RefBackend.hpp
@@ -29,8 +29,7 @@
IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
- const IRuntime::CreationOptions& creationOptions,
- armnn::profiling::IBackendProfiling& backendProfiling) const override;
+ const IRuntime::CreationOptions& creationOptions, IBackendProfilingPtr& backendProfiling) override;
IBackendInternal::Optimizations GetOptimizations() const override;
IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
diff --git a/src/profiling/ProfilingService.cpp b/src/profiling/ProfilingService.cpp
index 926e54a..5cee477 100644
--- a/src/profiling/ProfilingService.cpp
+++ b/src/profiling/ProfilingService.cpp
@@ -391,6 +391,7 @@
// ...finally reset the profiling state machine
m_StateMachine.Reset();
+ m_BackendProfilingContexts.clear();
}
void ProfilingService::Stop()
diff --git a/src/profiling/ProfilingService.hpp b/src/profiling/ProfilingService.hpp
index e510589..4438952 100644
--- a/src/profiling/ProfilingService.hpp
+++ b/src/profiling/ProfilingService.hpp
@@ -22,6 +22,7 @@
#include "SendCounterPacket.hpp"
#include "SendTimelinePacket.hpp"
#include "TimelinePacketWriterFactory.hpp"
+#include <armnn/backends/profiling/IBackendProfilingContext.hpp>
namespace armnn
{
@@ -63,6 +64,13 @@
// Disconnects the profiling service from the external server
void Disconnect();
+ // Store a profiling context returned from a backend that support profiling.
+ void AddBackendProfilingContext(const BackendId backendId,
+ std::shared_ptr<armnn::profiling::IBackendProfilingContext> profilingContext)
+ {
+ m_BackendProfilingContexts.emplace(backendId, std::move(profilingContext));
+ }
+
const ICounterDirectory& GetCounterDirectory() const;
ICounterRegistry& GetCounterRegistry();
ProfilingState GetCurrentState() const;
@@ -132,6 +140,8 @@
PerJobCounterSelectionCommandHandler m_PerJobCounterSelectionCommandHandler;
ProfilingGuidGenerator m_GuidGenerator;
TimelinePacketWriterFactory m_TimelinePacketWriterFactory;
+ std::unordered_map<BackendId,
+ std::shared_ptr<armnn::profiling::IBackendProfilingContext>> m_BackendProfilingContexts;
protected:
// Default constructor/destructor kept protected for testing
diff --git a/src/profiling/backends/BackendProfiling.cpp b/src/profiling/backends/BackendProfiling.cpp
new file mode 100644
index 0000000..a49122a
--- /dev/null
+++ b/src/profiling/backends/BackendProfiling.cpp
@@ -0,0 +1,48 @@
+//
+// Copyright © 2020 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "BackendProfiling.hpp"
+#include "RegisterBackendCounters.hpp"
+
+namespace armnn
+{
+
+namespace profiling
+{
+
+std::unique_ptr<IRegisterBackendCounters>
+ BackendProfiling::GetCounterRegistrationInterface(uint16_t currentMaxGlobalCounterID)
+{
+ return std::make_unique<RegisterBackendCounters>(RegisterBackendCounters(currentMaxGlobalCounterID, m_backendId));
+}
+
+std::unique_ptr<ISendTimelinePacket> BackendProfiling::GetSendTimelinePacket()
+{
+ return m_ProfilingService.GetSendTimelinePacket();
+}
+
+IProfilingGuidGenerator& BackendProfiling::GetProfilingGuidGenerator()
+{
+ // The profiling service is our Guid Generator.
+ return m_ProfilingService;
+}
+
+CounterStatus BackendProfiling::GetCounterStatus(uint16_t)
+{
+ return CounterStatus();
+}
+
+std::vector<CounterStatus> BackendProfiling::GetActiveCounters()
+{
+ return std::vector<CounterStatus>();
+}
+
+bool BackendProfiling::IsProfilingEnabled() const
+{
+ return m_ProfilingService.IsProfilingEnabled();
+}
+
+} // namespace profiling
+} // namespace armnn
diff --git a/src/profiling/backends/BackendProfiling.hpp b/src/profiling/backends/BackendProfiling.hpp
new file mode 100644
index 0000000..2bc365a
--- /dev/null
+++ b/src/profiling/backends/BackendProfiling.hpp
@@ -0,0 +1,49 @@
+//
+// Copyright © 2020 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <ProfilingService.hpp>
+#include <armnn/backends/profiling/IBackendProfiling.hpp>
+
+namespace armnn
+{
+
+namespace profiling
+{
+
+class BackendProfiling : public IBackendProfiling
+{
+public:
+ BackendProfiling(const IRuntime::CreationOptions& options, ProfilingService& profilingService, const BackendId& id)
+ : m_options(options)
+ , m_ProfilingService(profilingService)
+ , m_backendId(id)
+ {}
+
+ ~BackendProfiling()
+ {}
+
+ std::unique_ptr<IRegisterBackendCounters>
+ GetCounterRegistrationInterface(uint16_t currentMaxGlobalCounterID) override;
+
+ std::unique_ptr<ISendTimelinePacket> GetSendTimelinePacket() override;
+
+ IProfilingGuidGenerator& GetProfilingGuidGenerator() override;
+
+ void ReportCounters(const std::vector<Timestamp>&) override
+ {}
+
+ CounterStatus GetCounterStatus(uint16_t backendCounterId) override;
+
+ std::vector<CounterStatus> GetActiveCounters() override;
+
+ bool IsProfilingEnabled() const override;
+
+private:
+ IRuntime::CreationOptions m_options;
+ ProfilingService& m_ProfilingService;
+ BackendId m_backendId;
+};
+} // namespace profiling
+} // namespace armnn
\ No newline at end of file