From 3d6898cc5c83b133a3a2d6c79e2ed8905d236a4d Mon Sep 17 00:00:00 2001 From: Matteo Martincigh Date: Tue, 15 Jan 2019 16:11:44 +0000 Subject: [PATCH] IVGCVSW-2455 Move the extra backend code to a new git repo * Refactored all the workload factories to use "virtual" properly * Removed the precompiled layer support from the optimizer * Disabled compiler optimization for debug build to ease debugging Change-Id: I6ab83abd78f422771359295e25b79bb9be613cfd --- cmake/GlobalConfig.cmake | 2 +- include/armnn/ILayerSupport.hpp | 10 +- src/armnn/Network.cpp | 25 +- src/backends/backendsCommon/LayerSupportBase.cpp | 30 +- src/backends/backendsCommon/LayerSupportBase.hpp | 7 +- src/backends/backendsCommon/test/CMakeLists.txt | 2 - src/backends/backendsCommon/test/LayerTests.cpp | 38 +- .../backendsCommon/test/PreCompiledTestImpl.cpp | 491 --------------------- .../backendsCommon/test/PreCompiledTestImpl.hpp | 27 -- src/backends/cl/ClWorkloadFactory.hpp | 174 ++++---- src/backends/cl/test/ClLayerTests.cpp | 0 src/backends/neon/NeonWorkloadFactory.hpp | 174 ++++---- src/backends/reference/RefWorkloadFactory.hpp | 176 ++++---- 13 files changed, 289 insertions(+), 867 deletions(-) delete mode 100644 src/backends/backendsCommon/test/PreCompiledTestImpl.cpp delete mode 100644 src/backends/backendsCommon/test/PreCompiledTestImpl.hpp mode change 100755 => 100644 src/backends/cl/test/ClLayerTests.cpp diff --git a/cmake/GlobalConfig.cmake b/cmake/GlobalConfig.cmake index 9d7dab0..969b234 100644 --- a/cmake/GlobalConfig.cmake +++ b/cmake/GlobalConfig.cmake @@ -67,7 +67,7 @@ endif() # Compiler flags for Debug builds if(COMPILER_IS_GNU_LIKE) - set(CMAKE_CXX_FLAGS_DEBUG "-g") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) set(CMAKE_CXX_FLAGS_DEBUG "/MDd /ZI /Od") # Disable SAFESEH which is necessary for Edit and Continue to work diff --git a/include/armnn/ILayerSupport.hpp b/include/armnn/ILayerSupport.hpp index 8d800f4..d9e3d0a 100644 --- a/include/armnn/ILayerSupport.hpp +++ b/include/armnn/ILayerSupport.hpp @@ -102,6 +102,11 @@ public: const FullyConnectedDescriptor& descriptor, Optional reasonIfUnsupported = EmptyOptional()) const = 0; + virtual bool IsGreaterSupported(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& ouput, + Optional reasonIfUnsupported = EmptyOptional()) const = 0; + virtual bool IsInputSupported(const TensorInfo& input, Optional reasonIfUnsupported = EmptyOptional()) const = 0; @@ -232,11 +237,6 @@ public: const TensorInfo& input1, const TensorInfo& output, Optional reasonIfUnsupported = EmptyOptional()) const = 0; - - virtual bool IsGreaterSupported(const TensorInfo& input0, - const TensorInfo& input1, - const TensorInfo& ouput, - Optional reasonIfUnsupported = EmptyOptional()) const = 0; }; // class ILayerSupport using ILayerSupportSharedPtr = std::shared_ptr; diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp index 8a1437a..f9ebad2 100644 --- a/src/armnn/Network.cpp +++ b/src/armnn/Network.cpp @@ -430,28 +430,6 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, Optimizer::Pass(optNetObjPtr->GetGraph(), MakeOptimizations(OptimizeInverseConversionsFp16(), OptimizeInverseConversionsFp32())); - // Insert pre-compiled layers where required by the backend - // TODO: This is a dummy/default backend id used for making the code build until - // we've properly refactored the optimizer - const BackendId backendId(Compute::Undefined); - auto const& backendRegistry = BackendRegistryInstance(); - if (backendRegistry.IsBackendRegistered(backendId)) - { - // Obtain a backend object using the registered factory - auto backendFactory = backendRegistry.GetFactory(backendId); - auto backendObjPtr = backendFactory(); - - OptimizationResult insertPreCompiledLayersResult = InsertPreCompiledLayers(optNetObjPtr, - backendObjPtr, - backendSettings, - errMessages); - if (insertPreCompiledLayersResult.m_Error) - { - // Failed to insert pre-compiled layers - return IOptimizedNetworkPtr(nullptr, &IOptimizedNetwork::Destroy); - } - } - // If the debug flag is set, then insert a DebugLayer after each layer. // NOTE: This optimization can only happen strictly after the PreCompiled layers have // already been inserted @@ -588,8 +566,7 @@ IConnectableLayer* Network::AddDepthwiseConvolution2dLayerImpl( throw InvalidArgumentException("AddDepthwiseConvolution2dLayer: biases cannot be NULL"); } - const auto layer = m_Graph->AddLayer(convolution2dDescriptor, - name); + const auto layer = m_Graph->AddLayer(convolution2dDescriptor, name); layer->m_Weight = std::make_unique(weights); diff --git a/src/backends/backendsCommon/LayerSupportBase.cpp b/src/backends/backendsCommon/LayerSupportBase.cpp index 2e43657..9d68d35 100644 --- a/src/backends/backendsCommon/LayerSupportBase.cpp +++ b/src/backends/backendsCommon/LayerSupportBase.cpp @@ -164,6 +164,14 @@ bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo& input0, return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } +bool LayerSupportBase::IsGreaterSupported(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output, + Optional reasonIfUnsupported) const +{ + return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); +} + bool LayerSupportBase::IsInputSupported(const TensorInfo& input, Optional reasonIfUnsupported) const { @@ -313,6 +321,13 @@ bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& input, return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } +bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &input, + const TensorInfo &output, + Optional reasonIfUnsupported) const +{ + return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); +} + bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& input, const TensorInfo& output, const SoftmaxDescriptor& descriptor, @@ -352,19 +367,4 @@ bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& input0, return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } -bool LayerSupportBase::IsGreaterSupported(const TensorInfo& input0, - const TensorInfo& input1, - const TensorInfo& output, - Optional reasonIfUnsupported) const -{ - return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); -} - -bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &input, - const TensorInfo &output, - Optional reasonIfUnsupported) const -{ - return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); -} - } // namespace armnn diff --git a/src/backends/backendsCommon/LayerSupportBase.hpp b/src/backends/backendsCommon/LayerSupportBase.hpp index 77cb302..5a71b44 100644 --- a/src/backends/backendsCommon/LayerSupportBase.hpp +++ b/src/backends/backendsCommon/LayerSupportBase.hpp @@ -44,9 +44,10 @@ public: const TensorInfo& output, Optional reasonIfUnsupported = EmptyOptional()) const override; - bool IsConvertFp32ToFp16Supported(const TensorInfo& input, - const TensorInfo& output, - Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsConvertFp32ToFp16Supported( + const TensorInfo& input, + const TensorInfo& output, + Optional reasonIfUnsupported = EmptyOptional()) const override; bool IsConvolution2dSupported(const TensorInfo& input, const TensorInfo& output, diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index 7edd93e..8107176 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -28,8 +28,6 @@ list(APPEND armnnBackendsCommonUnitTests_sources OptimizedNetworkTests.cpp PermuteTestImpl.hpp Pooling2dTestImpl.hpp - PreCompiledTestImpl.cpp - PreCompiledTestImpl.hpp QuantizeHelper.hpp ReshapeTestImpl.hpp RuntimeTestImpl.hpp diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index c9188e3..95fa50b 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -39,7 +39,6 @@ #include "StridedSliceTestImpl.hpp" #include "NormTestImpl.hpp" #include "PermuteTestImpl.hpp" -#include "PreCompiledTestImpl.hpp" #include "LstmTestImpl.hpp" #include "ConvertFp16ToFp32TestImpl.hpp" #include "ConvertFp32ToFp16TestImpl.hpp" @@ -8656,41 +8655,6 @@ LayerTestResult Debug1DUint8Test( return Debug1DTest(workloadFactory, memoryManager); } -LayerTestResult PreCompiledConvolution2dTest( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) -{ - return PreCompiledConvolution2dTestImpl(workloadFactory, memoryManager); -} - -LayerTestResult PreCompiledConvolution2dStride2x2Test( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) -{ - return PreCompiledConvolution2dStride2x2TestImpl(workloadFactory, memoryManager); -} - -LayerTestResult PreCompiledDepthwiseConvolution2dTest( - armnn::IWorkloadFactory & workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager) -{ - return PreCompiledDepthwiseConvolution2dTestImpl(workloadFactory, memoryManager); -} - -LayerTestResult PreCompiledDepthwiseConvolution2dStride2x2Test( - armnn::IWorkloadFactory & workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager) -{ - return PreCompiledDepthwiseConvolution2dStride2x2TestImpl(workloadFactory, memoryManager); -} - -LayerTestResult PreCompiledMaxPooling2dTest( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) -{ - return PreCompiledMaxPooling2dTestImpl(workloadFactory, memoryManager); -} - LayerTestResult Gather1DParamsFloatTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) @@ -8732,4 +8696,4 @@ LayerTestResult GatherMultiDimParamsMultiDimIndicesUint8Test( { return GatherMultiDimParamsMultiDimIndicesTestImpl( workloadFactory, memoryManager); -} \ No newline at end of file +} diff --git a/src/backends/backendsCommon/test/PreCompiledTestImpl.cpp b/src/backends/backendsCommon/test/PreCompiledTestImpl.cpp deleted file mode 100644 index 5a2bba1..0000000 --- a/src/backends/backendsCommon/test/PreCompiledTestImpl.cpp +++ /dev/null @@ -1,491 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "PreCompiledTestImpl.hpp" - -#include "TensorCopyUtils.hpp" - -#include -#include -#include - -#include -#include - -#include - -#include - -#include - -using namespace armnn; - -namespace -{ - -template -struct PreCompiledConvolutionHelper -{ -}; - -template<> -struct PreCompiledConvolutionHelper -{ - static IConnectableLayer* AddConvolutionLayerToNetwork( - Network& network, - Convolution2dDescriptor descriptor, - const ConstTensor& weights, - const ConstTensor& biases) - { - return network.AddConvolution2dLayer(descriptor, weights, biases, "convolution"); - } -}; - -template<> -struct PreCompiledConvolutionHelper -{ - static IConnectableLayer* AddConvolutionLayerToNetwork( - Network& network, - DepthwiseConvolution2dDescriptor descriptor, - const ConstTensor& weights, - const ConstTensor& biases) - { - return network.AddDepthwiseConvolution2dLayer(descriptor, weights, biases, "depthwiseConvolution"); - } -}; - -template -ConvolutionDescriptor CreateConvolutionDescriptor(unsigned int stride, unsigned int padding) -{ - ConvolutionDescriptor descriptor; - - descriptor.m_StrideX = stride; - descriptor.m_StrideY = stride; - descriptor.m_PadLeft = padding; - descriptor.m_PadRight = padding; - descriptor.m_PadTop = padding; - descriptor.m_PadBottom = padding; - descriptor.m_BiasEnabled = true; - descriptor.m_DataLayout = DataLayout::NHWC; - - return descriptor; -} - -static std::vector CreateIdentityConvolutionKernel( - unsigned int kernelSize, unsigned int channels) -{ - BOOST_ASSERT(kernelSize % 2 == 1); // kernelSize need to be an odd number - - const unsigned int numElements = channels * (kernelSize * kernelSize); - std::vector kernel(numElements, 0u); - - unsigned int centerIndex = kernelSize / 2; - for(unsigned int y = 0u; y < kernelSize; y++) - { - for(unsigned int x = 0u; x < kernelSize; x++) - { - for(unsigned int channel = 0u; channel < channels; channel++) - { - if (x == centerIndex && y == centerIndex) - { - const unsigned int flatIndex = - (y * kernelSize * channels) + (x * channels) + channel; - - kernel[flatIndex] = 1u; - } - } - } - } - - return kernel; -} - -template -std::vector GetIdentityConvolutionExpectedOutputData( - const TensorInfo& inputInfo, - const TensorInfo& outputInfo, - const ConvolutionDescriptor& descriptor, - const std::vector& inputData) -{ - const unsigned int outputDataSize = outputInfo.GetNumElements(); - std::vector expectedOutputData(outputDataSize); - - const unsigned int channels = outputInfo.GetShape()[3]; - BOOST_ASSERT(channels == inputInfo.GetShape()[3]); - - const unsigned int inputW = inputInfo.GetShape()[2]; - - const unsigned int outputH = outputInfo.GetShape()[1]; - const unsigned int outputW = outputInfo.GetShape()[2]; - - // Pick values from the input buffer, but after each iteration skip a number of - // rows and columns equal to the stride in the respective dimension - for (unsigned int inputY = 0, outputY = 0; outputY < outputH; inputY += descriptor.m_StrideY, outputY++) - { - for (unsigned int inputX = 0, outputX = 0; outputX < outputW; inputX += descriptor.m_StrideX, outputX++) - { - for (unsigned int channel = 0u; channel < channels; channel++) - { - const unsigned int inputIndex = - (inputY * inputW * channels) + (inputX * channels) + channel; - const unsigned int outputIndex = - (outputY * outputW * channels) + (outputX * channels) + channel; - - expectedOutputData[outputIndex] = inputData[inputIndex]; - } - } - } - - return expectedOutputData; -} - -armnn::PreCompiledLayer* FindPreCompiledLayer(armnn::Graph& optimisedGraph) -{ - for (auto& layer : optimisedGraph) - { - if (layer->GetType() == armnn::LayerType::PreCompiled) - { - return boost::polymorphic_pointer_downcast(layer); - } - } - - // No pre-compiled layer found - return nullptr; -} - -// NOTE: This only supports a single input and a single output -LayerTestResult OptimiseAndRunNetwork(armnn::IWorkloadFactory& workloadFactory, - Network& net, - TensorInfo inputInfo, - std::vector inputData, - TensorInfo outputInfo, - std::vector expectedOutputData) -{ - // Optimize the network for the backend supported by the factory - std::vector backends = {workloadFactory.GetBackendId()}; - IRuntimePtr runtime(IRuntime::Create(IRuntime::CreationOptions())); - IOptimizedNetworkPtr optimizedNet = Optimize(net, backends, runtime->GetDeviceSpec(), OptimizerOptions()); - if (!optimizedNet) - { - throw RuntimeException(std::string("Failed to optimize network for ") + std::string(backends[0]), - CHECK_LOCATION()); - } - - // Find the pre-compiled layer in the optimised graph - Graph& optimisedGraph = static_cast(optimizedNet.get())->GetGraph(); - PreCompiledLayer* preCompiledLayer = FindPreCompiledLayer(optimisedGraph); - if (!preCompiledLayer) - { - throw RuntimeException("Could not find pre-compiled layer in optimised graph", CHECK_LOCATION()); - } - - // Create the tensor handles - for (auto&& layer : optimisedGraph.TopologicalSort()) - { - layer->CreateTensorHandles(optimisedGraph, workloadFactory); - } - - // Create the pre-compiled workload - auto workload = preCompiledLayer->CreateWorkload(optimisedGraph, workloadFactory); - - // Set the input data - boost::multi_array input = MakeTensor(inputInfo, inputData); - const QueueDescriptor& workloadData = - static_cast*>(workload.get())->GetData(); - CopyDataToITensorHandle(workloadData.m_Inputs[0], &input[0][0][0][0]); - - // Execute the workload - workload->Execute(); - - // Set the expected and actual outputs - LayerTestResult result(outputInfo); - result.outputExpected = MakeTensor(outputInfo, expectedOutputData); - CopyDataFromITensorHandle(&result.output[0][0][0][0], workloadData.m_Outputs[0]); - return result; -} - -} // anonymous namespace - -template -LayerTestResult PreCompiledConvolution2dTestImpl( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - unsigned int inputSize, - unsigned int outputSize, - unsigned int channels, - unsigned int kernelSize, - const ConvolutionDescriptor& descriptor, - bool isDepthwiseConvolution = false) -{ - BOOST_ASSERT(descriptor.m_BiasEnabled == true); - BOOST_ASSERT(descriptor.m_DataLayout == DataLayout::NHWC); - - // Set up tensor shapes and infos - const TensorShape inputShape ({1, inputSize, inputSize, channels}); - const TensorShape outputShape({1, outputSize, outputSize, channels}); - const TensorShape kernelShape = isDepthwiseConvolution - // The format for the depthwise convolution is MIHW - ? TensorShape({1, channels, kernelSize, kernelSize}) - // The format for the regular convolution depends on the layout of the inputs, - // in this case is NHWC - : TensorShape({1, kernelSize, kernelSize, channels}); - const TensorShape biasesShape({1, 1, 1, channels}); - - // NOTE: inputScale * weightsScale / outputScale must be >= 0.0 and < 1.0 - TensorInfo inputInfo(inputShape, DataType::QuantisedAsymm8, 1.0f, 0); - TensorInfo outputInfo(outputShape, DataType::QuantisedAsymm8, 2.0f, 0); - TensorInfo weightsInfo(kernelShape, DataType::QuantisedAsymm8, 1.0f, 0); - TensorInfo biasesInfo(biasesShape, DataType::Signed32, 1.0f, 0); - - // Populate weight and bias data - std::vector weightsData = CreateIdentityConvolutionKernel(kernelSize, channels); - - // NOTE: We need to multiply the elements of the identity kernel by 2 - // to compensate for the scaling factor - std::transform(weightsData.begin(), weightsData.end(), weightsData.begin(), - [](uint8_t w) -> uint8_t { return static_cast(w * 2); }); - - const unsigned int biasDataSize = biasesInfo.GetNumElements(); - std::vector biasesData(biasDataSize, 0); - - // Construct network - Network network; - ConstTensor weights(weightsInfo, weightsData); - ConstTensor biases(biasesInfo, biasesData); - - IConnectableLayer* const inputLayer = network.AddInputLayer(0, "input"); - - IConnectableLayer* const convolutionLayer = - PreCompiledConvolutionHelper - ::AddConvolutionLayerToNetwork(network, descriptor, weights, biases); - - IConnectableLayer* const outputLayer = network.AddOutputLayer(0, "output"); - - inputLayer->GetOutputSlot(0).Connect(convolutionLayer->GetInputSlot(0)); - inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo); - - convolutionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); - convolutionLayer->GetOutputSlot(0).SetTensorInfo(outputInfo); - - // Generate input data: sequence [0, 1 .. 255] - const unsigned int inputDataSize = inputInfo.GetNumElements(); - std::vector inputData(inputDataSize); - std::iota(inputData.begin(), inputData.end(), 0); - - // Set expected output - std::vector expectedOutputData = - GetIdentityConvolutionExpectedOutputData(inputInfo, - outputInfo, - descriptor, - inputData); - - return OptimiseAndRunNetwork(workloadFactory, - network, - inputInfo, - inputData, - outputInfo, - expectedOutputData); -} - -LayerTestResult PreCompiledConvolution2dTestImpl( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) -{ - const unsigned int inputSize = 16; - const unsigned int outputSize = 16; - const unsigned int channels = 1; - const unsigned int kernelSize = 3; - const unsigned int stride = 1; - const unsigned int padding = 1; - - Convolution2dDescriptor descriptor = - CreateConvolutionDescriptor(stride, padding); - - return PreCompiledConvolution2dTestImpl(workloadFactory, - memoryManager, - inputSize, - outputSize, - channels, - kernelSize, - descriptor); -} - -LayerTestResult PreCompiledConvolution2dStride2x2TestImpl( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) -{ - const unsigned int inputSize = 16; - const unsigned int outputSize = 8; - const unsigned int channels = 1; - const unsigned int kernelSize = 3; - const unsigned int stride = 2; - const unsigned int padding = 1; - - Convolution2dDescriptor descriptor = - CreateConvolutionDescriptor(stride, padding); - - return PreCompiledConvolution2dTestImpl(workloadFactory, - memoryManager, - inputSize, - outputSize, - channels, - kernelSize, - descriptor); -} - -LayerTestResult PreCompiledDepthwiseConvolution2dTestImpl( - armnn::IWorkloadFactory & workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager) -{ - const unsigned int inputSize = 16; - const unsigned int outputSize = 16; - const unsigned int channels = 3; - const unsigned int kernelSize = 1; - const unsigned int stride = 1; - const unsigned int padding = 0; - - DepthwiseConvolution2dDescriptor descriptor = - CreateConvolutionDescriptor(stride, padding); - - return PreCompiledConvolution2dTestImpl(workloadFactory, - memoryManager, - inputSize, - outputSize, - channels, - kernelSize, - descriptor, - true); -} - -LayerTestResult PreCompiledDepthwiseConvolution2dStride2x2TestImpl( - armnn::IWorkloadFactory & workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager) -{ - const unsigned int inputSize = 16; - const unsigned int outputSize = 8; - const unsigned int channels = 3; - const unsigned int kernelSize = 3; - const unsigned int stride = 2; - const unsigned int padding = 1; - - DepthwiseConvolution2dDescriptor descriptor = - CreateConvolutionDescriptor(stride, padding); - - return PreCompiledConvolution2dTestImpl(workloadFactory, - memoryManager, - inputSize, - outputSize, - channels, - kernelSize, - descriptor); -} - -LayerTestResult PreCompiledMaxPooling2dTestImpl( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) -{ - // Pooling cannot be run in isolation, it must be fused with the previous layer, e.g. Convolution2d. - - // Set up the Convolution descriptor - Convolution2dDescriptor convDescriptor; - convDescriptor.m_StrideX = 1; - convDescriptor.m_StrideY = 1; - convDescriptor.m_BiasEnabled = true; - convDescriptor.m_DataLayout = DataLayout::NHWC; - - // Set up the Convolution weights - TensorInfo weightsInfo(TensorShape({16, 1, 1, 16}), DataType::QuantisedAsymm8, 2.0f, 0); - const unsigned int weightsDataSize = weightsInfo.GetNumElements(); - std::vector weightsData(weightsDataSize); - for (unsigned int i = 0; i < 16; ++i) - { - for (unsigned int j = 0; j < 16; ++j) - { - weightsData[(i * 16) + j] = i == j ? 1.0f : 0.0f; - } - } - ConstTensor weights(weightsInfo, weightsData); - - // Set up the Convolution biases - TensorInfo biasInfo(TensorShape({1, 1, 1, 16}), DataType::Signed32, 1.0f * 2.0f, 0); - const unsigned int biasDataSize = biasInfo.GetNumElements(); - std::vector biasData(biasDataSize, 0); - ConstTensor biases(biasInfo, biasData); - - // Set up the Convolution input - TensorInfo inputInfo(TensorShape({1, 16, 16, 16 }), DataType::QuantisedAsymm8, 1.0f, 0); - const unsigned int inputDataSize = inputInfo.GetNumElements(); - std::vector inputData(inputDataSize); - for (unsigned int i = 0; i < inputDataSize; ++i) - { - inputData[i] = boost::numeric_cast((i * 4) % 250); - } - - // Set up the Convolution output / Pooling input info - TensorInfo convOutputInfo(TensorShape({1, 16, 16, 16 }), DataType::QuantisedAsymm8, 4.0f, 0); - - // Set up the Pooling descriptor - Pooling2dDescriptor poolDescriptor; - poolDescriptor.m_PoolType = PoolingAlgorithm::Max; - poolDescriptor.m_PoolWidth = 2; - poolDescriptor.m_PoolHeight = 2; - poolDescriptor.m_StrideX = 2; - poolDescriptor.m_StrideY = 2; - poolDescriptor.m_PaddingMethod = PaddingMethod::Exclude; - poolDescriptor.m_DataLayout = DataLayout::NHWC; - - // Set the expected output from the Pooling layer - TensorInfo outputInfo(TensorShape({1, 8, 8, 16 }), DataType::QuantisedAsymm8, 4.0f, 0); - const unsigned int outputDataSize = outputInfo.GetNumElements(); - std::vector expectedOutputData(outputDataSize); - // The Maxpooling inputs are the Convolution outputs, i.e. (Convolution inputs / 2) after scale adjustments - // Maxpooling selects the max value in each pool from its inputs and our pool size is 2x2 - for (unsigned int channel = 0; channel < 16; ++channel) - { - for (unsigned int row = 0; row < 8; ++row) - { - for (unsigned int column = 0; column < 8; ++column) - { - // The input and output data indexes are calculated for NHWC data layout. - // Output index: (row * columns * channels) + (column * channels) + channel - auto outIndex = (row * 8 * 16) + (column * 16) + channel; - // Input index: (row * strideY * columns * channels) + (column * strideX * channels) + channel - // and we take 4 entries for the 2x2 pool - auto in0Index = ((row * 2) * 16 * 16) + ((column * 2) * 16) + channel; - auto in1Index = ((row * 2) * 16 * 16) + (((column * 2) + 1) * 16) + channel; - auto in2Index = (((row * 2) + 1) * 16 * 16) + ((column * 2) * 16) + channel; - auto in3Index = (((row * 2) + 1) * 16 * 16) + (((column * 2) + 1) * 16) + channel; - // output value is the maximum of the input pool values, adjusted for the quantization scale change - auto maxIn = std::max({inputData[in0Index], - inputData[in1Index], - inputData[in2Index], - inputData[in3Index]}); - expectedOutputData[outIndex] = maxIn / 2; - } - } - } - - // Construct the network - Network net; - IConnectableLayer* const inputLayer = net.AddInputLayer(0, "input"); - IConnectableLayer* const convLayer = net.AddConvolution2dLayer(convDescriptor, weights, biases, "conv"); - IConnectableLayer* const poolingLayer = net.AddPooling2dLayer(poolDescriptor, "pooling2d"); - IConnectableLayer* const outputLayer = net.AddOutputLayer(0, "output"); - - // Connect the layers - inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0)); - inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo); - convLayer->GetOutputSlot(0).Connect(poolingLayer->GetInputSlot(0)); - convLayer->GetOutputSlot(0).SetTensorInfo(convOutputInfo); - poolingLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); - poolingLayer->GetOutputSlot(0).SetTensorInfo(outputInfo); - - return OptimiseAndRunNetwork(workloadFactory, - net, - inputInfo, - inputData, - outputInfo, - expectedOutputData); -} diff --git a/src/backends/backendsCommon/test/PreCompiledTestImpl.hpp b/src/backends/backendsCommon/test/PreCompiledTestImpl.hpp deleted file mode 100644 index f4e78b6..0000000 --- a/src/backends/backendsCommon/test/PreCompiledTestImpl.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// -#pragma once - -#include "LayerTests.hpp" - -LayerTestResult PreCompiledConvolution2dTestImpl( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); - -LayerTestResult PreCompiledConvolution2dStride2x2TestImpl( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); - -LayerTestResult PreCompiledDepthwiseConvolution2dTestImpl( - armnn::IWorkloadFactory & workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager); - -LayerTestResult PreCompiledDepthwiseConvolution2dStride2x2TestImpl( - armnn::IWorkloadFactory & workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager); - -LayerTestResult PreCompiledMaxPooling2dTestImpl( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/cl/ClWorkloadFactory.hpp b/src/backends/cl/ClWorkloadFactory.hpp index ba2f066..7425537 100644 --- a/src/backends/cl/ClWorkloadFactory.hpp +++ b/src/backends/cl/ClWorkloadFactory.hpp @@ -25,136 +25,136 @@ public: Optional dataType, std::string& outReasonIfUnsupported); - virtual bool SupportsSubTensors() const override { return true; } + bool SupportsSubTensors() const override { return true; } - virtual std::unique_ptr CreateSubTensorHandle(ITensorHandle& parent, - TensorShape const& subTensorShape, - unsigned int const* subTensorOrigin) const override; + std::unique_ptr CreateSubTensorHandle(ITensorHandle& parent, + TensorShape const& subTensorShape, + unsigned int const* subTensorOrigin) const override; - virtual std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo) const override; + std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo) const override; - virtual std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, - DataLayout dataLayout) const override; + std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, + DataLayout dataLayout) const override; - virtual std::unique_ptr CreateInput(const InputQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreateOutput(const OutputQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreateActivation(const ActivationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateInput(const InputQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateOutput(const OutputQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSplitter(const SplitterQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateActivation(const ActivationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMerger(const MergerQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSplitter(const SplitterQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePermute(const PermuteQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMerger(const MergerQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreatePermute(const PermuteQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDepthwiseConvolution2d( - const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + std::unique_ptr CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateNormalization(const NormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateAddition(const AdditionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMultiplication(const MultiplicationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateNormalization(const NormalizationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateBatchNormalization(const BatchNormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateAddition(const AdditionQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMemCopy(const MemCopyQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMultiplication(const MultiplicationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateBatchNormalization(const BatchNormalizationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMemCopy(const MemCopyQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConstant(const ConstantQueueDescriptor& descriptor, + std::unique_ptr CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateReshape(const ReshapeQueueDescriptor& descriptor, + std::unique_ptr CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConstant(const ConstantQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateLstm(const LstmQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateReshape(const ReshapeQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDivision(const DivisionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateLstm(const LstmQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSubtraction(const SubtractionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMaximum(const MaximumQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMean(const MeanQueueDescriptor& descriptor, - const WorkloadInfo& Info) const override; + std::unique_ptr CreateDivision(const DivisionQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, + std::unique_ptr CreateSubtraction(const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMaximum(const MaximumQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMean(const MeanQueueDescriptor& descriptor, + const WorkloadInfo& Info) const override; - virtual std::unique_ptr CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMinimum(const MinimumQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateGreater(const GreaterQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDebug(const DebugQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateRsqrt(const RsqrtQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMinimum(const MinimumQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateGreater(const GreaterQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateGather(const GatherQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateDebug(const DebugQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreateRsqrt(const RsqrtQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreateGather(const GatherQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; private: template diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp old mode 100755 new mode 100644 diff --git a/src/backends/neon/NeonWorkloadFactory.hpp b/src/backends/neon/NeonWorkloadFactory.hpp index fe9f1b0..52caf7d 100644 --- a/src/backends/neon/NeonWorkloadFactory.hpp +++ b/src/backends/neon/NeonWorkloadFactory.hpp @@ -26,136 +26,136 @@ public: Optional dataType, std::string& outReasonIfUnsupported); - virtual bool SupportsSubTensors() const override { return true; } + bool SupportsSubTensors() const override { return true; } - virtual std::unique_ptr CreateSubTensorHandle(ITensorHandle& parent, - TensorShape const& subTensorShape, - unsigned int const* subTensorOrigin) const override; + std::unique_ptr CreateSubTensorHandle(ITensorHandle& parent, + TensorShape const& subTensorShape, + unsigned int const* subTensorOrigin) const override; - virtual std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo) const override; + std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo) const override; - virtual std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, - DataLayout dataLayout) const override; + std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, + DataLayout dataLayout) const override; - virtual std::unique_ptr CreateInput(const InputQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateInput(const InputQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateOutput(const OutputQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateOutput(const OutputQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateActivation(const ActivationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateActivation(const ActivationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSplitter(const SplitterQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSplitter(const SplitterQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMerger(const MergerQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMerger(const MergerQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreatePermute(const PermuteQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreatePermute(const PermuteQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDepthwiseConvolution2d( - const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + std::unique_ptr CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateNormalization(const NormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMultiplication(const MultiplicationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateAddition(const AdditionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateNormalization(const NormalizationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateBatchNormalization(const BatchNormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMultiplication(const MultiplicationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMemCopy(const MemCopyQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateAddition(const AdditionQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateBatchNormalization(const BatchNormalizationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMemCopy(const MemCopyQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConstant(const ConstantQueueDescriptor& descriptor, + std::unique_ptr CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateReshape(const ReshapeQueueDescriptor& descriptor, + std::unique_ptr CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConstant(const ConstantQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateReshape(const ReshapeQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateLstm(const LstmQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateLstm(const LstmQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDivision(const DivisionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSubtraction(const SubtractionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMaximum(const MaximumQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreateMean(const MeanQueueDescriptor& descriptor, - const WorkloadInfo& Info) const override; + std::unique_ptr CreateDivision(const DivisionQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, + std::unique_ptr CreateSubtraction(const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMaximum(const MaximumQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, - const WorkloadInfo& Info) const override; + std::unique_ptr CreateMean(const MeanQueueDescriptor& descriptor, + const WorkloadInfo& Info) const override; - virtual std::unique_ptr CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMinimum(const MinimumQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateGreater(const GreaterQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, + const WorkloadInfo& Info) const override; - virtual std::unique_ptr CreateDebug(const DebugQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateRsqrt(const RsqrtQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMinimum(const MinimumQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateGreater(const GreaterQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateGather(const GatherQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateDebug(const DebugQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreateRsqrt(const RsqrtQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreateGather(const GatherQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; private: mutable std::shared_ptr m_MemoryManager; diff --git a/src/backends/reference/RefWorkloadFactory.hpp b/src/backends/reference/RefWorkloadFactory.hpp index 443af76..79e73a2 100644 --- a/src/backends/reference/RefWorkloadFactory.hpp +++ b/src/backends/reference/RefWorkloadFactory.hpp @@ -31,7 +31,7 @@ class RefWorkloadFactory : public IWorkloadFactory { public: explicit RefWorkloadFactory(); - virtual ~RefWorkloadFactory() {} + ~RefWorkloadFactory() {} const BackendId& GetBackendId() const override; @@ -39,140 +39,140 @@ public: Optional dataType, std::string& outReasonIfUnsupported); - virtual bool SupportsSubTensors() const override { return false; } + bool SupportsSubTensors() const override { return false; } - virtual std::unique_ptr CreateSubTensorHandle(ITensorHandle& parent, - TensorShape const& subTensorShape, - unsigned int const* subTensorOrigin) const override + std::unique_ptr CreateSubTensorHandle(ITensorHandle& parent, + TensorShape const& subTensorShape, + unsigned int const* subTensorOrigin) const override { boost::ignore_unused(parent, subTensorShape, subTensorOrigin); return nullptr; } - virtual std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo) const override; + std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo) const override; - virtual std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, - DataLayout dataLayout) const override; + std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, + DataLayout dataLayout) const override; - virtual std::unique_ptr CreateInput(const InputQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreateOutput(const OutputQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreateActivation(const ActivationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateInput(const InputQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateOutput(const OutputQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSplitter(const SplitterQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateActivation(const ActivationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMerger(const MergerQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSplitter(const SplitterQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMerger(const MergerQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePermute(const PermuteQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDepthwiseConvolution2d( - const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + std::unique_ptr CreatePermute(const PermuteQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateNormalization(const NormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMultiplication(const MultiplicationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateAddition(const AdditionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateNormalization(const NormalizationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateBatchNormalization(const BatchNormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMultiplication(const MultiplicationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMemCopy(const MemCopyQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateAddition(const AdditionQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateBatchNormalization(const BatchNormalizationQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMemCopy(const MemCopyQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConstant(const ConstantQueueDescriptor& descriptor, + std::unique_ptr CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateReshape(const ReshapeQueueDescriptor& descriptor, + std::unique_ptr CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; - - virtual std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConstant(const ConstantQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateLstm(const LstmQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateReshape(const ReshapeQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDivision(const DivisionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateLstm(const LstmQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateSubtraction(const SubtractionQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMaximum(const MaximumQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMean(const MeanQueueDescriptor& descriptor, - const WorkloadInfo& Info) const override; + std::unique_ptr CreateDivision(const DivisionQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, + std::unique_ptr CreateSubtraction(const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMaximum(const MaximumQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMean(const MeanQueueDescriptor& descriptor, + const WorkloadInfo& Info) const override; - virtual std::unique_ptr CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateMinimum(const MinimumQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateGreater(const GreaterQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateDebug(const DebugQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateRsqrt(const RsqrtQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateMinimum(const MinimumQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateGreater(const GreaterQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; - virtual std::unique_ptr CreateGather(const GatherQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + std::unique_ptr CreateDebug(const DebugQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreateRsqrt(const RsqrtQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + + std::unique_ptr CreateGather(const GatherQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; private: -- 2.7.4