From bb8d7591a35bd95480b39001f8b7e41a6671f3a6 Mon Sep 17 00:00:00 2001 From: Tracy Narine Date: Thu, 13 Jul 2023 16:50:54 +0100 Subject: 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 Change-Id: I22f947de829b4b3da6bda3a74f4ffdef4052cc25 --- .../reference/workloads/RefReverseV2Workload.cpp | 9 +++++++-- src/backends/reference/workloads/ReverseV2Impl.cpp | 23 ++++++++++++++++------ src/backends/reference/workloads/ReverseV2Impl.hpp | 7 ++++--- 3 files changed, 28 insertions(+), 11 deletions(-) (limited to 'src/backends/reference/workloads') 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> inputDecoder = MakeDecoder(GetTensorInfo(inputs[0]), inputs[0]->Map()); + std::unique_ptr> axisDecoder = MakeDecoder(GetTensorInfo(inputs[1]), + inputs[1]->Map()); + std::unique_ptr> outputEncoder = MakeEncoder(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& inputDecoder, + Decoder& axisDecoder, Encoder& outputEncoder) { + unsigned int axesRank = static_cast(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(inputInfo.GetNumDimensions()); - std::vectoraxisFlag(inputRank, false); - std::vectordimSize(inputRank, 0); + std::vector axisFlag(inputRank, false); + std::vector dimSize(inputRank, 0); + std::vector 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(inputRank) : axisElement; axisFlag[static_cast(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& inputDecoder, + Decoder& axisDecoder, Encoder& outputEncoder); -} // namespace armnn \ No newline at end of file +} // namespace armnn -- cgit v1.2.1