aboutsummaryrefslogtreecommitdiff
path: root/src/armnn
diff options
context:
space:
mode:
Diffstat (limited to 'src/armnn')
-rw-r--r--src/armnn/LayerSupport.cpp2
-rw-r--r--src/armnn/LoadedNetwork.cpp8
-rw-r--r--src/armnn/LoadedNetwork.hpp3
-rw-r--r--src/armnn/Runtime.cpp52
-rw-r--r--src/armnn/Runtime.hpp12
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;
};
}