From 1b61be517387a20cd869e30587de2140b6d2252d Mon Sep 17 00:00:00 2001 From: David Beck Date: Thu, 8 Nov 2018 09:19:14 +0000 Subject: IVGCVSW-2056+IVGCVSW-2064 : move ClContextControl to the ClBackend * add IBackendContext interface * add ClBackendContext implementation Change-Id: I13e4d12b73d4c7775069587675276f7cee7d630b --- src/backends/cl/ClBackendContext.cpp | 113 +++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/backends/cl/ClBackendContext.cpp (limited to 'src/backends/cl/ClBackendContext.cpp') 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 + +#ifdef ARMCOMPUTECL_ENABLED +#include +#include +#include +#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(options.m_GpuAccTunedParameters.get(), + options.m_EnableGpuProfiling)) +{ +} + +bool ClBackendContext::BeforeLoadNetwork(NetworkId) +{ + return true; +} + +bool ClBackendContext::AfterLoadNetwork(NetworkId networkId) +{ + { + std::lock_guard 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 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 -- cgit v1.2.1