diff options
Diffstat (limited to 'src/backends/reference/RefBackend.cpp')
-rw-r--r-- | src/backends/reference/RefBackend.cpp | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp index a33a7756a0..8c8879c8be 100644 --- a/src/backends/reference/RefBackend.cpp +++ b/src/backends/reference/RefBackend.cpp @@ -14,6 +14,7 @@ #include <armnn/backends/IMemoryManager.hpp> #include <armnn/utility/PolymorphicDowncast.hpp> #include <backendsCommon/DefaultAllocator.hpp> +#include <backendsCommon/SubgraphUtils.hpp> #include <Optimizer.hpp> @@ -70,11 +71,61 @@ IBackendInternal::ILayerSupportSharedPtr RefBackend::GetLayerSupport() const return layerSupport; } -OptimizationViews RefBackend::OptimizeSubgraphView(const SubgraphView& subgraph) const +OptimizationViews RefBackend::OptimizeSubgraphView(const SubgraphView& subgraph, + const ModelOptions& modelOptions) const { - OptimizationViews optimizationViews; - - optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph)); + OptimizationViews optimizationViews(modelOptions); + + auto it = subgraph.endIConnectable(); + std::map<LayerGuid, Layer*> untouched; + + while (it != subgraph.beginIConnectable()) + { + --it; + Layer& base = *(PolymorphicDowncast<Layer*>(*it)); + untouched.insert({base.GetGuid(), &base}); + } + + it = subgraph.endIConnectable(); + while (it != subgraph.beginIConnectable()) + { + --it; + Layer& base = *(PolymorphicDowncast<Layer*>(*it)); + + // Special case to fuse padding into average pooling 2d for quantized datatype. + // Required to be done as a backend specific optimization as Neon does not support this special case. + if (base.GetType() == LayerType::Pooling2d) + { + Pooling2dLayer* baseLayer = PolymorphicDowncast<Pooling2dLayer*>(&base); + Pooling2dDescriptor poolingDescriptor = baseLayer->GetParameters(); + + if (baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetOwningLayer().GetType() == LayerType::Pad) + { + PadLayer* padLayer = PolymorphicDowncast<PadLayer*>( + &baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetOwningLayer()); + if (padLayer->GetOutputSlot(0).GetNumConnections() == 1 && + optimizations::pad_fold::TryFoldPadIntoLayer2d(padLayer->GetParameters(), + poolingDescriptor, + padLayer->GetOutputSlot().GetTensorInfo(), + true)) + { + FoldPadIntoAveragePool2d<Pooling2dLayer>(optimizationViews, baseLayer, + poolingDescriptor, padLayer); + untouched.erase(baseLayer->GetGuid()); + untouched.erase(padLayer->GetGuid()); + } + } + } + } + + if (optimizationViews.GetSubstitutions().empty()) + { + optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph)); + } + else + { + ReportUntouchedLayers(optimizationViews, untouched); + } return optimizationViews; } |