diff options
author | Aron Virginas-Tar <Aron.Virginas-Tar@arm.com> | 2019-09-16 14:27:45 +0100 |
---|---|---|
committer | Áron Virginás-Tar <aron.virginas-tar@arm.com> | 2019-09-17 09:03:43 +0000 |
commit | 636ab40d3741e12eaad11d5b50e4b34bfbb258b5 (patch) | |
tree | defaba57dc28c7b5dbe19075e24b6c8c0cefc9b2 /src/backends | |
parent | 4dc64a69ba383ece509d442598617445a3b4847f (diff) | |
download | armnn-636ab40d3741e12eaad11d5b50e4b34bfbb258b5.tar.gz |
IVGCVSW-3875 Add frontend for SLICE layer
Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com>
Change-Id: Iebe675a0cee02db6f133d48ce58cbc1e233061db
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/backendsCommon/LayerSupportBase.cpp | 8 | ||||
-rw-r--r-- | src/backends/backendsCommon/LayerSupportBase.hpp | 5 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.cpp | 57 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.hpp | 7 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadFactory.cpp | 21 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadFactory.hpp | 3 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp | 2 |
7 files changed, 100 insertions, 3 deletions
diff --git a/src/backends/backendsCommon/LayerSupportBase.cpp b/src/backends/backendsCommon/LayerSupportBase.cpp index a8d1eaddc3..7f1fd1097a 100644 --- a/src/backends/backendsCommon/LayerSupportBase.cpp +++ b/src/backends/backendsCommon/LayerSupportBase.cpp @@ -414,6 +414,14 @@ bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &input, return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } +bool LayerSupportBase::IsSliceSupported(const TensorInfo& input, + const TensorInfo& output, + const SliceDescriptor& descriptor, + Optional<std::string&> reasonIfUnsupported) const +{ + return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); +} + bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& input, const TensorInfo& output, const SoftmaxDescriptor& descriptor, diff --git a/src/backends/backendsCommon/LayerSupportBase.hpp b/src/backends/backendsCommon/LayerSupportBase.hpp index 25dbdf2906..8df1f8d54f 100644 --- a/src/backends/backendsCommon/LayerSupportBase.hpp +++ b/src/backends/backendsCommon/LayerSupportBase.hpp @@ -253,6 +253,11 @@ public: const TensorInfo& output, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsSliceSupported(const TensorInfo& input, + const TensorInfo& output, + const SliceDescriptor& descriptor, + Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsSoftmaxSupported(const TensorInfo& input, const TensorInfo& output, const SoftmaxDescriptor& descriptor, diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index f290cbd9cf..2fa0c92daf 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -2443,7 +2443,7 @@ void QuantizedLstmQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) co ValidateTensorQuantizationSpace(inputInfo, outputStateInInfo, descriptorName, "input", "outputStateIn"); ValidateTensorQuantizationSpace(inputInfo, outputStateOutInfo, descriptorName, "input", "outputStateOut"); ValidateTensorQuantizationSpace(cellStateInInfo, cellStateOutInfo, descriptorName, "cellStateIn", "cellStateOut"); - + // Infer number of batches, input size and output size from tensor dimensions const uint32_t numBatches = inputInfo.GetShape()[0]; const uint32_t inputSize = inputInfo.GetShape()[1]; @@ -2584,4 +2584,59 @@ void AbsQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); } +void SliceQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const +{ + const std::string descriptorName{"SliceQueueDescriptor"}; + + ValidateNumInputs(workloadInfo, descriptorName, 1); + ValidateNumOutputs(workloadInfo, descriptorName, 1); + + const TensorInfo& inputTensorInfo = workloadInfo.m_InputTensorInfos[0]; + const TensorInfo& outputTensorInfo = workloadInfo.m_OutputTensorInfos[0]; + + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + + const unsigned int rank = inputTensorInfo.GetNumDimensions(); + if (rank > 4) + { + throw InvalidArgumentException(descriptorName + ": Input tensors with rank greater than 4 are not supported."); + } + + ValidateTensorNumDimensions(outputTensorInfo, descriptorName, rank, "output"); + + // Check if m_Begin and m_Size have the expected length + if (m_Parameters.m_Begin.size() != rank) + { + throw InvalidArgumentException(descriptorName + + ": Length of begin offset descriptor must equal rank " + std::to_string(rank)); + } + if (m_Parameters.m_Size.size() != rank) + { + throw InvalidArgumentException(descriptorName + + ": Length of size descriptor must equal rank " + std::to_string(rank)); + } + + // Check if the shape of the output tensor matches m_Size + const TensorShape& outputShape = outputTensorInfo.GetShape(); + for (unsigned int i = 0u; i < rank; ++i) + { + if (m_Parameters.m_Size[i] != outputShape[i]) + { + throw InvalidArgumentException(descriptorName + ": Size descriptor does not match output tensor."); + } + } + + // Check if the sum of begin offset and size in a given dimension + // does not exceed the size of corresponding input + const TensorShape& inputShape = inputTensorInfo.GetShape(); + for(unsigned int i = 0u; i < rank; ++i) + { + if (m_Parameters.m_Begin[i] + m_Parameters.m_Size[i] >= inputShape[i]) + { + throw InvalidArgumentException(descriptorName + ": Sum of begin offset and size for dimension " + + std::to_string(i) + " exceeds input size."); + } + } +} + } // namespace armnn diff --git a/src/backends/backendsCommon/WorkloadData.hpp b/src/backends/backendsCommon/WorkloadData.hpp index 35130ad160..1e49243b34 100644 --- a/src/backends/backendsCommon/WorkloadData.hpp +++ b/src/backends/backendsCommon/WorkloadData.hpp @@ -533,4 +533,9 @@ struct AbsQueueDescriptor : QueueDescriptor void Validate(const WorkloadInfo& workloadInfo) const; }; -} //namespace armnn +struct SliceQueueDescriptor : QueueDescriptorWithParameters<SliceDescriptor> +{ + void Validate(const WorkloadInfo& workloadInfo) const; +}; + +} // namespace armnn diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index 17bd98b349..9d6b2bd6a9 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -760,6 +760,19 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, reason); break; } + case LayerType::Slice: + { + auto cLayer = boost::polymorphic_downcast<const SliceLayer*>(&layer); + + const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); + const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); + + result = layerSupportObject->IsSliceSupported(OverrideDataType(input, dataType), + OverrideDataType(output, dataType), + cLayer->GetParameters(), + reason); + break; + } case LayerType::Softmax: { auto cLayer = boost::polymorphic_downcast<const SoftmaxLayer*>(&layer); @@ -1245,6 +1258,12 @@ std::unique_ptr<IWorkload> IWorkloadFactory::CreateRsqrt(const RsqrtQueueDescrip return std::unique_ptr<IWorkload>(); } +std::unique_ptr<IWorkload> IWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return std::unique_ptr<IWorkload>(); +} + std::unique_ptr<IWorkload> IWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, const WorkloadInfo& info) const { @@ -1300,4 +1319,4 @@ std::unique_ptr<IWorkload> IWorkloadFactory::CreateTransposeConvolution2d( return std::unique_ptr<IWorkload>(); } -} // namepsace armnn
\ No newline at end of file +} // namepsace armnn diff --git a/src/backends/backendsCommon/WorkloadFactory.hpp b/src/backends/backendsCommon/WorkloadFactory.hpp index 6fd334b49c..91cf2c742c 100644 --- a/src/backends/backendsCommon/WorkloadFactory.hpp +++ b/src/backends/backendsCommon/WorkloadFactory.hpp @@ -186,6 +186,9 @@ public: virtual std::unique_ptr<IWorkload> CreateRsqrt(const RsqrtQueueDescriptor& descriptor, const WorkloadInfo& info) const; + virtual std::unique_ptr<IWorkload> CreateSlice(const SliceQueueDescriptor& descriptor, + const WorkloadInfo& info) const; + virtual std::unique_ptr<IWorkload> CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, const WorkloadInfo& info) const; diff --git a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp index 1dc9e9700f..17b7934e9f 100644 --- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp +++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp @@ -473,6 +473,8 @@ DECLARE_LAYER_POLICY_2_PARAM(Reshape) DECLARE_LAYER_POLICY_1_PARAM(Rsqrt) +DECLARE_LAYER_POLICY_2_PARAM(Slice) + DECLARE_LAYER_POLICY_2_PARAM(Softmax) DECLARE_LAYER_POLICY_2_PARAM(SpaceToBatchNd) |