diff options
Diffstat (limited to 'src/backends/reference/workloads')
-rw-r--r-- | src/backends/reference/workloads/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefResizeBilinearWorkload.cpp | 4 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefResizeWorkload.cpp | 35 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefResizeWorkload.hpp | 21 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefWorkloads.hpp | 3 | ||||
-rw-r--r-- | src/backends/reference/workloads/Resize.cpp (renamed from src/backends/reference/workloads/ResizeBilinear.cpp) | 66 | ||||
-rw-r--r-- | src/backends/reference/workloads/Resize.hpp | 23 | ||||
-rw-r--r-- | src/backends/reference/workloads/ResizeBilinear.hpp | 22 |
8 files changed, 131 insertions, 49 deletions
diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index 9be245b1a7..3c0af01c00 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -96,6 +96,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefReshapeWorkload.hpp RefResizeBilinearWorkload.cpp RefResizeBilinearWorkload.hpp + RefResizeWorkload.cpp + RefResizeWorkload.hpp RefRsqrtWorkload.cpp RefRsqrtWorkload.hpp RefSoftmaxWorkload.cpp @@ -112,8 +114,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefTransposeConvolution2dWorkload.hpp RefWorkloads.hpp RefWorkloadUtils.hpp - ResizeBilinear.cpp - ResizeBilinear.hpp + Resize.cpp + Resize.hpp Rsqrt.cpp Rsqrt.hpp Softmax.cpp diff --git a/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp b/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp index 03fcec25fe..fc27c0f93d 100644 --- a/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp +++ b/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp @@ -6,7 +6,7 @@ #include "RefResizeBilinearWorkload.hpp" #include "RefWorkloadUtils.hpp" -#include "ResizeBilinear.hpp" +#include "Resize.hpp" #include "BaseIterator.hpp" #include "Profiling.hpp" @@ -29,7 +29,7 @@ void RefResizeBilinearWorkload::Execute() const std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map()); Encoder<float> &encoder = *encoderPtr; - ResizeBilinear(decoder, inputInfo, encoder, outputInfo, m_Data.m_Parameters.m_DataLayout); + Resize(decoder, inputInfo, encoder, outputInfo, m_Data.m_Parameters.m_DataLayout, armnn::ResizeMethod::Bilinear); } } //namespace armnn diff --git a/src/backends/reference/workloads/RefResizeWorkload.cpp b/src/backends/reference/workloads/RefResizeWorkload.cpp new file mode 100644 index 0000000000..26225f8823 --- /dev/null +++ b/src/backends/reference/workloads/RefResizeWorkload.cpp @@ -0,0 +1,35 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefResizeWorkload.hpp" + +#include "RefWorkloadUtils.hpp" +#include "Resize.hpp" +#include "BaseIterator.hpp" +#include "Profiling.hpp" + +#include "BaseIterator.hpp" +#include "Decoders.hpp" +#include "Encoders.hpp" + +namespace armnn +{ + +void RefResizeWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefResizeWorkload_Execute"); + + const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); + const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); + + std::unique_ptr<Decoder<float>> decoderPtr = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map()); + Decoder<float> &decoder = *decoderPtr; + std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map()); + Encoder<float> &encoder = *encoderPtr; + + Resize(decoder, inputInfo, encoder, outputInfo, m_Data.m_Parameters.m_DataLayout, m_Data.m_Parameters.m_Method); +} + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefResizeWorkload.hpp b/src/backends/reference/workloads/RefResizeWorkload.hpp new file mode 100644 index 0000000000..1ddfcdfba8 --- /dev/null +++ b/src/backends/reference/workloads/RefResizeWorkload.hpp @@ -0,0 +1,21 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include <backendsCommon/Workload.hpp> +#include <backendsCommon/WorkloadData.hpp> + +namespace armnn +{ + +class RefResizeWorkload : public BaseWorkload<ResizeQueueDescriptor> +{ +public: + using BaseWorkload<ResizeQueueDescriptor>::BaseWorkload; + virtual void Execute() const override; +}; + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefWorkloads.hpp b/src/backends/reference/workloads/RefWorkloads.hpp index 3a094c8a32..4bdf05daa8 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -40,6 +40,7 @@ #include "RefPreluWorkload.hpp" #include "RefQuantizeWorkload.hpp" #include "RefResizeBilinearWorkload.hpp" +#include "RefResizeWorkload.hpp" #include "RefRsqrtWorkload.hpp" #include "RefReshapeWorkload.hpp" #include "RefSplitterWorkload.hpp" @@ -49,7 +50,7 @@ #include "RefSpaceToDepthWorkload.hpp" #include "RefTransposeConvolution2dWorkload.hpp" #include "RefWorkloadUtils.hpp" -#include "ResizeBilinear.hpp" +#include "Resize.hpp" #include "Softmax.hpp" #include "Splitter.hpp" #include "TensorBufferArrayView.hpp"
\ No newline at end of file diff --git a/src/backends/reference/workloads/ResizeBilinear.cpp b/src/backends/reference/workloads/Resize.cpp index 70a051492a..0e0bdd7597 100644 --- a/src/backends/reference/workloads/ResizeBilinear.cpp +++ b/src/backends/reference/workloads/Resize.cpp @@ -3,7 +3,7 @@ // SPDX-License-Identifier: MIT // -#include "ResizeBilinear.hpp" +#include "Resize.hpp" #include "TensorBufferArrayView.hpp" @@ -25,13 +25,14 @@ inline float Lerp(float a, float b, float w) return w * b + (1.f - w) * a; } -} +}// anonymous namespace -void ResizeBilinear(Decoder<float>& in, - const TensorInfo& inputInfo, - Encoder<float>& out, - const TensorInfo& outputInfo, - DataLayoutIndexed dataLayout) +void Resize(Decoder<float>& in, + const TensorInfo& inputInfo, + Encoder<float>& out, + const TensorInfo& outputInfo, + DataLayoutIndexed dataLayout, + armnn::ResizeMethod resizeMethod) { // We follow the definition of TensorFlow and AndroidNN: the top-left corner of a texel in the output // image is projected into the input image to figure out the interpolants and weights. Note that this @@ -83,22 +84,43 @@ void ResizeBilinear(Decoder<float>& in, const unsigned int x1 = std::min(x0 + 1, inputWidth - 1u); const unsigned int y1 = std::min(y0 + 1, inputHeight - 1u); - // Interpolation - in[dataLayout.GetIndex(inputShape, n, c, y0, x0)]; - float input1 = in.Get(); - in[dataLayout.GetIndex(inputShape, n, c, y0, x1)]; - float input2 = in.Get(); - in[dataLayout.GetIndex(inputShape, n, c, y1, x0)]; - float input3 = in.Get(); - in[dataLayout.GetIndex(inputShape, n, c, y1, x1)]; - float input4 = in.Get(); - - const float ly0 = Lerp(input1, input2, xw); // lerp along row y0. - const float ly1 = Lerp(input3, input4, xw); // lerp along row y1. - const float l = Lerp(ly0, ly1, yw); - + float interpolatedValue; + switch (resizeMethod) + { + case armnn::ResizeMethod::Bilinear: + { + in[dataLayout.GetIndex(inputShape, n, c, y0, x0)]; + float input1 = in.Get(); + in[dataLayout.GetIndex(inputShape, n, c, y0, x1)]; + float input2 = in.Get(); + in[dataLayout.GetIndex(inputShape, n, c, y1, x0)]; + float input3 = in.Get(); + in[dataLayout.GetIndex(inputShape, n, c, y1, x1)]; + float input4 = in.Get(); + + const float ly0 = Lerp(input1, input2, xw); // lerp along row y0. + const float ly1 = Lerp(input3, input4, xw); // lerp along row y1. + interpolatedValue = Lerp(ly0, ly1, yw); + break; + } + case armnn::ResizeMethod::NearestNeighbor: + default: + { + auto distance0 = std::sqrt(pow(fix - boost::numeric_cast<float>(x0), 2) + + pow(fiy - boost::numeric_cast<float>(y0), 2)); + auto distance1 = std::sqrt(pow(fix - boost::numeric_cast<float>(x1), 2) + + pow(fiy - boost::numeric_cast<float>(y1), 2)); + + unsigned int xNearest = distance0 <= distance1? x0 : x1; + unsigned int yNearest = distance0 <= distance1? y0 : y1; + + in[dataLayout.GetIndex(inputShape, n, c, yNearest, xNearest)]; + interpolatedValue = in.Get(); + break; + } + } out[dataLayout.GetIndex(outputShape, n, c, y, x)]; - out.Set(l); + out.Set(interpolatedValue); } } } diff --git a/src/backends/reference/workloads/Resize.hpp b/src/backends/reference/workloads/Resize.hpp new file mode 100644 index 0000000000..8bd8999e5d --- /dev/null +++ b/src/backends/reference/workloads/Resize.hpp @@ -0,0 +1,23 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "BaseIterator.hpp" +#include <armnn/Tensor.hpp> + +#include <DataLayoutIndexed.hpp> + +namespace armnn +{ + +void Resize(Decoder<float>& in, + const TensorInfo& inputInfo, + Encoder<float>& out, + const TensorInfo& outputInfo, + armnnUtils::DataLayoutIndexed dataLayout = DataLayout::NCHW, + ResizeMethod resizeMethod = ResizeMethod::NearestNeighbor); + +} //namespace armnn diff --git a/src/backends/reference/workloads/ResizeBilinear.hpp b/src/backends/reference/workloads/ResizeBilinear.hpp deleted file mode 100644 index ad2e487f5a..0000000000 --- a/src/backends/reference/workloads/ResizeBilinear.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include "BaseIterator.hpp" -#include <armnn/Tensor.hpp> - -#include <DataLayoutIndexed.hpp> - -namespace armnn -{ - -void ResizeBilinear(Decoder<float>& in, - const TensorInfo& inputInfo, - Encoder<float>& out, - const TensorInfo& outputInfo, - armnnUtils::DataLayoutIndexed dataLayout = DataLayout::NCHW); - -} //namespace armnn |