diff options
author | David Monahan <david.monahan@arm.com> | 2019-09-04 09:22:10 +0100 |
---|---|---|
committer | Narumol Prangnawarat <narumol.prangnawarat@arm.com> | 2019-09-16 10:41:06 +0000 |
commit | 4f1e8e47e29d42ed5862cccb29cf183853c4a86c (patch) | |
tree | d3f758b6647f3ba5a065d87ea3db4e5fc989d1bd /src/armnn | |
parent | 0718ee9f26219da5a1362c1060e7db3feae8b3ce (diff) | |
download | armnn-4f1e8e47e29d42ed5862cccb29cf183853c4a86c.tar.gz |
IVGCVSW-3687 Add INetworkProperties to LoadNetwork
* Allows users to specify if Import/Export should be used
Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: I64da26a6acbeb91ef72d31b6ccc01bb1447f624d
Diffstat (limited to 'src/armnn')
-rw-r--r-- | src/armnn/LoadedNetwork.cpp | 50 | ||||
-rw-r--r-- | src/armnn/LoadedNetwork.hpp | 7 | ||||
-rw-r--r-- | src/armnn/Runtime.cpp | 14 | ||||
-rw-r--r-- | src/armnn/Runtime.hpp | 7 |
4 files changed, 55 insertions, 23 deletions
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp index 5b64085869..1000eceda0 100644 --- a/src/armnn/LoadedNetwork.cpp +++ b/src/armnn/LoadedNetwork.cpp @@ -41,7 +41,8 @@ std::string ToErrorMessage(const char * prefix, const ExceptionType & error) } // anonymous std::unique_ptr<LoadedNetwork> LoadedNetwork::MakeLoadedNetwork(std::unique_ptr<OptimizedNetwork> net, - std::string & errorMessage) + std::string& errorMessage, + const INetworkProperties& networkProperties) { std::unique_ptr<LoadedNetwork> loadedNetwork; @@ -55,7 +56,7 @@ std::unique_ptr<LoadedNetwork> LoadedNetwork::MakeLoadedNetwork(std::unique_ptr< try { - loadedNetwork.reset(new LoadedNetwork(std::move(net))); + loadedNetwork.reset(new LoadedNetwork(std::move(net), networkProperties)); } catch (const armnn::RuntimeException& error) { @@ -73,8 +74,11 @@ std::unique_ptr<LoadedNetwork> LoadedNetwork::MakeLoadedNetwork(std::unique_ptr< return loadedNetwork; } -LoadedNetwork::LoadedNetwork(std::unique_ptr<OptimizedNetwork> net) - : m_OptimizedNetwork(std::move(net)) +LoadedNetwork::LoadedNetwork(std::unique_ptr<OptimizedNetwork> net, + const INetworkProperties& networkProperties) : + m_OptimizedNetwork(std::move(net)), + m_IsImportEnabled(networkProperties.m_ImportEnabled), + m_IsExportEnabled(networkProperties.m_ExportEnabled) { // Create a profiler and register it for the current thread. m_Profiler = std::make_shared<Profiler>(); @@ -392,7 +396,7 @@ void LoadedNetwork::EnqueueInput(const BindableLayer& layer, ITensorHandle* tens info.m_OutputTensorInfos.push_back(outputTensorInfo); MemorySourceFlags importFlags = outputTensorHandle->GetImportFlags(); - if (CheckFlag(importFlags, MemorySource::Malloc)) // Try import the input tensor + if (CheckFlag(importFlags, MemorySource::Malloc) && m_IsImportEnabled) // Try import the input tensor { // This assumes a CPU Tensor handle void* mem = tensorHandle->Map(false); @@ -402,13 +406,16 @@ void LoadedNetwork::EnqueueInput(const BindableLayer& layer, ITensorHandle* tens return; // No need for a workload since the import has been done. } tensorHandle->Unmap(); + throw MemoryImportException("EnqueueInput: Memory Import failed"); } + else + { + // Create a mem copy workload for input since we did not import + auto inputWorkload = std::make_unique<CopyMemGenericWorkload>(inputQueueDescriptor, info); - // Create a mem copy workload for input since we could not import - auto inputWorkload = std::make_unique<CopyMemGenericWorkload>(inputQueueDescriptor, info); - - BOOST_ASSERT_MSG(inputWorkload, "No input workload created"); - m_InputQueue.push_back(move(inputWorkload)); + BOOST_ASSERT_MSG(inputWorkload, "No input workload created"); + m_InputQueue.push_back(move(inputWorkload)); + } } void LoadedNetwork::EnqueueOutput(const BindableLayer& layer, ITensorHandle* tensorHandle, const TensorInfo& tensorInfo) @@ -444,7 +451,8 @@ void LoadedNetwork::EnqueueOutput(const BindableLayer& layer, ITensorHandle* ten // b) The tensor has zero padding // c) There is only one connection to the OutputSlot and it is to an OutputLayer. // d) The output pointer is allocated via malloc. (Other types will be supported in a later release) - if (layer.GetInputSlots()[0].GetConnectedOutputSlot()->GetOwningLayer().GetType() != LayerType::Input) + if (layer.GetInputSlots()[0].GetConnectedOutputSlot()->GetOwningLayer().GetType() != LayerType::Input + && m_IsExportEnabled) { if (layer.GetInputSlots()[0].GetConnectedOutputSlot()->GetNumConnections() == 1) { @@ -467,17 +475,23 @@ void LoadedNetwork::EnqueueOutput(const BindableLayer& layer, ITensorHandle* ten return; //No need to add the output workload below } + else + { + throw MemoryExportException("EnqueueOutput: Memory Export failed"); + } } } } + else + { + // If we got here then we couldn't import the memory, so add an output workload which performs a memcopy. + outputQueueDescriptor.m_Inputs.push_back(inputTensorHandle); + info.m_InputTensorInfos.push_back(inputTensorInfo); - // If we got here then we couldn't import the memory, so add an output workload which performs a memcopy. - outputQueueDescriptor.m_Inputs.push_back(inputTensorHandle); - info.m_InputTensorInfos.push_back(inputTensorInfo); - - auto outputWorkload = std::make_unique<CopyMemGenericWorkload>(outputQueueDescriptor, info); - BOOST_ASSERT_MSG(outputWorkload, "No output workload created"); - m_OutputQueue.push_back(move(outputWorkload)); + auto outputWorkload = std::make_unique<CopyMemGenericWorkload>(outputQueueDescriptor, info); + BOOST_ASSERT_MSG(outputWorkload, "No output workload created"); + m_OutputQueue.push_back(move(outputWorkload)); + } } void LoadedNetwork::AllocateWorkingMemory() diff --git a/src/armnn/LoadedNetwork.hpp b/src/armnn/LoadedNetwork.hpp index 808a93222a..08c09b8801 100644 --- a/src/armnn/LoadedNetwork.hpp +++ b/src/armnn/LoadedNetwork.hpp @@ -41,7 +41,8 @@ public: Status EnqueueWorkload(const InputTensors& inputTensors, const OutputTensors& outputTensors); static std::unique_ptr<LoadedNetwork> MakeLoadedNetwork(std::unique_ptr<OptimizedNetwork> net, - std::string & errorMessage); + std::string & errorMessage, + const INetworkProperties& networkProperties); // NOTE we return by reference as the purpose of this method is only to provide // access to the private m_Profiler and in theory we should not need to increment @@ -55,7 +56,7 @@ public: private: void AllocateWorkingMemory(); - LoadedNetwork(std::unique_ptr<OptimizedNetwork> net); + LoadedNetwork(std::unique_ptr<OptimizedNetwork> net, const INetworkProperties& networkProperties); void EnqueueInput(const BindableLayer& layer, ITensorHandle* tensorHandle, const TensorInfo& tensorInfo); @@ -84,6 +85,8 @@ private: mutable std::mutex m_WorkingMemMutex; bool m_IsWorkingMemAllocated=false; + bool m_IsImportEnabled=false; + bool m_IsExportEnabled=false; TensorHandleFactoryRegistry m_TensorHandleFactoryRegistry; }; diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp index 9e874848ec..e47835687d 100644 --- a/src/armnn/Runtime.cpp +++ b/src/armnn/Runtime.cpp @@ -49,7 +49,16 @@ Status Runtime::LoadNetwork(NetworkId& networkIdOut, IOptimizedNetworkPtr inNetw Status Runtime::LoadNetwork(NetworkId& networkIdOut, IOptimizedNetworkPtr inNetwork, - std::string & errorMessage) + std::string& errorMessage) +{ + INetworkProperties networkProperties; + return LoadNetwork(networkIdOut, std::move(inNetwork), errorMessage, networkProperties); +} + +Status Runtime::LoadNetwork(NetworkId& networkIdOut, + IOptimizedNetworkPtr inNetwork, + std::string& errorMessage, + const INetworkProperties& networkProperties) { IOptimizedNetwork* rawNetwork = inNetwork.release(); @@ -62,7 +71,8 @@ Status Runtime::LoadNetwork(NetworkId& networkIdOut, unique_ptr<LoadedNetwork> loadedNetwork = LoadedNetwork::MakeLoadedNetwork( std::unique_ptr<OptimizedNetwork>(boost::polymorphic_downcast<OptimizedNetwork*>(rawNetwork)), - errorMessage); + errorMessage, + networkProperties); if (!loadedNetwork) { diff --git a/src/armnn/Runtime.hpp b/src/armnn/Runtime.hpp index 35684f1f78..a028c878a0 100644 --- a/src/armnn/Runtime.hpp +++ b/src/armnn/Runtime.hpp @@ -38,7 +38,12 @@ public: /// @return armnn::Status virtual Status LoadNetwork(NetworkId& networkIdOut, IOptimizedNetworkPtr network, - std::string & errorMessage) override; + std::string& errorMessage) override; + + virtual Status LoadNetwork(NetworkId& networkIdOut, + IOptimizedNetworkPtr network, + std::string& errorMessage, + const INetworkProperties& networkProperties) override; virtual TensorInfo GetInputTensorInfo(NetworkId networkId, LayerBindingId layerId) const override; virtual TensorInfo GetOutputTensorInfo(NetworkId networkId, LayerBindingId layerId) const override; |