diff options
author | Matthew Sloyan <matthew.sloyan@arm.com> | 2022-10-28 18:02:17 +0100 |
---|---|---|
committer | Matthew Sloyan <matthew.sloyan@arm.com> | 2022-11-02 15:08:37 +0000 |
commit | 164bf4f29f6f1b2a3e6714ef4f5a21fc0fd16c2b (patch) | |
tree | e7296130a787578e1be4d3a93de46a9c466944b4 /src/backends/tosaReference/TosaRefBackend.cpp | |
parent | 2e950f4fa774ac995230addea898f3b11bf146cc (diff) | |
download | armnn-164bf4f29f6f1b2a3e6714ef4f5a21fc0fd16c2b.tar.gz |
IVGCVSW-7164 Implement TosaRefBackend::OptimizeSubgraphView
* Added TosaRefBackend::OptimizeSubgraphView implementation.
* Generalised TosaRefLayerSupport::IsLayerSupported to work with any
operator.
* Changed TosaCommon.hpp utils to inline functions.
* Added source files for TosaMappings.hpp and AdditionOperator.hpp.
* Fixed multiple defines issue with HALF_ROUND_STYLE and
HALF_ROUND_TIES_TO_EVEN.
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: Ib2576ec3fb97faa3a2256b2fb93ec16ac8745760
Diffstat (limited to 'src/backends/tosaReference/TosaRefBackend.cpp')
-rw-r--r-- | src/backends/tosaReference/TosaRefBackend.cpp | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/backends/tosaReference/TosaRefBackend.cpp b/src/backends/tosaReference/TosaRefBackend.cpp index 093802958b..688cf93b49 100644 --- a/src/backends/tosaReference/TosaRefBackend.cpp +++ b/src/backends/tosaReference/TosaRefBackend.cpp @@ -9,6 +9,7 @@ #include "TosaRefLayerSupport.hpp" #include "TosaRefTensorHandleFactory.hpp" +#include <tosaCommon/TosaMappings.hpp> #include <armnn/BackendRegistry.hpp> #include <armnn/backends/IBackendContext.hpp> #include <armnn/backends/IMemoryManager.hpp> @@ -21,6 +22,13 @@ namespace armnn { +// Utility function to construct a valid Deleter for TosaSerializationHandler ptrs passed back to ArmNN +template <typename T> +void DeleteAsType(const void* const blob) +{ + delete static_cast<const T*>(blob); +} + const BackendId& TosaRefBackend::GetIdStatic() { static const BackendId s_Id{TosaRefBackendId()}; @@ -75,11 +83,44 @@ OptimizationViews TosaRefBackend::OptimizeSubgraphView(const SubgraphView& subgr const ModelOptions& modelOptions) const { OptimizationViews optimizationViews(modelOptions); - optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph)); - + auto handler = std::make_unique<TosaSerializationHandler>(); + + auto it = subgraph.endIConnectable(); + while (it != subgraph.beginIConnectable()) + { + --it; + Layer &base = *(PolymorphicDowncast<Layer*>(*it)); + + if(base.GetType() == armnn::LayerType::Input || + base.GetType() == armnn::LayerType::Output) + { + continue; + } + + tosa::TosaSerializationBasicBlock* mappings = GetTosaMappingFromLayer(&base); + handler.get()->GetBlocks().push_back(mappings); + } + + auto compiledBlob = + std::make_unique<PreCompiledObjectPtr>(handler.release(), DeleteAsType<TosaSerializationHandler>); + + IConnectableLayer* preCompiledLayer = optimizationViews.GetINetwork()->AddPrecompiledLayer( + PreCompiledDescriptor(subgraph.GetNumInputSlots(), subgraph.GetNumOutputSlots()), + std::move(*compiledBlob), + armnn::Optional<BackendId>(GetId()), + "TOSA_Pre_Compiled_Layer"); + + // Copy the output tensor infos from sub-graph + for (unsigned int i = 0; i < subgraph.GetNumOutputSlots(); i++) + { + preCompiledLayer->GetOutputSlot(i).SetTensorInfo(subgraph.GetIOutputSlot(i)->GetTensorInfo()); + } + + optimizationViews.AddSubstitution({ std::move(subgraph), SubgraphView(preCompiledLayer) }); return optimizationViews; } + std::vector<ITensorHandleFactory::FactoryId> TosaRefBackend::GetHandleFactoryPreferences() const { return std::vector<ITensorHandleFactory::FactoryId> { TosaRefTensorHandleFactory::GetIdStatic() }; |