From 34b429c2215bab7fd12b761dd5c200414c1b4a5b Mon Sep 17 00:00:00 2001 From: Cathal Corbett Date: Fri, 24 Dec 2021 12:24:40 +0000 Subject: IVGCVSW-6629 Stabilize the ILayerSupport interface with unified strategy. * New Virtual Function Added. * Implemented in Ref Neon CL with switch statement for all layers. * Deprecate original IsXXXLayerSupported functions. * Ensure Npu not broken with change. Change-Id: Icf61b16beec83d6af1cb287e24ab1e98a6138c8c Signed-off-by: Cathal Corbett --- .../backendsCommon/test/DynamicBackendTests.hpp | 20 ++++----- src/backends/backendsCommon/test/MockBackend.hpp | 49 ++++++++++++++++++++++ .../test/mockBackend/MockImportLayerSupport.hpp | 24 +++++++++++ 3 files changed, 82 insertions(+), 11 deletions(-) (limited to 'src/backends/backendsCommon/test') diff --git a/src/backends/backendsCommon/test/DynamicBackendTests.hpp b/src/backends/backendsCommon/test/DynamicBackendTests.hpp index 49e90791bf..0d06595ebe 100644 --- a/src/backends/backendsCommon/test/DynamicBackendTests.hpp +++ b/src/backends/backendsCommon/test/DynamicBackendTests.hpp @@ -1450,12 +1450,11 @@ void CreateReferenceDynamicBackendTestImpl() TensorInfo outputInfo(outputShape, DataType::Float32); TensorInfo weightInfo(weightShape, DataType::Float32); Convolution2dDescriptor convolution2dDescriptor; + std::vector infos = {inputInfo, outputInfo, weightInfo, TensorInfo()}; bool referenceConvolution2dSupported = - referenceLayerSupport->IsConvolution2dSupported(inputInfo, - outputInfo, - convolution2dDescriptor, - weightInfo, - EmptyOptional()); + referenceLayerSupport->IsLayerSupported(LayerType::Convolution2d, + infos, + convolution2dDescriptor); CHECK(referenceConvolution2dSupported); // Test the backend instance by creating a workload @@ -1535,12 +1534,11 @@ void CreateSampleDynamicBackendTestImpl() TensorInfo outputInfo(outputShape, DataType::Float32); TensorInfo weightInfo(weightShape, DataType::Float32); Convolution2dDescriptor convolution2dDescriptor; - bool sampleConvolution2dSupported = - sampleLayerSupport->IsConvolution2dSupported(inputInfo, - outputInfo, - convolution2dDescriptor, - weightInfo, - EmptyOptional()); + std::vector infos = {inputInfo, outputInfo, weightInfo, TensorInfo()}; + bool referenceConvolution2dSupported = + referenceLayerSupport->IsLayerSupported(LayerType::Convolution2d, + infos, + convolution2dDescriptor); CHECK(!sampleConvolution2dSupported); // Test the backend instance by creating a workload diff --git a/src/backends/backendsCommon/test/MockBackend.hpp b/src/backends/backendsCommon/test/MockBackend.hpp index 3a5e79a224..df133dfed2 100644 --- a/src/backends/backendsCommon/test/MockBackend.hpp +++ b/src/backends/backendsCommon/test/MockBackend.hpp @@ -172,6 +172,55 @@ public: class MockLayerSupport : public LayerSupportBase { public: + bool IsLayerSupported(const LayerType& type, + const std::vector& infos, + const BaseDescriptor& descriptor, + const Optional& /*lstmParamsInfo*/, + const Optional& /*quantizedLstmParamsInfo*/, + Optional reasonIfUnsupported) const override + { + switch(type) + { + case LayerType::Input: + return IsInputSupported(infos[0], reasonIfUnsupported); + case LayerType::Output: + return IsOutputSupported(infos[0], reasonIfUnsupported); + case LayerType::Addition: + return IsAdditionSupported(infos[0], infos[1], infos[2], reasonIfUnsupported); + case LayerType::Convolution2d: + { + if (infos.size() != 4) + { + throw InvalidArgumentException("Invalid number of TransposeConvolution2d " + "TensorInfos. TensorInfos should be of format: " + "{input, output, weights, biases}."); + } + + auto desc = *(PolymorphicDowncast(&descriptor)); + if (infos[3] == TensorInfo()) + { + return IsConvolution2dSupported(infos[0], + infos[1], + desc, + infos[2], + EmptyOptional(), + reasonIfUnsupported); + } + else + { + return IsConvolution2dSupported(infos[0], + infos[1], + desc, + infos[2], + infos[3], + reasonIfUnsupported); + } + } + default: + return false; + } + } + bool IsInputSupported(const TensorInfo& /*input*/, Optional /*reasonIfUnsupported = EmptyOptional()*/) const override { diff --git a/src/backends/backendsCommon/test/mockBackend/MockImportLayerSupport.hpp b/src/backends/backendsCommon/test/mockBackend/MockImportLayerSupport.hpp index 75e637efdf..380ce4a3f5 100644 --- a/src/backends/backendsCommon/test/mockBackend/MockImportLayerSupport.hpp +++ b/src/backends/backendsCommon/test/mockBackend/MockImportLayerSupport.hpp @@ -14,6 +14,30 @@ namespace armnn class MockImportLayerSupport : public LayerSupportBase { public: + bool IsLayerSupported(const LayerType& type, + const std::vector& infos, + const BaseDescriptor& /*descriptor*/, + const Optional& /*lstmParamsInfo*/, + const Optional& /*quantizedLstmParamsInfo*/, + Optional reasonIfUnsupported) const override + { + switch(type) + { + case LayerType::Addition: + return IsAdditionSupported(infos[0], infos[1], infos[2], reasonIfUnsupported); + case LayerType::Input: + return IsInputSupported(infos[0], reasonIfUnsupported); + case LayerType::Output: + return IsOutputSupported(infos[0], reasonIfUnsupported); + case LayerType::MemCopy: + return LayerSupportBase::IsMemCopySupported(infos[0], infos[1], reasonIfUnsupported); + case LayerType::MemImport: + return LayerSupportBase::IsMemImportSupported(infos[0], infos[1], reasonIfUnsupported); + default: + return false; + } + } + bool IsAdditionSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, -- cgit v1.2.1