diff options
author | David Beck <david.beck@arm.com> | 2018-11-08 09:19:14 +0000 |
---|---|---|
committer | David Beck <david.beck@arm.com> | 2018-11-08 12:48:30 +0000 |
commit | 1b61be517387a20cd869e30587de2140b6d2252d (patch) | |
tree | 06ca37c640ccf4cd1fc5722393caf16c15a16b14 /src/backends/cl | |
parent | 60578950322491e44b4203fe085c3230ead19c7a (diff) | |
download | armnn-1b61be517387a20cd869e30587de2140b6d2252d.tar.gz |
IVGCVSW-2056+IVGCVSW-2064 : move ClContextControl to the ClBackendexperimental/nhwc-preview
* add IBackendContext interface
* add ClBackendContext implementation
Change-Id: I13e4d12b73d4c7775069587675276f7cee7d630b
Diffstat (limited to 'src/backends/cl')
-rw-r--r-- | src/backends/cl/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/backends/cl/ClBackend.cpp | 8 | ||||
-rw-r--r-- | src/backends/cl/ClBackend.hpp | 4 | ||||
-rw-r--r-- | src/backends/cl/ClBackendContext.cpp | 113 | ||||
-rw-r--r-- | src/backends/cl/ClBackendContext.hpp | 36 | ||||
-rw-r--r-- | src/backends/cl/backend.mk | 1 |
6 files changed, 163 insertions, 1 deletions
diff --git a/src/backends/cl/CMakeLists.txt b/src/backends/cl/CMakeLists.txt index d751854c92..dd2a4a12b1 100644 --- a/src/backends/cl/CMakeLists.txt +++ b/src/backends/cl/CMakeLists.txt @@ -7,6 +7,8 @@ if(ARMCOMPUTECL) list(APPEND armnnClBackend_sources ClBackend.cpp ClBackend.hpp + ClBackendContext.cpp + ClBackendContext.hpp ClBackendId.hpp ClContextControl.cpp ClContextControl.hpp diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp index b1857a3678..c07fa66457 100644 --- a/src/backends/cl/ClBackend.cpp +++ b/src/backends/cl/ClBackend.cpp @@ -6,6 +6,7 @@ #include "ClBackend.hpp" #include "ClBackendId.hpp" #include "ClWorkloadFactory.hpp" +#include "ClBackendContext.hpp" #include <backendsCommon/BackendRegistry.hpp> @@ -38,4 +39,11 @@ IBackendInternal::IWorkloadFactoryPtr ClBackend::CreateWorkloadFactory() const return std::make_unique<ClWorkloadFactory>(); } +IBackendInternal::IBackendContextPtr +ClBackend::CreateBackendContext(const IRuntime::CreationOptions& options) const +{ + return IBackendContextPtr{new ClBackendContext{options}}; +} + + } // namespace armnn diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp index 223aeb3095..f8a6253c22 100644 --- a/src/backends/cl/ClBackend.hpp +++ b/src/backends/cl/ClBackend.hpp @@ -4,6 +4,7 @@ // #pragma once +#include <backendsCommon/IBackendContext.hpp> #include <backendsCommon/IBackendInternal.hpp> namespace armnn @@ -18,7 +19,8 @@ public: static const BackendId& GetIdStatic(); const BackendId& GetId() const override { return GetIdStatic(); } - IWorkloadFactoryPtr CreateWorkloadFactory() const override; + IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory() const override; + IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override; }; } // namespace armnn
\ No newline at end of file diff --git a/src/backends/cl/ClBackendContext.cpp b/src/backends/cl/ClBackendContext.cpp new file mode 100644 index 0000000000..a2c1b87359 --- /dev/null +++ b/src/backends/cl/ClBackendContext.cpp @@ -0,0 +1,113 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ClBackendContext.hpp" +#include "ClContextControl.hpp" + +#include <boost/log/trivial.hpp> + +#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 + +namespace armnn +{ + +struct ClBackendContext::ClContextControlWrapper +{ + ClContextControlWrapper(IGpuAccTunedParameters* clTunedParameters, + bool profilingEnabled) + : m_ClContextControl(clTunedParameters, profilingEnabled) + {} + + bool Sync() + { +#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 false; + } + } +#endif + return true; + } + + void ClearClCache() + { +#ifdef ARMCOMPUTECL_ENABLED + if (arm_compute::CLScheduler::get().context()() != NULL) + { + // There are no loaded networks left, so clear the CL cache to free up memory + m_ClContextControl.ClearClCache(); + } +#endif + } + + + ClContextControl m_ClContextControl; +}; + + +ClBackendContext::ClBackendContext(const IRuntime::CreationOptions& options) + : IBackendContext(options) + , m_ClContextControlWrapper( + std::make_unique<ClContextControlWrapper>(options.m_GpuAccTunedParameters.get(), + options.m_EnableGpuProfiling)) +{ +} + +bool ClBackendContext::BeforeLoadNetwork(NetworkId) +{ + return true; +} + +bool ClBackendContext::AfterLoadNetwork(NetworkId networkId) +{ + { + std::lock_guard<std::mutex> lockGuard(m_Mutex); + m_NetworkIds.insert(networkId); + } + return true; +} + +bool ClBackendContext::BeforeUnloadNetwork(NetworkId) +{ + return m_ClContextControlWrapper->Sync(); +} + +bool ClBackendContext::AfterUnloadNetwork(NetworkId networkId) +{ + bool clearCache = false; + { + std::lock_guard<std::mutex> lockGuard(m_Mutex); + m_NetworkIds.erase(networkId); + clearCache = m_NetworkIds.empty(); + } + + if (clearCache) + { + m_ClContextControlWrapper->ClearClCache(); + } + + return true; +} + +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..24497c2249 --- /dev/null +++ b/src/backends/cl/ClBackendContext.hpp @@ -0,0 +1,36 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include <backendsCommon/IBackendContext.hpp> +#include <unordered_set> +#include <mutex> + +namespace armnn +{ + +class ClBackendContext : public IBackendContext +{ +public: + ClBackendContext(const IRuntime::CreationOptions& options); + + bool BeforeLoadNetwork(NetworkId networkId) override; + bool AfterLoadNetwork(NetworkId networkId) override; + + bool BeforeUnloadNetwork(NetworkId networkId) override; + bool AfterUnloadNetwork(NetworkId networkId) override; + + ~ClBackendContext() override; + +private: + std::mutex m_Mutex; + struct ClContextControlWrapper; + std::unique_ptr<ClContextControlWrapper> m_ClContextControlWrapper; + + std::unordered_set<NetworkId> m_NetworkIds; + +}; + +} // namespace armnn
\ No newline at end of file diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk index 97df8e4903..fd7ea80f33 100644 --- a/src/backends/cl/backend.mk +++ b/src/backends/cl/backend.mk @@ -9,6 +9,7 @@ BACKEND_SOURCES := \ ClBackend.cpp \ + ClBackendContext.cpp \ ClContextControl.cpp \ ClLayerSupport.cpp \ ClWorkloadFactory.cpp \ |