From 4a9e24bfc51eec7e593470091fb7e6e435ae3991 Mon Sep 17 00:00:00 2001 From: Derek Lamberti Date: Fri, 3 Jan 2020 16:53:38 +0000 Subject: IVGCVSW-4314 Per-layer backend hint API Change-Id: I6ddcffe792e39b17fcdb8af7f13f4a689ef8019d Signed-off-by: Derek Lamberti --- src/armnn/test/OptimizerTests.cpp | 177 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) (limited to 'src/armnn/test') diff --git a/src/armnn/test/OptimizerTests.cpp b/src/armnn/test/OptimizerTests.cpp index 7ceb104cb5..0ca4fc4764 100644 --- a/src/armnn/test/OptimizerTests.cpp +++ b/src/armnn/test/OptimizerTests.cpp @@ -5,13 +5,20 @@ #include "TestUtils.hpp" +#include #include +#include #include +#include +#include +#include #include #include +#include +#include #include @@ -616,4 +623,174 @@ BOOST_AUTO_TEST_CASE(FoldPadLayerIntoConvolution2dLayer) &IsLayerOfType)); } + + + +class MockLayerSupport : public LayerSupportBase { +public: + bool IsInputSupported(const TensorInfo& /*input*/, + Optional /*reasonIfUnsupported = EmptyOptional()*/) const override + { + return true; + } + + bool IsOutputSupported(const TensorInfo& /*input*/, + Optional /*reasonIfUnsupported = EmptyOptional()*/) const override + { + return true; + } + + bool IsActivationSupported(const TensorInfo& /*input0*/, + const TensorInfo& /*output*/, + const ActivationDescriptor& /*descriptor*/, + Optional /*reasonIfUnsupported = EmptyOptional()*/) const override + { + return true; + } +}; + +template +class MockBackend : public IBackendInternal +{ +public: + MockBackend() = default; + ~MockBackend() = default; + + static const BackendId& GetIdStatic() { return NamePolicy::GetIdStatic(); } + const BackendId& GetId() const override { return GetIdStatic(); } + + IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override { return nullptr; }; + + IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory( + const IBackendInternal::IMemoryManagerSharedPtr&) const override { return nullptr; } + + IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override + { + return nullptr; + } + + IBackendInternal::Optimizations GetOptimizations() const override { return {}; } + IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override + { + return std::make_shared(); + } + + OptimizationViews OptimizeSubgraphView(const SubgraphView&) const override + { + return {}; + }; +}; + + +BOOST_AUTO_TEST_CASE(BackendHintTest) +{ + class TestBackendAssignment : public LayerVisitorBase + { + public: + void VisitInputLayer(const IConnectableLayer* layer, + LayerBindingId id, + const char* name = nullptr) override + { + boost::ignore_unused(id, name); + auto inputLayer = boost::polymorphic_downcast(layer); + BOOST_TEST((inputLayer->GetBackendId() == "MockBackend")); + } + + void VisitOutputLayer(const IConnectableLayer* layer, + LayerBindingId id, + const char* name = nullptr) override + { + boost::ignore_unused(id, name); + auto outputLayer = boost::polymorphic_downcast(layer); + BOOST_TEST((outputLayer->GetBackendId() == "MockBackend")); + } + + void VisitActivationLayer(const IConnectableLayer* layer, + const ActivationDescriptor& activationDescriptor, + const char* name = nullptr) override + { + boost::ignore_unused(activationDescriptor, name); + auto activation = boost::polymorphic_downcast(layer); + BOOST_TEST((activation->GetBackendId() == "CustomBackend")); + } + }; + + struct CustomPolicy + { + static const BackendId& GetIdStatic() + { + static BackendId id="CustomBackend"; + return id; + } + }; + + struct MockPolicy + { + static const BackendId& GetIdStatic() + { + static BackendId id="MockBackend"; + return id; + } + }; + + auto& backendRegistry = BackendRegistryInstance(); + + backendRegistry.Register("MockBackend", [](){ + return std::make_unique>(); + }); + + backendRegistry.Register("CustomBackend", [](){ + return std::make_unique>(); + }); + + // Define the network + auto network = INetwork::Create(); + ActivationDescriptor desc; + desc.m_Function = ActivationFunction::Linear; + + std::unique_ptr graph = std::make_unique(); + auto input = graph->AddLayer(0, "input"); + auto act = graph->AddLayer(desc, "activation"); + auto output = graph->AddLayer(0, "output"); + + BackendId customBackendId("CustomBackend"); + act->BackendSelectionHint(customBackendId); + + input->GetOutputSlot(0).Connect(act->GetInputSlot(0)); + act->GetOutputSlot(0).Connect(output->GetInputSlot(0)); + + + auto optNet = IOptimizedNetworkPtr(new OptimizedNetwork(std::move(graph)), &IOptimizedNetwork::Destroy); + + OptimizedNetwork* optNetObjPtr = boost::polymorphic_downcast(optNet.get()); + + // Get the optimized graph + Graph& optGraph = optNetObjPtr->GetGraph(); + + + std::vector prefs{"MockBackend", "CustomBackend"}; + + BackendIdSet availableBackends = {"CustomBackend", "MockBackend"}; + DeviceSpec spec(availableBackends); + + BackendSettings backendSettings(prefs, spec); + + // Assign an available backend to each layer + Graph::Iterator firstLayer = optGraph.begin(); + Graph::Iterator lastLayer = optGraph.end(); + OptimizationResult res = AssignBackends(optNetObjPtr, + backendSettings, + firstLayer, + lastLayer, + EmptyOptional()); + + BOOST_TEST(res.IsOk()); + + TestBackendAssignment visitor; + for (auto it =firstLayer; it != lastLayer; ++it) + { + (*it)->Accept(visitor); + } +} + BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.1