diff options
author | Tracy Narine <tracy.narine@arm.com> | 2023-07-13 16:50:54 +0100 |
---|---|---|
committer | Tracy Narine <tracy.narine@arm.com> | 2023-07-17 14:19:36 +0100 |
commit | bb8d7591a35bd95480b39001f8b7e41a6671f3a6 (patch) | |
tree | abf2871aa1bb86378f423df405164b0d4521db3f /src/backends | |
parent | 688268328c69e7d4181cdd31fe4717c80a6d1685 (diff) | |
download | armnn-bb8d7591a35bd95480b39001f8b7e41a6671f3a6.tar.gz |
IVGCVSW-7879 Change REVERSE_V2 from LayerWithParameters with 1 input, to Layer with 2 inputs
* Changing ReverseV2 to use two inputs
* This is required by the backends
* The ReverseV2Descriptor was removed
* Tests updated
* Added a Run<> templatefor inputs with different data types
Signed-off-by: Tracy Narine <tracy.narine@arm.com>
Change-Id: I22f947de829b4b3da6bda3a74f4ffdef4052cc25
Diffstat (limited to 'src/backends')
9 files changed, 206 insertions, 174 deletions
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index a26aaf490b..bd3c7c2760 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -1617,18 +1617,35 @@ void ResizeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const void ReverseV2QueueDescriptor::Validate(const WorkloadInfo &workloadInfo) const { const std::string descriptorName{"ReverseV2QueueDescriptor"}; - ValidateNumInputs(workloadInfo, descriptorName, 1); + // Backend restriction + const unsigned int maxDimensions = 4; + + ValidateNumInputs(workloadInfo, descriptorName, 2); ValidateNumOutputs(workloadInfo, descriptorName, 1); const TensorInfo& inputTensorInfo = workloadInfo.m_InputTensorInfos[0]; + const TensorInfo& axisTensorInfo = workloadInfo.m_InputTensorInfos[1]; const TensorInfo& outputTensorInfo = workloadInfo.m_OutputTensorInfos[0]; - auto inputTensorNumDimensions = inputTensorInfo.GetNumDimensions(); - if (inputTensorNumDimensions > m_Parameters.m_MaxDimension) + const auto inputTensorNumDimensions = inputTensorInfo.GetNumDimensions(); + if (inputTensorNumDimensions > maxDimensions) { throw InvalidArgumentException(descriptorName + ": Input tensors with rank greater than " + - std::to_string(m_Parameters.m_MaxDimension) + " are not supported."); + std::to_string(maxDimensions) + " are not supported."); + } + + const auto axisTensorNumDimensions = axisTensorInfo.GetNumDimensions(); + if (axisTensorNumDimensions > maxDimensions) + { + throw InvalidArgumentException(descriptorName + + ": More than " + std::to_string(maxDimensions) + " axes cannot be specified."); + } + + if (axisTensorNumDimensions > inputTensorNumDimensions) + { + throw InvalidArgumentException(descriptorName + + ": More axes specified than the number of axes on the input tensor."); } std::vector<DataType> supportedTypes = @@ -1642,44 +1659,18 @@ void ReverseV2QueueDescriptor::Validate(const WorkloadInfo &workloadInfo) const }; ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); - ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); - ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); - if (m_Parameters.m_Axis.size() > inputTensorNumDimensions) - { - throw InvalidArgumentException(descriptorName + ": More axes specified than is on the input tensor."); - } - if (m_Parameters.m_Axis.size() > m_Parameters.m_MaxDimension) + std::vector<DataType> axisSupportedTypes = { - throw InvalidArgumentException(descriptorName + - ": More than " + std::to_string(m_Parameters.m_MaxDimension) + " axes cannot be specified."); - } + DataType::Signed32, + }; - if (! m_Parameters.m_Axis.empty()) - { - // First check that we have unique axis values - auto checkAxis = m_Parameters.m_Axis; - std::sort(checkAxis.begin(), checkAxis.end()); - auto lastUnique = std::unique(checkAxis.begin(), checkAxis.end()); - if (lastUnique != checkAxis.end()) - { - throw InvalidArgumentException(descriptorName + ": Axes values must be unique."); - } + ValidateDataTypes(axisTensorInfo, axisSupportedTypes, descriptorName); - // Next check that the axes values are in range: [-rank, rank] - const auto minmax = - std::minmax_element(std::begin(m_Parameters.m_Axis), std::end(m_Parameters.m_Axis)); - if (((*minmax.first) < int32_t(-inputTensorNumDimensions)) || - ((*minmax.second) >= int32_t (inputTensorNumDimensions))) - { - throw InvalidArgumentException(descriptorName + - ": Axes values must in range [-" + std::to_string(inputTensorNumDimensions) + "," + - std::to_string(inputTensorNumDimensions) + "]."); - } - } + ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); } - void FakeQuantizationQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const { const std::string descriptorName{"FakeQuantizationQueueDescriptor"}; diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index ac4bcc90f6..ee797b632c 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -1121,12 +1121,12 @@ bool IWorkloadFactory::IsLayerConfigurationSupported(const BackendId& backendId, } case LayerType::ReverseV2: { - auto cLayer = PolymorphicDowncast<const ReverseV2Layer*>(&layer); - const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo(); + const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); + const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo(); const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); - result = layerSupportObject.IsReverseV2Supported(OverrideDataType(input, dataType), + result = layerSupportObject.IsReverseV2Supported(OverrideDataType(input0, dataType), + OverrideDataType(input1, armnn::DataType::Signed32), OverrideDataType(output, dataType), - cLayer->GetParameters(), reason); break; } diff --git a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp index f7a852f440..182fab97be 100644 --- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp +++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp @@ -744,8 +744,6 @@ DECLARE_LAYER_POLICY_2_PARAM(Resize) DECLARE_LAYER_POLICY_2_PARAM(Reshape) -DECLARE_LAYER_POLICY_2_PARAM(ReverseV2) - DECLARE_LAYER_POLICY_1_PARAM(Shape) DECLARE_LAYER_POLICY_2_PARAM(Slice) diff --git a/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp b/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp index 586b831e45..3cfd614336 100644 --- a/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp +++ b/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp @@ -23,23 +23,25 @@ namespace armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, - armnn::ReverseV2Descriptor descriptor, const std::vector<T>& input, + const std::vector<int>& axis, const std::vector<T>& outputExpected, const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& axisInfo, const armnn::TensorInfo& outputInfo) { LayerTestResult<T, NumDims> result(outputInfo); std::vector<T> outputActual(outputInfo.GetNumElements()); std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo); + std::unique_ptr<armnn::ITensorHandle> axisHandle = tensorHandleFactory.CreateTensorHandle(axisInfo); std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo); armnn::ReverseV2QueueDescriptor queueDescriptor; - queueDescriptor.m_Parameters = std::move(descriptor); armnn::WorkloadInfo workloadInfo; AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get()); + AddInputToWorkload(queueDescriptor, workloadInfo, axisInfo, axisHandle.get()); AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get()); // Don't execute if ReverseV2 is not supported, as an exception will be raised. @@ -47,9 +49,9 @@ namespace std::string reasonIfUnsupported; armnn::LayerSupportHandle handle = armnn::GetILayerSupportByBackendId(backend); result.m_Supported = handle.IsReverseV2Supported(inputInfo, - outputInfo, - queueDescriptor.m_Parameters, - reasonIfUnsupported); + axisInfo, + outputInfo, + reasonIfUnsupported); if (!result.m_Supported) { return result; @@ -58,9 +60,11 @@ namespace auto workload = workloadFactory.CreateWorkload(armnn::LayerType::ReverseV2, queueDescriptor, workloadInfo); inputHandle->Allocate(); + axisHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), input.data()); + CopyDataToITensorHandle(axisHandle.get(), axis.data()); workload->PostAllocationConfigure(); ExecuteWorkload(*workload, memoryManager); @@ -80,13 +84,13 @@ LayerTestResult<T, 2> ReverseV2SimpleTestEmptyAxis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is the same as input - auto descriptor = armnn::ReverseV2Descriptor(); + // Simple test with no axes set so output is the same as input float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2,2}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2,2}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -94,6 +98,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTestEmptyAxis( 3, 4 }, qScale, qOffset); + std::vector<int> axis = armnnUtils::QuantizedVector<int>({}, qScale, qOffset); + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 1, 2, 3, 4 @@ -102,10 +108,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTestEmptyAxis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -115,26 +122,27 @@ LayerTestResult<T, 2> ReverseV2SimpleTestEmptyTensor( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. Empty tensor set so output is the same as input - auto descriptor = armnn::ReverseV2Descriptor(); + // Simple test with empty input tensor float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({0}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({0}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({0}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({}, qScale, qOffset); - + std::vector<int> axis = armnnUtils::QuantizedVector<int>({}, qScale, qOffset); std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({}, qScale, qOffset); return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -144,12 +152,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest1Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {0}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({4}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({4}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -157,6 +164,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest1Dim( 3, 4 }, qScale, qOffset); + std::vector<int> axis = {0}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1 @@ -165,10 +174,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest1Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -178,12 +188,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest2Dim1Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2,2}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2,2}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -191,6 +200,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest2Dim1Axis( 3, 4 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 2, 1, 4, 3 @@ -199,10 +210,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest2Dim1Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -212,12 +224,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest2Dim2Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1, 0}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2,2}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2,2}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -225,6 +236,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest2Dim2Axis( 3, 4 }, qScale, qOffset); + std::vector<int> axis = {1,0}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1 @@ -233,10 +246,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest2Dim2Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -246,12 +260,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim1Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 3, 4}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 3, 4}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -263,6 +276,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim1Axis( 21, 22, 23, 24 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 9, 10, 11, 12, 5, 6, 7, 8, @@ -275,10 +290,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim1Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -288,12 +304,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim2Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {0, 1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 3, 4}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 3, 4}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -305,6 +320,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim2Axis( 21, 22, 23, 24 }, qScale, qOffset); + std::vector<int> axis = {0, 1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 21, 22, 23, 24, 17, 18, 19, 20, @@ -317,10 +334,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim2Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -330,14 +348,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim3Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1, 0, 2}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 3, 4}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({3}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 3, 4}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -349,6 +364,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim3Axis( 21, 22, 23, 24 }, qScale, qOffset); + std::vector<int> axis = {1, 0, 2}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 24, 23, 22, 21, 20, 19, 18, 17, @@ -361,10 +378,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest3Dim3Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -374,14 +392,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim1Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {0}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -395,6 +410,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim1Axis( 22, 23, 24 }, qScale, qOffset); + std::vector<int> axis = {0}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 13, 14, 15, 16, 17, 18, @@ -409,10 +426,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim1Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -422,14 +440,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim2Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {0, 1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -443,6 +458,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim2Axis( 22, 23, 24 }, qScale, qOffset); + std::vector<int> axis = {0, 1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 19, 20, 21, 22, 23, 24, @@ -457,10 +474,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim2Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -470,14 +488,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim3Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {0, 1, 2}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({3}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -491,6 +506,8 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim3Axis( 22, 23, 24 }, qScale, qOffset); + std::vector<int> axis = {0, 1, 2}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 22, 23, 24, 19, 20, 21, @@ -505,10 +522,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim3Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -518,14 +536,11 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim4Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {0, 1, 2, 3}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({4}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -539,24 +554,27 @@ LayerTestResult<T, 2> ReverseV2SimpleTest4Dim4Axis( 22, 23, 24 }, qScale, qOffset); + std::vector<int> axis = {0, 1, 2, 3}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ - 24, 23, 22, - 21, 20, 19, - 18, 17, 16, - 15, 14, 13, - 12, 11, 10, - 9, 8, 7, - 6, 5, 4, - 3, 2, 1 - }, qScale, qOffset); + 24, 23, 22, + 21, 20, 19, + 18, 17, 16, + 15, 14, 13, + 12, 11, 10, + 9, 8, 7, + 6, 5, 4, + 3, 2, 1 + }, qScale, qOffset); return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -566,13 +584,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowOddColTest2Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 3}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -580,6 +596,8 @@ LayerTestResult<T, 2> ReverseV2EvenRowOddColTest2Dim( 4, 5, 6 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 3, 2, 1, 6, 5, 4 @@ -588,10 +606,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowOddColTest2Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -601,14 +620,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowOddColTest3Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 3, 1}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 3, 1}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -616,6 +632,8 @@ LayerTestResult<T, 2> ReverseV2EvenRowOddColTest3Dim( 4, 5, 6 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 3, 2, 1, 6, 5, 4 @@ -624,10 +642,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowOddColTest3Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -637,14 +656,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest2Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 4}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 4}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -652,6 +668,8 @@ LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest2Dim( 5, 6, 7, 8 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1, 8, 7, 6, 5 @@ -660,10 +678,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest2Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -673,14 +692,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest3Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 4, 1}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 4, 1}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -688,6 +704,8 @@ LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest3Dim( 5, 6, 7, 8 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1, 8, 7, 6, 5 @@ -696,10 +714,11 @@ LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest3Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -709,14 +728,11 @@ LayerTestResult<T, 2> ReverseV2OddRowOddColTest2Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -725,6 +741,8 @@ LayerTestResult<T, 2> ReverseV2OddRowOddColTest2Dim( 7, 8, 9 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 3, 2, 1, 6, 5, 4, @@ -734,10 +752,11 @@ LayerTestResult<T, 2> ReverseV2OddRowOddColTest2Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -747,14 +766,11 @@ LayerTestResult<T, 2> ReverseV2OddRowOddColTest3Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({3, 3, 1}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({3, 3, 1}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -763,6 +779,8 @@ LayerTestResult<T, 2> ReverseV2OddRowOddColTest3Dim( 7, 8, 9 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 3, 2, 1, 6, 5, 4, @@ -772,10 +790,11 @@ LayerTestResult<T, 2> ReverseV2OddRowOddColTest3Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -785,14 +804,11 @@ LayerTestResult<T, 2> ReverseV2OddRowEvenColTest2Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({3, 4}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({3, 4}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -801,6 +817,8 @@ LayerTestResult<T, 2> ReverseV2OddRowEvenColTest2Dim( 9, 10, 11, 12 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1, 8, 7, 6, 5, @@ -810,10 +828,11 @@ LayerTestResult<T, 2> ReverseV2OddRowEvenColTest2Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -823,14 +842,11 @@ LayerTestResult<T, 2> ReverseV2OddRowEvenColTest3Dim( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({3, 4, 1}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({3, 4, 1}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -839,6 +855,8 @@ LayerTestResult<T, 2> ReverseV2OddRowEvenColTest3Dim( 9, 10, 11, 12 }, qScale, qOffset); + std::vector<int> axis = {1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1, 8, 7, 6, 5, @@ -848,10 +866,11 @@ LayerTestResult<T, 2> ReverseV2OddRowEvenColTest3Dim( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -861,14 +880,11 @@ LayerTestResult<T, 2> ReverseV2NegAxisTest2Dim1Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {-1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 4}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 4}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -876,6 +892,8 @@ LayerTestResult<T, 2> ReverseV2NegAxisTest2Dim1Axis( 5, 6, 7, 8, }, qScale, qOffset); + std::vector<int> axis = {-1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1, 8, 7, 6, 5 @@ -884,10 +902,11 @@ LayerTestResult<T, 2> ReverseV2NegAxisTest2Dim1Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -897,14 +916,11 @@ LayerTestResult<T, 2> ReverseV2NegAxisTest3Dim2Axis( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - // Simple test with default descriptor. No axes set so output is - // the same as input - auto descriptor = armnn::ReverseV2Descriptor(std::vector<int> {1, -1}); - float qScale = 1.0f; int32_t qOffset = 0; armnn::TensorInfo inputInfo({2, 4, 1}, ArmnnType, qScale, qOffset); + armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset); armnn::TensorInfo outputInfo({2, 4, 1}, ArmnnType, qScale, qOffset); std::vector<T> input = armnnUtils::QuantizedVector<T>({ @@ -912,6 +928,8 @@ LayerTestResult<T, 2> ReverseV2NegAxisTest3Dim2Axis( 5, 6, 7, 8, }, qScale, qOffset); + std::vector<int> axis = {1, -1}; + std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 4, 3, 2, 1, 8, 7, 6, 5 @@ -920,10 +938,11 @@ LayerTestResult<T, 2> ReverseV2NegAxisTest3Dim2Axis( return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory, memoryManager, tensorHandleFactory, - descriptor, input, + axis, outputExpected, inputInfo, + axisInfo, outputInfo); } @@ -1081,4 +1100,4 @@ template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2> ReverseV2SimpleTest2Dim2Axis<armnn::DataType::QSymmS16>( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - const armnn::ITensorHandleFactory& tensorHandleFactory);
\ No newline at end of file + const armnn::ITensorHandleFactory& tensorHandleFactory); diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 1d5fab1adc..e94478f088 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -344,7 +344,7 @@ bool RefLayerSupport::IsLayerSupported(const LayerType& type, case LayerType::ReverseV2: return IsReverseV2Supported(infos[0], infos[1], - *(PolymorphicDowncast<const ReverseV2Descriptor*>(&descriptor)), + infos[2], reasonIfUnsupported); case LayerType::Reduce: return IsReduceSupported(infos[0], @@ -2361,12 +2361,11 @@ bool RefLayerSupport::IsResizeSupported(const TensorInfo& input, return supported; } -bool RefLayerSupport::IsReverseV2Supported(const TensorInfo& input, +bool RefLayerSupport::IsReverseV2Supported(const TensorInfo& input0, + const TensorInfo& input1, const TensorInfo& output, - const ReverseV2Descriptor& descriptor, Optional<std::string&> reasonIfUnsupported) const { - IgnoreUnused(descriptor); bool supported = true; // ReverseV2 is data type agnostic so it can support all the types in the Reference backend std::array<DataType,6> supportedTypes = @@ -2379,14 +2378,22 @@ bool RefLayerSupport::IsReverseV2Supported(const TensorInfo& input, DataType::QSymmS16 }; - supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, - "Reference ReverseV2: input type not supported"); + supported &= CheckSupportRule(TypeAnyOf(input0, supportedTypes), reasonIfUnsupported, + "Reference ReverseV2: input0 type not supported"); supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, "Reference ReverseV2: output type not supported"); - supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, - "Reference ReverseV2: input and output types not matching"); + supported &= CheckSupportRule(TypesAreEqual(input0, output), reasonIfUnsupported, + "Reference ReverseV2: input0 and output types not matching"); + + std::array<DataType,6> input2SupportedTypes = + { + DataType::Signed32 + }; + + supported &= CheckSupportRule(TypeAnyOf(input1, input2SupportedTypes), reasonIfUnsupported, + "Reference ReverseV2: input1 type not supported"); return supported; } diff --git a/src/backends/reference/RefLayerSupport.hpp b/src/backends/reference/RefLayerSupport.hpp index 0afb9c2c94..21d59e27fc 100644 --- a/src/backends/reference/RefLayerSupport.hpp +++ b/src/backends/reference/RefLayerSupport.hpp @@ -299,9 +299,9 @@ public: const ResizeDescriptor& descriptor, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; - bool IsReverseV2Supported(const TensorInfo& input, + bool IsReverseV2Supported(const TensorInfo& input0, + const TensorInfo& input1, const TensorInfo& output, - const ReverseV2Descriptor& descriptor, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const; bool IsShapeSupported(const TensorInfo& input, diff --git a/src/backends/reference/workloads/RefReverseV2Workload.cpp b/src/backends/reference/workloads/RefReverseV2Workload.cpp index cd2d9f930b..22d5449466 100644 --- a/src/backends/reference/workloads/RefReverseV2Workload.cpp +++ b/src/backends/reference/workloads/RefReverseV2Workload.cpp @@ -32,16 +32,21 @@ namespace armnn ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefReverseV2Workload_Execute"); const TensorInfo& inputInfo = GetTensorInfo(inputs[0]); + const TensorInfo& axisInfo = GetTensorInfo(inputs[1]); std::unique_ptr<Decoder<float>> inputDecoder = MakeDecoder<float>(GetTensorInfo(inputs[0]), inputs[0]->Map()); + std::unique_ptr<Decoder<int>> axisDecoder = MakeDecoder<int>(GetTensorInfo(inputs[1]), + inputs[1]->Map()); + std::unique_ptr<Encoder<float>> outputEncoder = MakeEncoder<float>(GetTensorInfo(outputs[0]), outputs[0]->Map()); - ReverseV2(m_Data.m_Parameters, - inputInfo, + ReverseV2(inputInfo, + axisInfo, *inputDecoder, + *axisDecoder, *outputEncoder); } diff --git a/src/backends/reference/workloads/ReverseV2Impl.cpp b/src/backends/reference/workloads/ReverseV2Impl.cpp index f6d5fd74d1..896f9050f5 100644 --- a/src/backends/reference/workloads/ReverseV2Impl.cpp +++ b/src/backends/reference/workloads/ReverseV2Impl.cpp @@ -75,13 +75,16 @@ unsigned int ReverseRelocateIdx(unsigned int idx, return outputIdx; } -void ReverseV2(const ReverseV2Descriptor& params, - const TensorInfo& inputInfo, +void ReverseV2(const TensorInfo& inputInfo, + const TensorInfo& axisInfo, Decoder<float>& inputDecoder, + Decoder<int>& axisDecoder, Encoder<float>& outputEncoder) { + unsigned int axesRank = static_cast<unsigned int>(axisInfo.GetNumElements()); + // Empty axis and empty tensor case: copy input to output - if (params.m_Axis.empty() || inputInfo.GetNumElements() == 0) + if ((axesRank == 0) || inputInfo.GetNumElements() == 0) { for (unsigned idx = 0; idx < inputInfo.GetNumElements(); idx++) { @@ -95,11 +98,19 @@ void ReverseV2(const ReverseV2Descriptor& params, unsigned int inputRank = static_cast<unsigned int>(inputInfo.GetNumDimensions()); - std::vector<bool>axisFlag(inputRank, false); - std::vector<unsigned int>dimSize(inputRank, 0); + std::vector<bool> axisFlag(inputRank, false); + std::vector<unsigned int> dimSize(inputRank, 0); + std::vector<int32_t> axis(axesRank, 0); + + // Decode the axis information + for (unsigned int i=0; i < axesRank; i++) + { + axis[i] = axisDecoder.Get(); + axisDecoder += 1; + } // Make sure the axes are positive - for (int32_t axisElement: params.m_Axis) + for (int32_t axisElement: axis) { axisElement = axisElement < 0 ? axisElement + static_cast<int32_t>(inputRank) : axisElement; axisFlag[static_cast<uint32_t>(axisElement)] = true; diff --git a/src/backends/reference/workloads/ReverseV2Impl.hpp b/src/backends/reference/workloads/ReverseV2Impl.hpp index bc1fe1d432..59407d4a4e 100644 --- a/src/backends/reference/workloads/ReverseV2Impl.hpp +++ b/src/backends/reference/workloads/ReverseV2Impl.hpp @@ -13,9 +13,10 @@ namespace armnn { -void ReverseV2(const ReverseV2Descriptor& params, - const TensorInfo& inputInfo, +void ReverseV2(const TensorInfo& inputInfo, + const TensorInfo& axisInfo, Decoder<float>& inputDecoder, + Decoder<int>& axisDecoder, Encoder<float>& outputEncoder); -} // namespace armnn
\ No newline at end of file +} // namespace armnn |