diff options
author | Matthew Sloyan <matthew.sloyan@arm.com> | 2021-06-30 10:20:17 +0100 |
---|---|---|
committer | Matthew Sloyan <matthew.sloyan@arm.com> | 2021-06-30 16:20:45 +0100 |
commit | 33f8987b5a437e8fc35cb38dac18007a8d92db6e (patch) | |
tree | 080d8b9e886ef577cea4725888a24907a3bc78a0 /src/armnn/optimizations | |
parent | 0d677db72eb7945e304fc49cedf744f0c34ed330 (diff) | |
download | armnn-33f8987b5a437e8fc35cb38dac18007a8d92db6e.tar.gz |
IVGCVSW-6161 ConstTensorsAsInput: Optimizer - Redirect ConstTensor layer members
* Optimization that searches for layers with ConstantLayers as inputs.
* The layer member variables are then redirected to these ConstantLayers.
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: I24a2bf0e8575b808343e0bbe3897b344e94796ad
Diffstat (limited to 'src/armnn/optimizations')
-rw-r--r-- | src/armnn/optimizations/All.hpp | 1 | ||||
-rw-r--r-- | src/armnn/optimizations/RedirectMembersToConstantInputs.hpp | 86 |
2 files changed, 87 insertions, 0 deletions
diff --git a/src/armnn/optimizations/All.hpp b/src/armnn/optimizations/All.hpp index 5decc7c969..2bc54d993d 100644 --- a/src/armnn/optimizations/All.hpp +++ b/src/armnn/optimizations/All.hpp @@ -18,5 +18,6 @@ #include "OptimizeInversePermutes.hpp" #include "PermuteAsReshape.hpp" #include "PermuteAndBatchToSpaceAsDepthToSpace.hpp" +#include "RedirectMembersToConstantInputs.hpp" #include "SquashEqualSiblings.hpp" #include "TransposeAsReshape.hpp"
\ No newline at end of file diff --git a/src/armnn/optimizations/RedirectMembersToConstantInputs.hpp b/src/armnn/optimizations/RedirectMembersToConstantInputs.hpp new file mode 100644 index 0000000000..5bf5ae5460 --- /dev/null +++ b/src/armnn/optimizations/RedirectMembersToConstantInputs.hpp @@ -0,0 +1,86 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "IgnoreUnused.hpp" +#include "Optimization.hpp" + +#include <armnn/utility/PolymorphicDowncast.hpp> + +namespace armnn +{ +namespace optimizations +{ + +class RedirectMembersToConstantInputsImpl +{ +public: + /// Search for layers with ConstantLayers as inputs. If the inputs are constant redirect the layers member + /// variable for ConstTensors (e.g. m_weights) to the data stored in the ConstantLayer it is connected to. + void Run(Graph& graph, Layer& layer) const + { + IgnoreUnused(graph); + + switch (layer.GetType()) + { + case LayerType::BatchNormalization: + break; + case LayerType::Convolution2d: + break; + case LayerType::DepthwiseConvolution2d: + break; + case LayerType::DetectionPostProcess: + break; + case LayerType::FullyConnected: + RedirectWeightsAndBiases<FullyConnectedLayer>(&layer); + break; + case LayerType::Lstm: + break; + case LayerType::TransposeConvolution2d: + break; + default: + break; + } + } + +protected: + RedirectMembersToConstantInputsImpl() = default; + ~RedirectMembersToConstantInputsImpl() = default; + +private: + template <typename LayerT> + static LayerT* RedirectWeightsAndBiases(Layer* layer) + { + LayerT* layerPtr = PolymorphicDowncast<LayerT*>(layer); + + // Loop through input slots to check for constant weights and biases layers. + // Weights index = 1, Biases index = 2. + for (unsigned int inputSlotIndex = 1; inputSlotIndex != layerPtr->GetNumInputSlots(); ++inputSlotIndex) + { + OutputSlot* outputSlot = layerPtr->GetInputSlot(inputSlotIndex).GetConnectedOutputSlot(); + if (outputSlot->GetOwningLayer().GetType() == LayerType::Constant) + { + // Get constant layer and redirect base layer member variables. + ConstantLayer& constantLayer = dynamic_cast<ConstantLayer&>(outputSlot->GetOwningLayer()); + if (inputSlotIndex == 1) + { + layerPtr->m_Weight = constantLayer.m_LayerOutput; + } + else if (inputSlotIndex == 2) + { + layerPtr->m_Bias = constantLayer.m_LayerOutput; + } + } + } + + return layerPtr; + } +}; + +using RedirectMembersToConstantInputs = OptimizeForType<FullyConnectedLayer, RedirectMembersToConstantInputsImpl>; + +} // namespace optimizations +} // namespace armnn |