diff options
Diffstat (limited to 'src/armnn')
-rw-r--r-- | src/armnn/LayerSupport.cpp | 2 | ||||
-rw-r--r-- | src/armnn/LoadedNetwork.cpp | 8 | ||||
-rw-r--r-- | src/armnn/LoadedNetwork.hpp | 3 | ||||
-rw-r--r-- | src/armnn/Runtime.cpp | 52 | ||||
-rw-r--r-- | src/armnn/Runtime.hpp | 12 |
5 files changed, 46 insertions, 31 deletions
diff --git a/src/armnn/LayerSupport.cpp b/src/armnn/LayerSupport.cpp index e3009e26fd..fb3ce43646 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(EmptyInitializer()); \ + auto layerSupportObject = factoryFunc(); \ isSupported = layerSupportObject->func(__VA_ARGS__, Optional<std::string&>(reasonIfUnsupportedFull)); \ CopyErrorMessage(reasonIfUnsupported, reasonIfUnsupportedFull.c_str(), reasonIfUnsupportedMaxLength); \ } catch (InvalidArgumentException e) { \ diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp index 97c836079e..f58a115754 100644 --- a/src/armnn/LoadedNetwork.cpp +++ b/src/armnn/LoadedNetwork.cpp @@ -38,7 +38,6 @@ std::string ToErrorMessage(const char * prefix, const ExceptionType & error) } // anonymous std::unique_ptr<LoadedNetwork> LoadedNetwork::MakeLoadedNetwork(std::unique_ptr<OptimizedNetwork> net, - const IRuntime::CreationOptions& options, std::string & errorMessage) { std::unique_ptr<LoadedNetwork> loadedNetwork; @@ -53,7 +52,7 @@ std::unique_ptr<LoadedNetwork> LoadedNetwork::MakeLoadedNetwork(std::unique_ptr< try { - loadedNetwork.reset(new LoadedNetwork(std::move(net), options)); + loadedNetwork.reset(new LoadedNetwork(std::move(net))); } catch (const armnn::RuntimeException& error) { @@ -71,8 +70,7 @@ std::unique_ptr<LoadedNetwork> LoadedNetwork::MakeLoadedNetwork(std::unique_ptr< return loadedNetwork; } -LoadedNetwork::LoadedNetwork(std::unique_ptr<OptimizedNetwork> net, - const IRuntime::CreationOptions& options) +LoadedNetwork::LoadedNetwork(std::unique_ptr<OptimizedNetwork> net) : m_OptimizedNetwork(std::move(net)) , m_WorkingMemLock(m_WorkingMemMutex, std::defer_lock) { @@ -91,7 +89,7 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr<OptimizedNetwork> net, if (m_Backends.count(backend) == 0) { auto createBackend = BackendRegistryInstance().GetFactory(backend); - auto it = m_Backends.emplace(std::make_pair(backend, createBackend(EmptyInitializer()))); + auto it = m_Backends.emplace(std::make_pair(backend, createBackend())); m_WorkloadFactories.emplace(std::make_pair(backend, it.first->second->CreateWorkloadFactory())); } diff --git a/src/armnn/LoadedNetwork.hpp b/src/armnn/LoadedNetwork.hpp index b36b69bca3..65dd4ec25b 100644 --- a/src/armnn/LoadedNetwork.hpp +++ b/src/armnn/LoadedNetwork.hpp @@ -40,7 +40,6 @@ public: Status EnqueueWorkload(const InputTensors& inputTensors, const OutputTensors& outputTensors); static std::unique_ptr<LoadedNetwork> MakeLoadedNetwork(std::unique_ptr<OptimizedNetwork> net, - const IRuntime::CreationOptions& options, std::string & errorMessage); // NOTE we return by reference as the purpose of this method is only to provide @@ -52,7 +51,7 @@ public: void FreeWorkingMemory(); private: - LoadedNetwork(std::unique_ptr<OptimizedNetwork> net, const IRuntime::CreationOptions& options); + LoadedNetwork(std::unique_ptr<OptimizedNetwork> net); void EnqueueInput(const BindableLayer& layer, ITensorHandle* tensorHandle, const TensorInfo& tensorInfo); diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp index 769136486d..37e25a7fb6 100644 --- a/src/armnn/Runtime.cpp +++ b/src/armnn/Runtime.cpp @@ -6,10 +6,15 @@ #include <armnn/Version.hpp> #include <backendsCommon/BackendRegistry.hpp> -#include <backendsCommon/BackendContextRegistry.hpp> #include <iostream> +#ifdef ARMCOMPUTECL_ENABLED +#include <arm_compute/core/CL/OpenCL.h> +#include <arm_compute/core/CL/CLKernelLibrary.h> +#include <arm_compute/runtime/CL/CLScheduler.h> +#endif + #include <boost/log/trivial.hpp> #include <boost/polymorphic_cast.hpp> @@ -52,7 +57,6 @@ Status Runtime::LoadNetwork(NetworkId& networkIdOut, IOptimizedNetwork* rawNetwork = inNetwork.release(); unique_ptr<LoadedNetwork> loadedNetwork = LoadedNetwork::MakeLoadedNetwork( std::unique_ptr<OptimizedNetwork>(boost::polymorphic_downcast<OptimizedNetwork*>(rawNetwork)), - m_Options, errorMessage); if (!loadedNetwork) @@ -74,6 +78,24 @@ 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<std::mutex> lockGuard(m_Mutex); @@ -82,6 +104,14 @@ 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; @@ -101,26 +131,12 @@ const std::shared_ptr<IProfiler> Runtime::GetProfiler(NetworkId networkId) const } Runtime::Runtime(const CreationOptions& options) - : m_Options{options} + : m_ClContextControl(options.m_GpuAccTunedParameters.get(), + options.m_EnableGpuProfiling) , 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 694e1e5f9a..e4d4d4ddb9 100644 --- a/src/armnn/Runtime.hpp +++ b/src/armnn/Runtime.hpp @@ -10,7 +10,8 @@ #include <armnn/IRuntime.hpp> #include <armnn/Tensor.hpp> #include <armnn/BackendId.hpp> -#include <backendsCommon/IBackendContext.hpp> + +#include <cl/ClContextControl.hpp> #include <mutex> #include <unordered_map> @@ -86,13 +87,14 @@ private: } mutable std::mutex m_Mutex; + std::unordered_map<NetworkId, std::unique_ptr<LoadedNetwork>> m_LoadedNetworks; - CreationOptions m_Options; + + ClContextControl m_ClContextControl; + int m_NetworkIdCounter; - DeviceSpec m_DeviceSpec; - using BackendContextMap = std::unordered_map<BackendId, IBackendContextUniquePtr>; - BackendContextMap m_BackendContexts; + DeviceSpec m_DeviceSpec; }; } |