diff options
Diffstat (limited to 'src/backends/cl/ClBackendContext.cpp')
-rw-r--r-- | src/backends/cl/ClBackendContext.cpp | 292 |
1 files changed, 0 insertions, 292 deletions
diff --git a/src/backends/cl/ClBackendContext.cpp b/src/backends/cl/ClBackendContext.cpp deleted file mode 100644 index 068e2958af..0000000000 --- a/src/backends/cl/ClBackendContext.cpp +++ /dev/null @@ -1,292 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "ClBackendContext.hpp" -#include "ClContextControl.hpp" - -#include <armnn/Logging.hpp> - -#include <arm_compute/core/CL/OpenCL.h> -#include <arm_compute/core/CL/CLKernelLibrary.h> -#include <arm_compute/runtime/CL/CLScheduler.h> -#include <arm_compute/runtime/CL/CLTunerTypes.h> - -#include <boost/polymorphic_cast.hpp> - -namespace armnn -{ - -struct ClBackendContext::ClContextControlWrapper -{ - ClContextControlWrapper(arm_compute::CLTuner* tuner, - bool profilingEnabled) - : m_ClContextControl(tuner, profilingEnabled) - {} - - bool Sync() - { - 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&) - { - ARMNN_LOG(warning) << "Runtime::UnloadNetwork(): an error occurred while waiting for " - "the queued CL requests to finish"; - return false; - } - } - - return true; - } - - void ClearClCache() - { - 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(); - } - } - - ClContextControl m_ClContextControl; -}; - -std::string LowerString(std::string value) -{ - std::transform(value.begin(), value.end(), value.begin(), - [](unsigned char c){ return std::tolower(c); }); - - return value; -} - -enum class TuningLevel -{ - None, - Rapid, - Normal, - Exhaustive -}; - - -TuningLevel ParseTuningLevel(const BackendOptions::Var& value, TuningLevel defaultValue) -{ - if (value.IsInt()) - { - int v = value.IsInt(); - if (v > static_cast<int>(TuningLevel::Exhaustive) || - v < static_cast<int>(TuningLevel::None)) - { - ARMNN_LOG(warning) << "Invalid GpuAcc tuning level ("<< v << ") selected. " - "Using default(" << static_cast<int>(defaultValue) << ")"; - } else - { - return static_cast<TuningLevel>(v); - } - } - return defaultValue; -} - -bool ParseBoolean(const BackendOptions::Var& value, bool defaultValue) -{ - if (value.IsBool()) - { - return value.AsBool(); - } - - return defaultValue; -} - -std::string ParseFile(const BackendOptions::Var& value, std::string defaultValue) -{ - if (value.IsString()) - { - return value.AsString(); - } - return defaultValue; -} - -template <typename F> -void ParseOptions(const std::vector<BackendOptions>& options, BackendId backend, F f) -{ - for (auto optionsGroup : options) - { - if (optionsGroup.GetBackendId() == backend) - { - for (size_t i=0; i < optionsGroup.GetOptionCount(); i++) - { - const BackendOptions::BackendOption option = optionsGroup.GetOption(i); - f(option.GetName(), option.GetValue()); - } - } - } -} - -void ConfigureTuner(arm_compute::CLTuner &tuner, TuningLevel level) -{ - tuner.set_tune_new_kernels(true); // Turn on tuning initially. - - switch (level) - { - case TuningLevel::Rapid: - tuner.set_tuner_mode(arm_compute::CLTunerMode::RAPID); - break; - case TuningLevel::Normal: - tuner.set_tuner_mode(arm_compute::CLTunerMode::NORMAL); - break; - case TuningLevel::Exhaustive: - tuner.set_tuner_mode(arm_compute::CLTunerMode::EXHAUSTIVE); - break; - case TuningLevel::None: - default: - tuner.set_tune_new_kernels(false); // Turn off tuning. Set to "use" only mode. - break; - } -} - -ClBackendContext::ClBackendContext(const IRuntime::CreationOptions& options) - : IBackendContext(options) - , m_TuningFile() -{ - bool kernelProfiling = options.m_EnableGpuProfiling; - - arm_compute::CLTuner* tuner = nullptr; - bool useLegacyTunerAPI = options.m_GpuAccTunedParameters.get() != nullptr; - if (useLegacyTunerAPI) - { - auto clTunerParams = boost::polymorphic_downcast<ClTunedParameters*>( - options.m_GpuAccTunedParameters.get()); - tuner = &clTunerParams->m_Tuner; - - if (tuner) - { - auto ConvertTuningLevel = [](IGpuAccTunedParameters::TuningLevel level, - armnn::IGpuAccTunedParameters::Mode mode) - { - if (mode == armnn::IGpuAccTunedParameters::Mode::UseTunedParameters) - { - return TuningLevel::None; - } - - switch(level) - { - case IGpuAccTunedParameters::TuningLevel::Rapid: - return TuningLevel::Rapid; - case IGpuAccTunedParameters::TuningLevel::Normal: - return TuningLevel::Normal; - case IGpuAccTunedParameters::TuningLevel::Exhaustive: - return TuningLevel::Exhaustive; - default: - { - BOOST_ASSERT_MSG(false, "Tuning level not recognised."); - return TuningLevel::None; - } - } - }; - - TuningLevel tuningLevel = ConvertTuningLevel(clTunerParams->m_TuningLevel, clTunerParams->m_Mode); - ConfigureTuner(*tuner, tuningLevel); - } - } - else //New backend options API - { - const TuningLevel defaultTuningLevel = TuningLevel::None; - auto tuningLevel = defaultTuningLevel; - - ParseOptions(options.m_BackendOptions, "GpuAcc", [&](std::string name, const BackendOptions::Var& value) - { - if (name == "KernelProfilingEnabled") - { - kernelProfiling |= ParseBoolean(value, false); - } else if (name == "TuningFile") - { - m_TuningFile = ParseFile(value, ""); - } else if (name == "TuningLevel") - { - tuningLevel = ParseTuningLevel(value, defaultTuningLevel); - } - }); - - // Create the tuner, in tuning mode initially. - m_Tuner = std::make_unique<arm_compute::CLTuner>(true); - - ConfigureTuner(*(m_Tuner.get()), tuningLevel); - - if (!m_TuningFile.empty()) - { - try - { - m_Tuner->load_from_file(m_TuningFile.c_str()); - } catch (const std::exception& e) - { - ARMNN_LOG(warning) << "Could not load GpuAcc tuner data file."; - } - - tuner = m_Tuner.get(); - } - } - - m_ClContextControlWrapper = std::make_unique<ClContextControlWrapper>( - tuner, - kernelProfiling - ); -} - -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() -{ - if (m_Tuner && !m_TuningFile.empty()) - { - try - { - m_Tuner->save_to_file(m_TuningFile.c_str()); - } - catch(const std::exception& e) - { - ARMNN_LOG(warning) << "Could not save GpuAcc tuner data to file " << m_TuningFile; - } - } -} - -} // namespace armnn
\ No newline at end of file |