diff options
Diffstat (limited to 'src/backends/cl/ClBackendContext.cpp')
-rw-r--r-- | src/backends/cl/ClBackendContext.cpp | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/src/backends/cl/ClBackendContext.cpp b/src/backends/cl/ClBackendContext.cpp index c63fb0c893..62c6b038da 100644 --- a/src/backends/cl/ClBackendContext.cpp +++ b/src/backends/cl/ClBackendContext.cpp @@ -20,11 +20,20 @@ namespace armnn struct ClBackendContext::ClContextControlWrapper { - ClContextControlWrapper(arm_compute::CLTuner* tuner, - arm_compute::CLGEMMHeuristicsHandle* heuristicsHandle, - bool profilingEnabled) - : m_ClContextControl(tuner, heuristicsHandle, profilingEnabled) - {} + ClContextControlWrapper() {} + + bool IsInitialised() + { + return m_Initialised; + } + + void Init(arm_compute::CLTuner* tuner, + arm_compute::CLGEMMHeuristicsHandle* heuristicsHandle, + bool profilingEnabled) + { + m_ClContextControl = ClContextControl(tuner, heuristicsHandle, profilingEnabled); + m_Initialised = true; + } bool Sync() { @@ -53,12 +62,28 @@ struct ClBackendContext::ClContextControlWrapper { // There are no loaded networks left, so clear the CL cache to free up memory m_ClContextControl.ClearClCache(); + m_Initialised = false; } } +private: + bool m_Initialised; ClContextControl m_ClContextControl; + }; +/** + * Returns a shared_ptr to the CLContextControlWrapper. This wraps the CLContextControl and ensures that we only create + * and use one at a time. + */ +std::shared_ptr<ClBackendContext::ClContextControlWrapper> ClBackendContext::Get() +{ + static std::shared_ptr<ClBackendContext::ClContextControlWrapper> instance + = std::make_shared<ClBackendContext::ClContextControlWrapper>(); + // Instantiated on first use. + return instance; +} + std::string LowerString(std::string value) { std::transform(value.begin(), value.end(), value.begin(), @@ -146,6 +171,7 @@ ClBackendContext::ClBackendContext(const IRuntime::CreationOptions& options) arm_compute::CLTuner* tuner = nullptr; arm_compute::CLGEMMHeuristicsHandle* mlgoTuner = nullptr; bool useLegacyTunerAPI = options.m_GpuAccTunedParameters.get() != nullptr; + if (useLegacyTunerAPI) { auto clTunerParams = PolymorphicDowncast<ClTunedParameters*>( @@ -246,11 +272,12 @@ ClBackendContext::ClBackendContext(const IRuntime::CreationOptions& options) tuner = m_Tuner.get(); } - m_ClContextControlWrapper = std::make_unique<ClContextControlWrapper>( - tuner, - mlgoTuner, - kernelProfiling - ); + m_ClContextControlWrapper = Get(); + + if (!m_ClContextControlWrapper->IsInitialised()) + { + m_ClContextControlWrapper->Init(tuner, mlgoTuner, kernelProfiling); + } } bool ClBackendContext::BeforeLoadNetwork(NetworkId) |