From d4dfa684941a21314b70593d01b0fc2167eebad4 Mon Sep 17 00:00:00 2001 From: David Beck Date: Wed, 24 Oct 2018 17:09:46 +0100 Subject: IVGCVSW-2056 + IVGCVSW-2064 : move ClContextControl to the ClBackend Change-Id: Ice19d3f763298bc14585267df389e99df846320d --- CMakeLists.txt | 1 + include/armnn/ArmNN.hpp | 1 + include/armnn/IBackend.hpp | 22 ++++++ include/armnn/Types.hpp | 16 +---- src/armnn/LayerSupport.cpp | 2 +- src/armnn/LoadedNetwork.cpp | 8 ++- src/armnn/LoadedNetwork.hpp | 3 +- src/armnn/Runtime.cpp | 52 +++++--------- src/armnn/Runtime.hpp | 12 ++-- src/backends/BackendContextRegistry.cpp | 17 +++++ src/backends/BackendContextRegistry.hpp | 27 +++++++ src/backends/BackendRegistry.hpp | 4 +- src/backends/CMakeLists.txt | 3 + src/backends/IBackendContext.hpp | 27 +++++++ src/backends/IBackendInternal.hpp | 5 +- src/backends/LayerSupportRegistry.hpp | 6 +- src/backends/RegistryCommon.hpp | 20 +++++- src/backends/WorkloadFactory.cpp | 2 +- src/backends/cl/CMakeLists.txt | 27 +++---- src/backends/cl/ClBackend.cpp | 7 +- src/backends/cl/ClBackend.hpp | 4 +- src/backends/cl/ClBackendContext.cpp | 111 +++++++++++++++++++++++++++++ src/backends/cl/ClBackendContext.hpp | 23 ++++++ src/backends/cl/ClLayerSupport.cpp | 2 +- src/backends/cl/backend.mk | 2 + src/backends/common.mk | 2 + src/backends/neon/CMakeLists.txt | 23 +++--- src/backends/neon/NeonBackend.cpp | 4 +- src/backends/neon/NeonBackend.hpp | 4 +- src/backends/neon/NeonLayerSupport.cpp | 2 +- src/backends/neon/backend.mk | 1 + src/backends/reference/CMakeLists.txt | 1 + src/backends/reference/RefBackend.cpp | 4 +- src/backends/reference/RefBackend.hpp | 4 +- src/backends/reference/RefLayerSupport.cpp | 2 +- src/backends/reference/backend.mk | 1 + src/backends/test/BackendRegistryTests.cpp | 8 +-- 37 files changed, 338 insertions(+), 122 deletions(-) create mode 100644 include/armnn/IBackend.hpp create mode 100644 src/backends/BackendContextRegistry.cpp create mode 100644 src/backends/BackendContextRegistry.hpp create mode 100644 src/backends/IBackendContext.hpp create mode 100644 src/backends/cl/ClBackendContext.cpp create mode 100644 src/backends/cl/ClBackendContext.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 257a49d192..b33d4b6738 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,7 @@ list(APPEND armnn_sources include/armnn/ILayerSupport.hpp include/armnn/INetwork.hpp include/armnn/IProfiler.hpp + include/armnn/IBackend.hpp include/armnn/IRuntime.hpp include/armnn/LayerSupport.hpp include/armnn/LstmParams.hpp diff --git a/include/armnn/ArmNN.hpp b/include/armnn/ArmNN.hpp index f03b79d1ca..a9bb451931 100644 --- a/include/armnn/ArmNN.hpp +++ b/include/armnn/ArmNN.hpp @@ -7,6 +7,7 @@ #include "BackendId.hpp" #include "Descriptors.hpp" #include "Exceptions.hpp" +#include "IBackend.hpp" #include "IRuntime.hpp" #include "INetwork.hpp" #include "LayerSupport.hpp" diff --git a/include/armnn/IBackend.hpp b/include/armnn/IBackend.hpp new file mode 100644 index 0000000000..34df91c803 --- /dev/null +++ b/include/armnn/IBackend.hpp @@ -0,0 +1,22 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "BackendId.hpp" + +namespace armnn +{ + +class IBackend +{ +protected: + IBackend() {} + virtual ~IBackend() {} + +public: + virtual const BackendId& GetId() const = 0; +}; + +} // namespace armnn \ No newline at end of file diff --git a/include/armnn/Types.hpp b/include/armnn/Types.hpp index cd6e17be37..2249a365d2 100644 --- a/include/armnn/Types.hpp +++ b/include/armnn/Types.hpp @@ -139,20 +139,6 @@ enum class OutputShapeRounding Ceiling = 1 }; -/// Each backend should implement an IBackend. -class IBackend -{ -protected: - IBackend() {} - virtual ~IBackend() {} - -public: - virtual const BackendId& GetId() const = 0; -}; - -using IBackendSharedPtr = std::shared_ptr; -using IBackendUniquePtr = std::unique_ptr; - /// Device specific knowledge to be passed to the optimizer. class IDeviceSpec { @@ -222,4 +208,6 @@ private: /// Define LayerGuid type. using LayerGuid = unsigned int; +struct EmptyInitializer {}; + } // namespace armnn diff --git a/src/armnn/LayerSupport.cpp b/src/armnn/LayerSupport.cpp index 846da6086e..249c8f4654 100644 --- a/src/armnn/LayerSupport.cpp +++ b/src/armnn/LayerSupport.cpp @@ -39,7 +39,7 @@ void CopyErrorMessage(char* truncatedString, const char* fullString, size_t maxL bool isSupported; \ try { \ auto factoryFunc = LayerSupportRegistryInstance().GetFactory(backendId); \ - auto layerSupportObject = factoryFunc(); \ + auto layerSupportObject = factoryFunc(EmptyInitializer()); \ isSupported = layerSupportObject->func(__VA_ARGS__, Optional(reasonIfUnsupportedFull)); \ CopyErrorMessage(reasonIfUnsupported, reasonIfUnsupportedFull.c_str(), reasonIfUnsupportedMaxLength); \ } catch (InvalidArgumentException e) { \ diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp index 40137779f6..616a0327fe 100644 --- a/src/armnn/LoadedNetwork.cpp +++ b/src/armnn/LoadedNetwork.cpp @@ -38,6 +38,7 @@ std::string ToErrorMessage(const char * prefix, const ExceptionType & error) } // anonymous std::unique_ptr LoadedNetwork::MakeLoadedNetwork(std::unique_ptr net, + const IRuntime::CreationOptions& options, std::string & errorMessage) { std::unique_ptr loadedNetwork; @@ -52,7 +53,7 @@ std::unique_ptr LoadedNetwork::MakeLoadedNetwork(std::unique_ptr< try { - loadedNetwork.reset(new LoadedNetwork(std::move(net))); + loadedNetwork.reset(new LoadedNetwork(std::move(net), options)); } catch (const armnn::RuntimeException& error) { @@ -70,7 +71,8 @@ std::unique_ptr LoadedNetwork::MakeLoadedNetwork(std::unique_ptr< return loadedNetwork; } -LoadedNetwork::LoadedNetwork(std::unique_ptr net) +LoadedNetwork::LoadedNetwork(std::unique_ptr net, + const IRuntime::CreationOptions& options) : m_OptimizedNetwork(std::move(net)) , m_WorkingMemLock(m_WorkingMemMutex, std::defer_lock) { @@ -89,7 +91,7 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr net) if (m_Backends.count(backend) == 0) { auto createBackend = BackendRegistryInstance().GetFactory(backend); - auto it = m_Backends.emplace(std::make_pair(backend, createBackend())); + auto it = m_Backends.emplace(std::make_pair(backend, createBackend(EmptyInitializer()))); m_WorkloadFactories.emplace(std::make_pair(backend, it.first->second->CreateWorkloadFactory())); } diff --git a/src/armnn/LoadedNetwork.hpp b/src/armnn/LoadedNetwork.hpp index 51eb04f3df..21de1440f1 100644 --- a/src/armnn/LoadedNetwork.hpp +++ b/src/armnn/LoadedNetwork.hpp @@ -40,6 +40,7 @@ public: Status EnqueueWorkload(const InputTensors& inputTensors, const OutputTensors& outputTensors); static std::unique_ptr MakeLoadedNetwork(std::unique_ptr net, + const IRuntime::CreationOptions& options, std::string & errorMessage); // NOTE we return by reference as the purpose of this method is only to provide @@ -51,7 +52,7 @@ public: void FreeWorkingMemory(); private: - LoadedNetwork(std::unique_ptr net); + LoadedNetwork(std::unique_ptr net, const IRuntime::CreationOptions& options); void EnqueueInput(const BindableLayer& layer, ITensorHandle* tensorHandle, const TensorInfo& tensorInfo); diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp index e84cbe0a60..a0aca6ebc7 100644 --- a/src/armnn/Runtime.cpp +++ b/src/armnn/Runtime.cpp @@ -6,15 +6,10 @@ #include #include +#include #include -#ifdef ARMCOMPUTECL_ENABLED -#include -#include -#include -#endif - #include #include @@ -57,6 +52,7 @@ Status Runtime::LoadNetwork(NetworkId& networkIdOut, IOptimizedNetwork* rawNetwork = inNetwork.release(); unique_ptr loadedNetwork = LoadedNetwork::MakeLoadedNetwork( std::unique_ptr(boost::polymorphic_downcast(rawNetwork)), + m_Options, errorMessage); if (!loadedNetwork) @@ -78,24 +74,6 @@ Status Runtime::LoadNetwork(NetworkId& networkIdOut, Status Runtime::UnloadNetwork(NetworkId networkId) { -#ifdef ARMCOMPUTECL_ENABLED - if (arm_compute::CLScheduler::get().context()() != NULL) - { - // Waits for all queued CL requests to finish before unloading the network they may be using. - try - { - // Coverity fix: arm_compute::CLScheduler::sync() may throw an exception of type cl::Error. - arm_compute::CLScheduler::get().sync(); - } - catch (const cl::Error&) - { - BOOST_LOG_TRIVIAL(warning) << "WARNING: Runtime::UnloadNetwork(): an error occurred while waiting for " - "the queued CL requests to finish"; - return Status::Failure; - } - } -#endif - { std::lock_guard lockGuard(m_Mutex); @@ -104,14 +82,6 @@ Status Runtime::UnloadNetwork(NetworkId networkId) BOOST_LOG_TRIVIAL(warning) << "WARNING: Runtime::UnloadNetwork(): " << networkId << " not found!"; return Status::Failure; } - -#ifdef ARMCOMPUTECL_ENABLED - if (arm_compute::CLScheduler::get().context()() != NULL && m_LoadedNetworks.empty()) - { - // There are no loaded networks left, so clear the CL cache to free up memory - m_ClContextControl.ClearClCache(); - } -#endif } BOOST_LOG_TRIVIAL(debug) << "Runtime::UnloadNetwork(): Unloaded network with ID: " << networkId; @@ -131,12 +101,26 @@ const std::shared_ptr Runtime::GetProfiler(NetworkId networkId) const } Runtime::Runtime(const CreationOptions& options) - : m_ClContextControl(options.m_GpuAccTunedParameters.get(), - options.m_EnableGpuProfiling) + : m_Options{options} , m_NetworkIdCounter(0) , m_DeviceSpec{BackendRegistryInstance().GetBackendIds()} { BOOST_LOG_TRIVIAL(info) << "ArmNN v" << ARMNN_VERSION << "\n"; + + for (const auto& id : BackendContextRegistryInstance().GetBackendIds()) + { + // Store backend contexts for the supported ones + if (m_DeviceSpec.GetSupportedBackends().count(id) > 0) + { + // Don't throw an exception, rather return a dummy factory if not + // found. + auto factoryFun = BackendContextRegistryInstance().GetFactory( + id, [](const CreationOptions&) { return IBackendContextUniquePtr(); } + ); + + m_BackendContexts.emplace(std::make_pair(id, factoryFun(options))); + } + } } Runtime::~Runtime() diff --git a/src/armnn/Runtime.hpp b/src/armnn/Runtime.hpp index 29bb6808d8..2679e3cc98 100644 --- a/src/armnn/Runtime.hpp +++ b/src/armnn/Runtime.hpp @@ -9,7 +9,8 @@ #include #include #include -#include +#include +#include #include #include @@ -85,14 +86,13 @@ private: } mutable std::mutex m_Mutex; - std::unordered_map> m_LoadedNetworks; - - ClContextControl m_ClContextControl; - + CreationOptions m_Options; int m_NetworkIdCounter; - DeviceSpec m_DeviceSpec; + + using BackendContextMap = std::unordered_map; + BackendContextMap m_BackendContexts; }; } diff --git a/src/backends/BackendContextRegistry.cpp b/src/backends/BackendContextRegistry.cpp new file mode 100644 index 0000000000..0168a127af --- /dev/null +++ b/src/backends/BackendContextRegistry.cpp @@ -0,0 +1,17 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "BackendContextRegistry.hpp" + +namespace armnn +{ + +BackendContextRegistry& BackendContextRegistryInstance() +{ + static BackendContextRegistry instance; + return instance; +} + +} // namespace armnn diff --git a/src/backends/BackendContextRegistry.hpp b/src/backends/BackendContextRegistry.hpp new file mode 100644 index 0000000000..c48d5b2c4b --- /dev/null +++ b/src/backends/BackendContextRegistry.hpp @@ -0,0 +1,27 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include +#include +#include "RegistryCommon.hpp" +#include "IBackendContext.hpp" + +namespace armnn +{ + +using BackendContextRegistry = RegistryCommon; + +BackendContextRegistry& BackendContextRegistryInstance(); + +template <> +struct RegisteredTypeName +{ + static const char * Name() { return "IBackendContext"; } +}; + +} // namespace armnn diff --git a/src/backends/BackendRegistry.hpp b/src/backends/BackendRegistry.hpp index 4465e95174..8f8ad37481 100644 --- a/src/backends/BackendRegistry.hpp +++ b/src/backends/BackendRegistry.hpp @@ -11,7 +11,9 @@ namespace armnn { -using BackendRegistry = RegistryCommon; +using BackendRegistry = RegistryCommon; BackendRegistry& BackendRegistryInstance(); diff --git a/src/backends/CMakeLists.txt b/src/backends/CMakeLists.txt index 045bd2ac27..843e567201 100644 --- a/src/backends/CMakeLists.txt +++ b/src/backends/CMakeLists.txt @@ -4,11 +4,14 @@ # list(APPEND armnnBackendsCommon_sources + BackendContextRegistry.cpp + BackendContextRegistry.hpp BackendRegistry.cpp BackendRegistry.hpp CpuTensorHandle.cpp CpuTensorHandleFwd.hpp CpuTensorHandle.hpp + IBackendContext.hpp IBackendInternal.hpp ILayerSupport.cpp ITensorHandle.hpp diff --git a/src/backends/IBackendContext.hpp b/src/backends/IBackendContext.hpp new file mode 100644 index 0000000000..d073d12868 --- /dev/null +++ b/src/backends/IBackendContext.hpp @@ -0,0 +1,27 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include +#include + +namespace armnn +{ + +class IBackendContext +{ +public: + virtual ~IBackendContext() {} + +protected: + IBackendContext(const IRuntime::CreationOptions& options) {} + +private: + IBackendContext() = delete; +}; + +using IBackendContextUniquePtr = std::unique_ptr; + +} // namespace armnn diff --git a/src/backends/IBackendInternal.hpp b/src/backends/IBackendInternal.hpp index 7e44dbd676..a24b60064a 100644 --- a/src/backends/IBackendInternal.hpp +++ b/src/backends/IBackendInternal.hpp @@ -4,7 +4,8 @@ // #pragma once -#include +#include +#include namespace armnn { @@ -13,8 +14,6 @@ class IWorkloadFactory; class IBackendInternal : public IBackend { protected: - // Creation must be done through a specific - // backend interface. IBackendInternal() = default; public: diff --git a/src/backends/LayerSupportRegistry.hpp b/src/backends/LayerSupportRegistry.hpp index a5efad05ef..6124685032 100644 --- a/src/backends/LayerSupportRegistry.hpp +++ b/src/backends/LayerSupportRegistry.hpp @@ -6,11 +6,13 @@ #include "RegistryCommon.hpp" #include +#include namespace armnn { - -using LayerSupportRegistry = RegistryCommon; +using LayerSupportRegistry = RegistryCommon; LayerSupportRegistry& LayerSupportRegistryInstance(); diff --git a/src/backends/RegistryCommon.hpp b/src/backends/RegistryCommon.hpp index 616a63bd53..044a9e4250 100644 --- a/src/backends/RegistryCommon.hpp +++ b/src/backends/RegistryCommon.hpp @@ -21,11 +21,11 @@ struct RegisteredTypeName static const char * Name() { return "UNKNOWN"; } }; -template +template class RegistryCommon { public: - using FactoryFunction = std::function; + using FactoryFunction = std::function; void Register(const BackendId& id, FactoryFunction factory) { @@ -52,6 +52,20 @@ public: return it->second; } + FactoryFunction GetFactory(const BackendId& id, + FactoryFunction defaultFactory) const + { + auto it = m_Factories.find(id); + if (it == m_Factories.end()) + { + return defaultFactory; + } + else + { + return it->second; + } + } + size_t Size() const { return m_Factories.size(); @@ -116,4 +130,4 @@ struct StaticRegistryInitializer } }; -} // namespace armnn +} // namespace armnn \ No newline at end of file diff --git a/src/backends/WorkloadFactory.cpp b/src/backends/WorkloadFactory.cpp index fea383f030..2e7a24f732 100644 --- a/src/backends/WorkloadFactory.cpp +++ b/src/backends/WorkloadFactory.cpp @@ -64,7 +64,7 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, auto const& layerSupportRegistry = LayerSupportRegistryInstance(); auto layerSupportFactory = layerSupportRegistry.GetFactory(backendId); - auto layerSupportObject = layerSupportFactory(); + auto layerSupportObject = layerSupportFactory(EmptyInitializer()); switch(layer.GetType()) { diff --git a/src/backends/cl/CMakeLists.txt b/src/backends/cl/CMakeLists.txt index 7182332956..a0f1e4d9cc 100644 --- a/src/backends/cl/CMakeLists.txt +++ b/src/backends/cl/CMakeLists.txt @@ -3,18 +3,23 @@ # SPDX-License-Identifier: MIT # +list(APPEND armnnClBackend_sources + ClBackendId.hpp + ClLayerSupport.cpp + ClLayerSupport.hpp + ClWorkloadFactory.cpp + ClWorkloadFactory.hpp +) + if(ARMCOMPUTECL) list(APPEND armnnClBackend_sources + ClBackendContext.cpp + ClBackendContext.hpp ClBackend.cpp ClBackend.hpp - ClBackendId.hpp ClContextControl.cpp ClContextControl.hpp - ClLayerSupport.cpp - ClLayerSupport.hpp ClTensorHandle.hpp - ClWorkloadFactory.cpp - ClWorkloadFactory.hpp OpenClTimer.cpp OpenClTimer.hpp ) @@ -24,20 +29,10 @@ if(ARMCOMPUTECL) if(BUILD_UNIT_TESTS) add_subdirectory(test) endif() - -else() - list(APPEND armnnClBackend_sources - ClBackendId.hpp - ClContextControl.cpp - ClContextControl.hpp - ClLayerSupport.cpp - ClLayerSupport.hpp - ClWorkloadFactory.cpp - ClWorkloadFactory.hpp - ) endif() add_library(armnnClBackend OBJECT ${armnnClBackend_sources}) target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src) target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn) target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils) + diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp index d6a3a89391..da91de8e48 100644 --- a/src/backends/cl/ClBackend.cpp +++ b/src/backends/cl/ClBackend.cpp @@ -8,8 +8,7 @@ #include "ClWorkloadFactory.hpp" #include - -#include +#include namespace armnn { @@ -21,13 +20,13 @@ static StaticRegistryInitializer g_RegisterHelper { BackendRegistryInstance(), ClBackend::GetIdStatic(), - []() + [](const EmptyInitializer&) { return IBackendInternalUniquePtr(new ClBackend); } }; -} +} // anonymous namespace const BackendId& ClBackend::GetIdStatic() { diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp index 4eae6c92ec..201702eee3 100644 --- a/src/backends/cl/ClBackend.hpp +++ b/src/backends/cl/ClBackend.hpp @@ -12,8 +12,8 @@ namespace armnn class ClBackend : public IBackendInternal { public: - ClBackend() = default; - ~ClBackend() = default; + ClBackend() = default; + ~ClBackend() override = default; static const BackendId& GetIdStatic(); const BackendId& GetId() const override { return GetIdStatic(); } diff --git a/src/backends/cl/ClBackendContext.cpp b/src/backends/cl/ClBackendContext.cpp new file mode 100644 index 0000000000..4d1be33fc6 --- /dev/null +++ b/src/backends/cl/ClBackendContext.cpp @@ -0,0 +1,111 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ClBackendContext.hpp" +#include "ClBackendId.hpp" +#include "ClContextControl.hpp" + +#include +#include + +#include + +#ifdef ARMCOMPUTECL_ENABLED +// Needed for the CL scheduler calls +#include +#include +#include +#endif + +namespace armnn +{ + +namespace +{ + +static StaticRegistryInitializer g_RegisterHelper +{ + BackendContextRegistryInstance(), + ClBackendId(), + [](const IRuntime::CreationOptions& options) + { + return IBackendContextUniquePtr(new ClBackendContext{options}); + } +}; + +static std::mutex g_ContextControlMutex; + +std::shared_ptr +GetContextControlWrapper(const IRuntime::CreationOptions& options) +{ + static std::weak_ptr contextControlWrapper; + + std::lock_guard lockGuard(g_ContextControlMutex); + std::shared_ptr result; + + if (contextControlWrapper.expired()) + { + result = std::make_shared(options); + contextControlWrapper = result; + } + else + { + result = contextControlWrapper.lock(); + } + + return result; +} + +} // anonymous namespace + + +#ifdef ARMCOMPUTECL_ENABLED +struct ClBackendContext::ContextControlWrapper +{ + ContextControlWrapper(const IRuntime::CreationOptions& options) + : m_ClContextControl{options.m_GpuAccTunedParameters.get(), + options.m_EnableGpuProfiling} + { + } + + ~ContextControlWrapper() + { + if (arm_compute::CLScheduler::get().context()() != NULL) + { + // Waits for all queued CL requests to finish before unloading the network they may be using. + try + { + // Coverity fix: arm_compute::CLScheduler::sync() may throw an exception of type cl::Error. + arm_compute::CLScheduler::get().sync(); + m_ClContextControl.ClearClCache(); + } + catch (const cl::Error&) + { + BOOST_LOG_TRIVIAL(warning) << "WARNING: Runtime::UnloadNetwork(): an error occurred while waiting for " + "the queued CL requests to finish"; + } + } + } + + ClContextControl m_ClContextControl; +}; +#else //ARMCOMPUTECL_ENABLED +struct ClBackendContext::ContextControlWrapper +{ + ContextControlWrapper(const IRuntime::CreationOptions&){} +}; +#endif //ARMCOMPUTECL_ENABLED + +ClBackendContext::ClBackendContext(const IRuntime::CreationOptions& options) +: IBackendContext{options} +, m_ContextControl{GetContextControlWrapper(options)} +{ +} + +ClBackendContext::~ClBackendContext() +{ +} + +} // namespace armnn \ No newline at end of file diff --git a/src/backends/cl/ClBackendContext.hpp b/src/backends/cl/ClBackendContext.hpp new file mode 100644 index 0000000000..3df403efc5 --- /dev/null +++ b/src/backends/cl/ClBackendContext.hpp @@ -0,0 +1,23 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include + +namespace armnn +{ + +class ClBackendContext : public IBackendContext +{ +public: + ClBackendContext(const IRuntime::CreationOptions& options); + ~ClBackendContext() override; + + struct ContextControlWrapper; +private: + std::shared_ptr m_ContextControl; +}; + +} // namespace armnn \ No newline at end of file diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index 6c5704d7ab..ebb90a5abf 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -53,7 +53,7 @@ ILayerSupportSharedPtr GetLayerSupportPointer() static StaticRegistryInitializer g_RegisterHelper{ LayerSupportRegistryInstance(), ClBackendId(), - []() + [](const EmptyInitializer&) { return GetLayerSupportPointer(); } diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk index 97df8e4903..8433240ae9 100644 --- a/src/backends/cl/backend.mk +++ b/src/backends/cl/backend.mk @@ -8,6 +8,7 @@ # file in the root of ArmNN BACKEND_SOURCES := \ + ClBackendContext.cpp \ ClBackend.cpp \ ClContextControl.cpp \ ClLayerSupport.cpp \ @@ -54,3 +55,4 @@ BACKEND_TEST_SOURCES := \ test/ClRuntimeTests.cpp \ test/Fp16SupportTest.cpp \ test/OpenClTimerTest.cpp + diff --git a/src/backends/common.mk b/src/backends/common.mk index b1583b987e..152ada3532 100644 --- a/src/backends/common.mk +++ b/src/backends/common.mk @@ -8,6 +8,7 @@ # file in the root of ArmNN COMMON_SOURCES := \ + BackendContextRegistry.cpp \ BackendRegistry.cpp \ CpuTensorHandle.cpp \ ILayerSupport.cpp \ @@ -26,3 +27,4 @@ COMMON_TEST_SOURCES := \ test/WorkloadDataValidation.cpp \ test/TensorCopyUtils.cpp \ test/LayerTests.cpp + diff --git a/src/backends/neon/CMakeLists.txt b/src/backends/neon/CMakeLists.txt index 058553dd34..b5e6ff33f5 100644 --- a/src/backends/neon/CMakeLists.txt +++ b/src/backends/neon/CMakeLists.txt @@ -3,17 +3,20 @@ # SPDX-License-Identifier: MIT # +list(APPEND armnnNeonBackend_sources + NeonBackendId.hpp + NeonLayerSupport.cpp + NeonLayerSupport.hpp + NeonWorkloadFactory.cpp + NeonWorkloadFactory.hpp +) + if(ARMCOMPUTENEON) list(APPEND armnnNeonBackend_sources NeonBackend.cpp NeonBackend.hpp - NeonBackendId.hpp NeonInterceptorScheduler.hpp NeonInterceptorScheduler.cpp - NeonLayerSupport.cpp - NeonLayerSupport.hpp - NeonWorkloadFactory.cpp - NeonWorkloadFactory.hpp NeonTensorHandle.hpp NeonTimer.hpp NeonTimer.cpp @@ -24,18 +27,10 @@ if(ARMCOMPUTENEON) if(BUILD_UNIT_TESTS) add_subdirectory(test) endif() - -else() - list(APPEND armnnNeonBackend_sources - NeonBackendId.hpp - NeonLayerSupport.cpp - NeonLayerSupport.hpp - NeonWorkloadFactory.cpp - NeonWorkloadFactory.hpp - ) endif() add_library(armnnNeonBackend OBJECT ${armnnNeonBackend_sources}) target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src) target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn) target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils) + diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp index e475f0232b..f8d7bb0785 100644 --- a/src/backends/neon/NeonBackend.cpp +++ b/src/backends/neon/NeonBackend.cpp @@ -9,8 +9,6 @@ #include -#include - namespace armnn { @@ -21,7 +19,7 @@ static StaticRegistryInitializer g_RegisterHelper { BackendRegistryInstance(), NeonBackend::GetIdStatic(), - []() + [](const EmptyInitializer&) { return IBackendInternalUniquePtr(new NeonBackend); } diff --git a/src/backends/neon/NeonBackend.hpp b/src/backends/neon/NeonBackend.hpp index e1287c784c..d74962be91 100644 --- a/src/backends/neon/NeonBackend.hpp +++ b/src/backends/neon/NeonBackend.hpp @@ -12,8 +12,8 @@ namespace armnn class NeonBackend : public IBackendInternal { public: - NeonBackend() = default; - ~NeonBackend() = default; + NeonBackend() = default; + ~NeonBackend() override = default; static const BackendId& GetIdStatic(); const BackendId& GetId() const override { return GetIdStatic(); } diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 3638212c75..71a5be3b17 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -49,7 +49,7 @@ ILayerSupportSharedPtr GetLayerSupportPointer() static StaticRegistryInitializer g_RegisterHelper{ LayerSupportRegistryInstance(), NeonBackendId(), - []() + [](const EmptyInitializer&) { return GetLayerSupportPointer(); } diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index 8f7e72b17c..29b3527542 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -49,3 +49,4 @@ BACKEND_TEST_SOURCES := \ test/NeonOptimizedNetworkTests.cpp \ test/NeonRuntimeTests.cpp \ test/NeonTimerTest.cpp + diff --git a/src/backends/reference/CMakeLists.txt b/src/backends/reference/CMakeLists.txt index 5f698f4e9d..e2656d552e 100644 --- a/src/backends/reference/CMakeLists.txt +++ b/src/backends/reference/CMakeLists.txt @@ -23,3 +23,4 @@ add_subdirectory(workloads) if(BUILD_UNIT_TESTS) add_subdirectory(test) endif() + diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp index 34348fa120..3aa4f038c5 100644 --- a/src/backends/reference/RefBackend.cpp +++ b/src/backends/reference/RefBackend.cpp @@ -9,8 +9,6 @@ #include -#include - namespace armnn { @@ -21,7 +19,7 @@ static StaticRegistryInitializer g_RegisterHelper { BackendRegistryInstance(), RefBackend::GetIdStatic(), - []() + [](const EmptyInitializer&) { return IBackendInternalUniquePtr(new RefBackend); } diff --git a/src/backends/reference/RefBackend.hpp b/src/backends/reference/RefBackend.hpp index 7162c9bf40..1949e77ff5 100644 --- a/src/backends/reference/RefBackend.hpp +++ b/src/backends/reference/RefBackend.hpp @@ -12,8 +12,8 @@ namespace armnn class RefBackend : public IBackendInternal { public: - RefBackend() = default; - ~RefBackend() = default; + RefBackend() = default; + ~RefBackend() override = default; static const BackendId& GetIdStatic(); const BackendId& GetId() const override { return GetIdStatic(); } diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 253d9c2294..79d4ab0dd1 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -31,7 +31,7 @@ ILayerSupportSharedPtr GetLayerSupportPointer() static StaticRegistryInitializer g_RegisterHelper{ LayerSupportRegistryInstance(), RefBackendId(), - []() + [](const EmptyInitializer&) { return GetLayerSupportPointer(); } diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk index 007efceb9b..8a8a78a315 100644 --- a/src/backends/reference/backend.mk +++ b/src/backends/reference/backend.mk @@ -71,3 +71,4 @@ BACKEND_TEST_SOURCES := \ test/RefLayerTests.cpp \ test/RefOptimizedNetworkTests.cpp \ test/RefRuntimeTests.cpp + diff --git a/src/backends/test/BackendRegistryTests.cpp b/src/backends/test/BackendRegistryTests.cpp index 34a2706466..bfeefda6bd 100644 --- a/src/backends/test/BackendRegistryTests.cpp +++ b/src/backends/test/BackendRegistryTests.cpp @@ -52,7 +52,7 @@ BOOST_AUTO_TEST_CASE(TestRegistryHelper) StaticRegistryInitializer factoryHelper( BackendRegistryInstance(), "HelloWorld", - [&called]() + [&called](const EmptyInitializer&) { called = true; return armnn::IBackendInternalUniquePtr(nullptr); @@ -67,7 +67,7 @@ BOOST_AUTO_TEST_CASE(TestRegistryHelper) // sanity check: the factory still not called BOOST_TEST(called == false); - factoryFunction(); + factoryFunction(EmptyInitializer()); BOOST_TEST(called == true); } @@ -79,7 +79,7 @@ BOOST_AUTO_TEST_CASE(TestDirectCallToRegistry) bool called = false; BackendRegistryInstance().Register( "HelloWorld", - [&called]() + [&called](const EmptyInitializer&) { called = true; return armnn::IBackendInternalUniquePtr(nullptr); @@ -94,7 +94,7 @@ BOOST_AUTO_TEST_CASE(TestDirectCallToRegistry) // sanity check: the factory still not called BOOST_TEST(called == false); - factoryFunction(); + factoryFunction(EmptyInitializer()); BOOST_TEST(called == true); } -- cgit v1.2.1