From 005288d39f5bdcc3729c94e1d50caad968299bac Mon Sep 17 00:00:00 2001 From: David Monahan Date: Tue, 14 May 2019 10:42:38 +0100 Subject: IVGCVSW-3033 New unit tests to ensure the Optimizer can handle multiple Graph objects Signed-off-by: David Monahan Change-Id: I7ccc10a4d81eaac724a374a0d8abc70c9c79a3f4 --- src/backends/backendsCommon/test/CMakeLists.txt | 1 + .../backendsCommon/test/OptimizationViewsTests.cpp | 151 +++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 src/backends/backendsCommon/test/OptimizationViewsTests.cpp diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index 83a1da5cd9..f91fd9cf31 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -36,6 +36,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources MockBackendId.hpp OptimizedNetworkTests.cpp OptimizeSubgraphViewTests.cpp + OptimizationViewsTests.cpp PermuteTestImpl.hpp Pooling2dTestImpl.hpp QuantizeHelper.hpp diff --git a/src/backends/backendsCommon/test/OptimizationViewsTests.cpp b/src/backends/backendsCommon/test/OptimizationViewsTests.cpp new file mode 100644 index 0000000000..2fdda5e759 --- /dev/null +++ b/src/backends/backendsCommon/test/OptimizationViewsTests.cpp @@ -0,0 +1,151 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include +#include +#include +#include +#include +#include + +#include "CommonTestUtils.hpp" + +using namespace armnn; + +BOOST_AUTO_TEST_SUITE(OptimizationViewsTestSuite) + +BOOST_AUTO_TEST_CASE(OptimizedViewsSubgraphLayerCount) +{ + OptimizationViews view; + // Construct a graph with 3 layers + Graph& baseGraph = view.GetGraph(); + + Layer* const inputLayer = baseGraph.AddLayer(0, "input"); + + Convolution2dDescriptor convDescriptor; + PreCompiledDescriptor substitutionLayerDescriptor(1, 1); + Layer* const convLayer1 = baseGraph.AddLayer(convDescriptor, "conv1"); + Layer* const convLayer2 = baseGraph.AddLayer(convDescriptor, "conv2"); + Layer* const substitutableCompiledLayer = + baseGraph.AddLayer(substitutionLayerDescriptor, "pre-compiled"); + + Layer* const outputLayer = baseGraph.AddLayer(0, "output"); + + inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0)); + convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0)); + convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + + // Subgraph for a failed layer + SubgraphViewSelector::SubgraphViewPtr failedSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateOutputsFrom({convLayer1}), + {convLayer1}); + // Subgraph for an untouched layer + SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer2}), + CreateOutputsFrom({convLayer2}), + {convLayer2}); + // Subgraph for a substitutable layer + SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateOutputsFrom({convLayer2}), + {substitutableCompiledLayer}); + // Create a Graph containing a layer to substitute in + Graph substitutableGraph; + Layer* const substitutionpreCompiledLayer = + substitutableGraph.AddLayer(substitutionLayerDescriptor, "pre-compiled"); + + // Subgraph for a substitution layer + SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}), + CreateOutputsFrom({substitutionpreCompiledLayer}), + {substitutionpreCompiledLayer}); + + // Sub in the graph + baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph); + + view.AddFailedSubgraph(SubgraphView(*failedSubgraph)); + view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph)); + + SubgraphViewSelector::SubgraphViewPtr baseSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateOutputsFrom({convLayer2}), + {substitutionpreCompiledLayer}); + view.AddSubstitution({*baseSubgraph, *substitutionSubgraph}); + + // Construct original subgraph to compare against + SubgraphViewSelector::SubgraphViewPtr originalSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateOutputsFrom({convLayer2}), + {convLayer1, convLayer2, substitutionpreCompiledLayer}); + + BOOST_CHECK(view.Validate(*originalSubgraph)); +} + +BOOST_AUTO_TEST_CASE(OptimizedViewsSubgraphLayerCountFailValidate) +{ + OptimizationViews view; + // Construct a graph with 3 layers + Graph& baseGraph = view.GetGraph(); + + Layer* const inputLayer = baseGraph.AddLayer(0, "input"); + + Convolution2dDescriptor convDescriptor; + PreCompiledDescriptor substitutionLayerDescriptor(1, 1); + Layer* const convLayer1 = baseGraph.AddLayer(convDescriptor, "conv1"); + Layer* const convLayer2 = baseGraph.AddLayer(convDescriptor, "conv2"); + Layer* const substitutableCompiledLayer = + baseGraph.AddLayer(substitutionLayerDescriptor, "pre-compiled"); + + Layer* const outputLayer = baseGraph.AddLayer(0, "output"); + + inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0)); + convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0)); + convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + + // Subgraph for an untouched layer + SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer2}), + CreateOutputsFrom({convLayer2}), + {convLayer2}); + // Subgraph for a substitutable layer + SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateOutputsFrom({convLayer2}), + {substitutableCompiledLayer}); + // Create a Graph containing a layer to substitute in + Graph substitutableGraph; + Layer* const substitutionpreCompiledLayer = + substitutableGraph.AddLayer(substitutionLayerDescriptor, "pre-compiled"); + + // Subgraph for a substitution layer + SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}), + CreateOutputsFrom({substitutionpreCompiledLayer}), + {substitutionpreCompiledLayer}); + + // Sub in the graph + baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph); + + view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph)); + + SubgraphViewSelector::SubgraphViewPtr baseSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateOutputsFrom({convLayer2}), + {substitutionpreCompiledLayer}); + view.AddSubstitution({*baseSubgraph, *substitutionSubgraph}); + + // Construct original subgraph to compare against + SubgraphViewSelector::SubgraphViewPtr originalSubgraph = + CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}), + CreateOutputsFrom({convLayer2}), + {convLayer1, convLayer2, substitutionpreCompiledLayer}); + + // Validate should fail as convLayer1 is not counted + BOOST_CHECK(!view.Validate(*originalSubgraph)); +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file -- cgit v1.2.1