diff options
author | Matteo Martincigh <matteo.martincigh@arm.com> | 2019-01-11 13:25:59 +0000 |
---|---|---|
committer | Matteo Martincigh <matteo.martincigh@arm.com> | 2019-01-15 08:59:50 +0000 |
commit | 4912402497a51c6afe0898b3900f87feefa006a6 (patch) | |
tree | 4e9b5161781d2b0be041aec17227193da5977443 /src/armnn/Graph.cpp | |
parent | d0a1608e2c41639d8f3e3f9305d79c5f92c9cff8 (diff) | |
download | armnn-4912402497a51c6afe0898b3900f87feefa006a6.tar.gz |
IVGCVSW-2454 Merge together the pluggable backends work (was in a
separate branch) and master
* Brings in all the changes done for the pluggable backends
* Added sub-graph support and tests
* Added precompiled layer support and tests
* Moved BackendSettings to a separate file
* Removed the backend-specific code
* Ported DebugLayer and associated functionality
* Included fixes to make those changes work with master
Change-Id: Id7028fa7917527b844628d5aff5732e3d94c0488
Diffstat (limited to 'src/armnn/Graph.cpp')
-rw-r--r-- | src/armnn/Graph.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/armnn/Graph.cpp b/src/armnn/Graph.cpp index 83d82a5ffe..831d85e404 100644 --- a/src/armnn/Graph.cpp +++ b/src/armnn/Graph.cpp @@ -297,6 +297,65 @@ void Graph::AddCopyLayers() } } +void Graph::SubstituteSubGraph(std::unique_ptr<SubGraph> subGraph, IConnectableLayer* substituteLayer) +{ + BOOST_ASSERT(subGraph != nullptr); + BOOST_ASSERT(substituteLayer != nullptr); + + ReplaceSubGraphConnections(*subGraph, substituteLayer); + EraseSubGraphLayers(*subGraph); +} + +void Graph::ReplaceSubGraphConnections(const SubGraph& subGraph, IConnectableLayer* substituteLayer) +{ + BOOST_ASSERT(substituteLayer != nullptr); + BOOST_ASSERT_MSG(std::find(m_Layers.begin(), m_Layers.end(), substituteLayer) != m_Layers.end(), + "Substitue layer is not a member of graph"); + + const SubGraph::InputSlots& subGraphInputSlots = subGraph.GetInputSlots(); + const SubGraph::OutputSlots& subGraphOutputSlots = subGraph.GetOutputSlots(); + + const unsigned int numInputSlots = boost::numeric_cast<unsigned int>(subGraphInputSlots.size()); + const unsigned int numOutputSlots = boost::numeric_cast<unsigned int>(subGraphOutputSlots.size()); + + BOOST_ASSERT(numInputSlots == substituteLayer->GetNumInputSlots()); + BOOST_ASSERT(numOutputSlots == substituteLayer->GetNumOutputSlots()); + + // Disconnect the sub-graph and replace it with the substitute layer + // Step 1: process input slots + for(unsigned int inputSlotIdx = 0u; inputSlotIdx < numInputSlots; ++inputSlotIdx) + { + InputSlot* subGraphInputSlot = subGraphInputSlots.at(inputSlotIdx); + BOOST_ASSERT(subGraphInputSlot != nullptr); + + IOutputSlot* connectedOutputSlot = subGraphInputSlot->GetConnection(); + BOOST_ASSERT(connectedOutputSlot != nullptr); + connectedOutputSlot->Disconnect(*subGraphInputSlot); + + IInputSlot& substituteInputSlot = substituteLayer->GetInputSlot(inputSlotIdx); + connectedOutputSlot->Connect(substituteInputSlot); + } + + // Step 2: process output slots + for(unsigned int outputSlotIdx = 0u; outputSlotIdx < numOutputSlots; ++outputSlotIdx) + { + OutputSlot* subGraphOutputSlot = subGraphOutputSlots.at(outputSlotIdx); + BOOST_ASSERT(subGraphOutputSlot != nullptr); + + OutputSlot* substituteOutputSlot = boost::polymorphic_downcast<OutputSlot*>( + &substituteLayer->GetOutputSlot(outputSlotIdx)); + subGraphOutputSlot->MoveAllConnections(*substituteOutputSlot); + } +} + +void Graph::EraseSubGraphLayers(const SubGraph &subGraph) +{ + for (auto layer : subGraph.GetLayers()) + { + EraseLayer(layer); + } +} + void Graph::InferTensorInfos() { for (auto&& layer : TopologicalSort()) |