aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2020-12-09 03:11:53 +0000
committerGeorgios Pinitas <georgios.pinitas@arm.com>2020-12-11 14:39:09 +0000
commitc53266e45f3c8c07dff88c61e5bfa01c6d3ba3f0 (patch)
tree14c21b14c776be9759ee33d66c818f7865072606
parent15bc8485ef463508838a549b7e8518bf05883155 (diff)
downloadComputeLibrary-c53266e45f3c8c07dff88c61e5bfa01c6d3ba3f0.tar.gz
Remove (CL/NE)UpsampleLayer in favor to (NE/CL)Scale
Upsample functions and kernels can be replaced with the Scale as they provide same functionality Partially resolves: COMPMID-3996 Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com> Change-Id: Ic2f9ba352c183aa87d69d551d5c172d0f22119e8 Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/4679 Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com> Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com>
-rw-r--r--Android.bp4
-rw-r--r--arm_compute/graph/GraphBuilder.h11
-rw-r--r--arm_compute/graph/backends/FunctionHelpers.h47
-rw-r--r--arm_compute/graph/backends/ValidateHelpers.h22
-rw-r--r--arm_compute/graph/frontend/Layers.h26
-rw-r--r--arm_compute/graph/nodes/Nodes.h1
-rw-r--r--arm_compute/graph/nodes/NodesFwd.h1
-rw-r--r--arm_compute/graph/nodes/UpsampleLayerNode.h74
-rw-r--r--arm_compute/runtime/CL/CLFunctions.h1
-rw-r--r--arm_compute/runtime/CL/functions/CLUpsampleLayer.h97
-rw-r--r--arm_compute/runtime/NEON/NEFunctions.h1
-rw-r--r--arm_compute/runtime/NEON/functions/NEUpsampleLayer.h85
-rw-r--r--docs/00_introduction.dox10
-rw-r--r--examples/graph_yolov3.cpp4
-rw-r--r--src/core/CL/CLKernels.h1
-rw-r--r--src/core/CL/kernels/CLUpsampleLayerKernel.cpp178
-rw-r--r--src/core/CL/kernels/CLUpsampleLayerKernel.h89
-rw-r--r--src/core/NEON/NEKernels.h1
-rw-r--r--src/core/NEON/kernels/NEUpsampleLayerKernel.cpp276
-rw-r--r--src/core/NEON/kernels/NEUpsampleLayerKernel.h99
-rw-r--r--src/graph/GraphBuilder.cpp5
-rw-r--r--src/graph/backends/CL/CLFunctionsFactory.cpp2
-rw-r--r--src/graph/backends/CL/CLNodeValidator.cpp2
-rw-r--r--src/graph/backends/GLES/GCNodeValidator.cpp4
-rw-r--r--src/graph/backends/NEON/NEFunctionFactory.cpp2
-rw-r--r--src/graph/backends/NEON/NENodeValidator.cpp2
-rw-r--r--src/graph/nodes/UpsampleLayerNode.cpp98
-rw-r--r--src/runtime/CL/functions/CLUpsampleLayer.cpp66
-rw-r--r--src/runtime/NEON/functions/NEUpsampleLayer.cpp55
-rw-r--r--tests/validation/CL/UpsampleLayer.cpp151
-rw-r--r--tests/validation/NEON/Upsample.cpp147
-rw-r--r--tests/validation/fixtures/UpsampleLayerFixture.h148
-rw-r--r--tests/validation/reference/UpsampleLayer.cpp89
-rw-r--r--tests/validation/reference/UpsampleLayer.h45
34 files changed, 9 insertions, 1835 deletions
diff --git a/Android.bp b/Android.bp
index 25b40f7376..404c1d54c8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -194,7 +194,6 @@ cc_library_static {
"src/core/CL/kernels/CLThresholdKernel.cpp",
"src/core/CL/kernels/CLTileKernel.cpp",
"src/core/CL/kernels/CLTransposeKernel.cpp",
- "src/core/CL/kernels/CLUpsampleLayerKernel.cpp",
"src/core/CL/kernels/CLWarpAffineKernel.cpp",
"src/core/CL/kernels/CLWarpPerspectiveKernel.cpp",
"src/core/CL/kernels/CLWeightsReshapeKernel.cpp",
@@ -340,7 +339,6 @@ cc_library_static {
"src/core/NEON/kernels/NEThresholdKernel.cpp",
"src/core/NEON/kernels/NETileKernel.cpp",
"src/core/NEON/kernels/NETransposeKernel.cpp",
- "src/core/NEON/kernels/NEUpsampleLayerKernel.cpp",
"src/core/NEON/kernels/NEWarpKernel.cpp",
"src/core/NEON/kernels/NEWeightsReshapeKernel.cpp",
"src/core/NEON/kernels/NEWidthConcatenateLayerKernel.cpp",
@@ -570,7 +568,6 @@ cc_library_static {
"src/runtime/CL/functions/CLTile.cpp",
"src/runtime/CL/functions/CLTranspose.cpp",
"src/runtime/CL/functions/CLUnstack.cpp",
- "src/runtime/CL/functions/CLUpsampleLayer.cpp",
"src/runtime/CL/functions/CLWarpAffine.cpp",
"src/runtime/CL/functions/CLWarpPerspective.cpp",
"src/runtime/CL/functions/CLWinogradConvolutionLayer.cpp",
@@ -731,7 +728,6 @@ cc_library_static {
"src/runtime/NEON/functions/NETile.cpp",
"src/runtime/NEON/functions/NETranspose.cpp",
"src/runtime/NEON/functions/NEUnstack.cpp",
- "src/runtime/NEON/functions/NEUpsampleLayer.cpp",
"src/runtime/NEON/functions/NEWarpAffine.cpp",
"src/runtime/NEON/functions/NEWarpPerspective.cpp",
"src/runtime/NEON/functions/NEWinogradConvolutionLayer.cpp",
diff --git a/arm_compute/graph/GraphBuilder.h b/arm_compute/graph/GraphBuilder.h
index 54bb33d1a4..8c727e3c8e 100644
--- a/arm_compute/graph/GraphBuilder.h
+++ b/arm_compute/graph/GraphBuilder.h
@@ -571,17 +571,6 @@ public:
* @return Node ID of the created node, EmptyNodeID in case of error
*/
static NodeID add_strided_slice_node(Graph &g, NodeParams params, NodeIdxPair input, Coordinates &starts, Coordinates &ends, BiStrides &strides, StridedSliceLayerInfo info);
- /** Adds an upsample layer to the graph
- *
- * @param[in] g Graph to add the node to
- * @param[in] params Common node parameters
- * @param[in] input Input to the yolo layer node as a NodeID-Index pair
- * @param[in] info Upsample layer stride info
- * @param[in] upsampling_policy Upsampling policy used
- *
- * @return Node ID of the created node, EmptyNodeID in case of error
- */
- static NodeID add_upsample_node(Graph &g, NodeParams params, NodeIdxPair input, Size2D info, InterpolationPolicy upsampling_policy);
/** Adds a yolo layer to the graph
*
* @param[in] g Graph to add the node to
diff --git a/arm_compute/graph/backends/FunctionHelpers.h b/arm_compute/graph/backends/FunctionHelpers.h
index 18fdb9f3bb..873957e6b7 100644
--- a/arm_compute/graph/backends/FunctionHelpers.h
+++ b/arm_compute/graph/backends/FunctionHelpers.h
@@ -1619,7 +1619,7 @@ std::unique_ptr<IFunction> create_resize_layer(ResizeLayerNode &node)
// Create and configure function
auto func = std::make_unique<ResizeLayerFunction>();
- func->configure(input, output, ScaleKernelInfo{ policy, BorderMode::CONSTANT });
+ func->configure(input, output, ScaleKernelInfo{ policy, BorderMode::CONSTANT, PixelValue(), SamplingPolicy::CENTER, false, false });
// Log info
ARM_COMPUTE_LOG_GRAPH_INFO("Instantiated "
@@ -1840,51 +1840,6 @@ std::unique_ptr<IFunction> create_strided_slice_layer(StridedSliceLayerNode &nod
return RETURN_UNIQUE_PTR(func);
}
-
-/** Create a backend Upsample layer function
- *
- * @tparam UpsampleLayerFunction Backend Upsample function
- * @tparam TargetInfo Target-specific information
- *
- * @param[in] node Node to create the backend function for
- * @param[in] ctx Graph context
- *
- * @return Backend Upsample layer function
- */
-template <typename UpsampleLayerFunction, typename TargetInfo>
-std::unique_ptr<IFunction> create_upsample_layer(UpsampleLayerNode &node, GraphContext &ctx)
-{
- ARM_COMPUTE_UNUSED(ctx);
- validate_node<TargetInfo>(node, 1 /* expected inputs */, 1 /* expected outputs */);
-
- // Extract IO and info
- typename TargetInfo::TensorType *input = get_backing_tensor<TargetInfo>(node.input(0));
- typename TargetInfo::TensorType *output = get_backing_tensor<TargetInfo>(node.output(0));
- const Size2D info = node.info();
- const InterpolationPolicy upsampling_policy = node.upsampling_policy();
- ARM_COMPUTE_ERROR_ON(upsampling_policy != InterpolationPolicy::NEAREST_NEIGHBOR);
- ARM_COMPUTE_ERROR_ON(info.x() != 2 || info.y() != 2);
- ARM_COMPUTE_ERROR_ON(input == nullptr);
- ARM_COMPUTE_ERROR_ON(output == nullptr);
-
- // Create and configure function
- auto func = std::make_unique<UpsampleLayerFunction>();
- func->configure(input, output, info, upsampling_policy);
-
- // Log info
- ARM_COMPUTE_LOG_GRAPH_INFO("Instantiated "
- << node.name()
- << " Type: " << node.type()
- << " Target: " << TargetInfo::TargetType
- << " Data Type: " << input->info()->data_type()
- << " Input shape: " << input->info()->tensor_shape()
- << " Output shape: " << output->info()->tensor_shape()
- << " Strides: " << info
- << " Upsampling policy: " << upsampling_policy
- << std::endl);
-
- return RETURN_UNIQUE_PTR(func);
-}
} // namespace detail
} // namespace backends
} // namespace graph
diff --git a/arm_compute/graph/backends/ValidateHelpers.h b/arm_compute/graph/backends/ValidateHelpers.h
index df1c17697b..f8cb1c12e9 100644
--- a/arm_compute/graph/backends/ValidateHelpers.h
+++ b/arm_compute/graph/backends/ValidateHelpers.h
@@ -654,28 +654,6 @@ Status validate_strided_slice_layer(StridedSliceLayerNode &node)
return StridedSliceLayer::validate(input, output, starts, ends, strides, info.begin_mask(), info.end_mask(), info.shrink_axis_mask());
}
-/** Validates a Upsample layer node
- *
- * @tparam UpsampleLayer Upsample layer type
- *
- * @param[in] node Node to validate
- *
- * @return Status
- */
-template <typename UpsampleLayer>
-Status validate_upsample_layer(UpsampleLayerNode &node)
-{
- ARM_COMPUTE_LOG_GRAPH_VERBOSE("Validating UpsampleLayer node with ID : " << node.id() << " and Name: " << node.name() << std::endl);
- ARM_COMPUTE_RETURN_ERROR_ON(node.num_inputs() != 1);
- ARM_COMPUTE_RETURN_ERROR_ON(node.num_outputs() != 1);
-
- // Extract input and output
- arm_compute::ITensorInfo *input = detail::get_backing_tensor_info(node.input(0));
- arm_compute::ITensorInfo *output = get_backing_tensor_info(node.output(0));
-
- // Validate function
- return UpsampleLayer::validate(input, output, node.info(), node.upsampling_policy());
-}
/** Validates a element-wise layer node
*
* @param[in] node Node to validate
diff --git a/arm_compute/graph/frontend/Layers.h b/arm_compute/graph/frontend/Layers.h
index dfe7842aa1..c4de4013b2 100644
--- a/arm_compute/graph/frontend/Layers.h
+++ b/arm_compute/graph/frontend/Layers.h
@@ -1459,32 +1459,6 @@ private:
StridedSliceLayerInfo _info;
};
-/** Upsample Layer */
-class UpsampleLayer final : public ILayer
-{
-public:
- /** Construct a Upsample layer.
- *
- * @param[in] info Stride info
- * @param[in] upsampling_policy Upsampling policy
- */
- UpsampleLayer(Size2D info, InterpolationPolicy upsampling_policy)
- : _info(info), _upsampling_policy(upsampling_policy)
- {
- }
-
- NodeID create_layer(IStream &s) override
- {
- NodeParams common_params = { name(), s.hints().target_hint };
- NodeIdxPair input = { s.tail_node(), 0 };
- return GraphBuilder::add_upsample_node(s.graph(), common_params, input, _info, _upsampling_policy);
- }
-
-private:
- Size2D _info;
- InterpolationPolicy _upsampling_policy;
-};
-
/** YOLO Layer */
class YOLOLayer final : public ILayer
{
diff --git a/arm_compute/graph/nodes/Nodes.h b/arm_compute/graph/nodes/Nodes.h
index 9a6f982da7..edb1876722 100644
--- a/arm_compute/graph/nodes/Nodes.h
+++ b/arm_compute/graph/nodes/Nodes.h
@@ -67,6 +67,5 @@
#include "arm_compute/graph/nodes/SplitLayerNode.h"
#include "arm_compute/graph/nodes/StackLayerNode.h"
#include "arm_compute/graph/nodes/StridedSliceLayerNode.h"
-#include "arm_compute/graph/nodes/UpsampleLayerNode.h"
#endif /* ARM_COMPUTE_GRAPH_NODES_H */
diff --git a/arm_compute/graph/nodes/NodesFwd.h b/arm_compute/graph/nodes/NodesFwd.h
index b46b5d5f09..485361296a 100644
--- a/arm_compute/graph/nodes/NodesFwd.h
+++ b/arm_compute/graph/nodes/NodesFwd.h
@@ -73,7 +73,6 @@ class SliceLayerNode;
class SplitLayerNode;
class StackLayerNode;
class StridedSliceLayerNode;
-class UpsampleLayerNode;
} // namespace graph
} // namespace arm_compute
#endif /* ARM_COMPUTE_GRAPH_NODES_FWD_H */
diff --git a/arm_compute/graph/nodes/UpsampleLayerNode.h b/arm_compute/graph/nodes/UpsampleLayerNode.h
deleted file mode 100644
index 8e43ac23f3..0000000000
--- a/arm_compute/graph/nodes/UpsampleLayerNode.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2018-2019 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef ARM_COMPUTE_GRAPH_UPSAMPLE_LAYER_NODE_H
-#define ARM_COMPUTE_GRAPH_UPSAMPLE_LAYER_NODE_H
-
-#include "arm_compute/graph/INode.h"
-
-namespace arm_compute
-{
-namespace graph
-{
-/** Upsample Layer node */
-class UpsampleLayerNode final : public INode
-{
-public:
- /** Constructor
- *
- * @param[in] info Stride info
- * @param[in] upsampling_policy Upsampling policy
- */
- UpsampleLayerNode(Size2D info, InterpolationPolicy upsampling_policy);
- /** Stride info metadata accessor
- *
- * @return The stride info of the layer
- */
- Size2D info() const;
- /** Upsampling policy metadata accessor
- *
- * @return The upsampling policy of the layer
- */
- InterpolationPolicy upsampling_policy() const;
- /** Computes upsample output descriptor
- *
- * @param[in] input_descriptor Input descriptor
- * @param[in] info Stride information
- *
- * @return Output descriptor
- */
- static TensorDescriptor compute_output_descriptor(const TensorDescriptor &input_descriptor, Size2D info);
-
- // Inherited overridden methods:
- NodeType type() const override;
- bool forward_descriptors() override;
- TensorDescriptor configure_output(size_t idx) const override;
- void accept(INodeVisitor &v) override;
-
-private:
- Size2D _info;
- InterpolationPolicy _upsampling_policy;
-};
-} // namespace graph
-} // namespace arm_compute
-#endif /* ARM_COMPUTE_GRAPH_UPSAMPLE_LAYER_NODE_H */
diff --git a/arm_compute/runtime/CL/CLFunctions.h b/arm_compute/runtime/CL/CLFunctions.h
index 2f336b30ad..26c2670cbc 100644
--- a/arm_compute/runtime/CL/CLFunctions.h
+++ b/arm_compute/runtime/CL/CLFunctions.h
@@ -148,7 +148,6 @@
#include "arm_compute/runtime/CL/functions/CLTile.h"
#include "arm_compute/runtime/CL/functions/CLTranspose.h"
#include "arm_compute/runtime/CL/functions/CLUnstack.h"
-#include "arm_compute/runtime/CL/functions/CLUpsampleLayer.h"
#include "arm_compute/runtime/CL/functions/CLWarpAffine.h"
#include "arm_compute/runtime/CL/functions/CLWarpPerspective.h"
#include "arm_compute/runtime/CL/functions/CLWinogradConvolutionLayer.h"
diff --git a/arm_compute/runtime/CL/functions/CLUpsampleLayer.h b/arm_compute/runtime/CL/functions/CLUpsampleLayer.h
deleted file mode 100644
index 88b293069d..0000000000
--- a/arm_compute/runtime/CL/functions/CLUpsampleLayer.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef ARM_COMPUTE_CLUPSAMPLELAYER_H
-#define ARM_COMPUTE_CLUPSAMPLELAYER_H
-
-#include "arm_compute/runtime/IFunction.h"
-
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/IFunction.h"
-
-#include <memory>
-
-namespace arm_compute
-{
-class CLCompileContext;
-class CLUpsampleLayerKernel;
-class ICLTensor;
-class ITensorInfo;
-
-/** Basic function to run @ref CLUpsampleLayerKernel */
-class CLUpsampleLayer : public IFunction
-{
-public:
- /** Default constructor */
- CLUpsampleLayer();
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- CLUpsampleLayer(const CLUpsampleLayer &) = delete;
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- CLUpsampleLayer &operator=(const CLUpsampleLayer &) = delete;
- /** Allow instances of this class to be moved */
- CLUpsampleLayer(CLUpsampleLayer &&) = default;
- /** Allow instances of this class to be moved */
- CLUpsampleLayer &operator=(CLUpsampleLayer &&) = default;
- /** Default destructor */
- ~CLUpsampleLayer();
-
- /** Initialize the function's source, destination, interpolation type and border_mode.
- *
- * @param[in] input Source tensor. Data type supported: All.
- * @param[out] output Destination tensor. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] upsampling_policy Defines the policy to fill the intermediate pixels.
- */
- void configure(ICLTensor *input, ICLTensor *output,
- const Size2D &info, const InterpolationPolicy upsampling_policy);
- /** Initialize the function's source, destination, interpolation type and border_mode.
- *
- * @param[in] compile_context The compile context to be used.
- * @param[in] input Source tensor. Data type supported: All.
- * @param[out] output Destination tensor. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] upsampling_policy Defines the policy to fill the intermediate pixels.
- */
- void configure(const CLCompileContext &compile_context, ICLTensor *input, ICLTensor *output,
- const Size2D &info, const InterpolationPolicy upsampling_policy);
- /** Static function to check if given info will lead to a valid configuration of @ref CLUpsampleLayerKernel
- *
- * @param[in] input Source tensor info. Data types supported: All.
- * @param[in] output Destination tensor info. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] upsampling_policy Defines the policy to fill the intermediate pixels.
- *
- * @return a status
- */
- static Status validate(const ITensorInfo *input, const ITensorInfo *output,
- const Size2D &info, const InterpolationPolicy upsampling_policy);
-
- // Inherited methods overridden:
- void run() override;
-
-private:
- std::unique_ptr<CLUpsampleLayerKernel> _upsample;
- ICLTensor *_output;
-};
-} // namespace arm_compute
-#endif /* ARM_COMPUTE_CLUPSAMPLELAYER_H */
diff --git a/arm_compute/runtime/NEON/NEFunctions.h b/arm_compute/runtime/NEON/NEFunctions.h
index 1df6f8f08e..b7d05f9078 100644
--- a/arm_compute/runtime/NEON/NEFunctions.h
+++ b/arm_compute/runtime/NEON/NEFunctions.h
@@ -145,7 +145,6 @@
#include "arm_compute/runtime/NEON/functions/NETile.h"
#include "arm_compute/runtime/NEON/functions/NETranspose.h"
#include "arm_compute/runtime/NEON/functions/NEUnstack.h"
-#include "arm_compute/runtime/NEON/functions/NEUpsampleLayer.h"
#include "arm_compute/runtime/NEON/functions/NEWarpAffine.h"
#include "arm_compute/runtime/NEON/functions/NEWarpPerspective.h"
#include "arm_compute/runtime/NEON/functions/NEWinogradConvolutionLayer.h"
diff --git a/arm_compute/runtime/NEON/functions/NEUpsampleLayer.h b/arm_compute/runtime/NEON/functions/NEUpsampleLayer.h
deleted file mode 100644
index 168845d203..0000000000
--- a/arm_compute/runtime/NEON/functions/NEUpsampleLayer.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef ARM_COMPUTE_NEUPSAMPLELAYER_H
-#define ARM_COMPUTE_NEUPSAMPLELAYER_H
-
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/IFunction.h"
-#include "arm_compute/runtime/NEON/NEScheduler.h"
-#include "arm_compute/runtime/Tensor.h"
-
-#include <memory>
-
-namespace arm_compute
-{
-class ITensor;
-class NEUpsampleLayerKernel;
-
-/** Function to run upsample layer */
-class NEUpsampleLayer : public IFunction
-{
-public:
- /** Constructor */
- NEUpsampleLayer();
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- NEUpsampleLayer(const NEUpsampleLayer &) = delete;
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- NEUpsampleLayer &operator=(const NEUpsampleLayer &) = delete;
- /** Prevent instances of this class from being moved (As this class contains non movable objects) */
- NEUpsampleLayer(NEUpsampleLayer &&) = delete;
- /** Prevent instances of this class from being moved (As this class contains non movable objects) */
- NEUpsampleLayer &operator=(NEUpsampleLayer &&) = delete;
- /** Default destructor */
- ~NEUpsampleLayer();
- /** Set the input output tensors.
- *
- * @param[in] input Source tensor. Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32.
- * @param[out] output Destination tensor. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] policy Defines the policy to fill the intermediate pixels.
- *
- */
- void configure(const ITensor *input, ITensor *output, const Size2D &info,
- const InterpolationPolicy &policy);
- /** Static function to check if given info will lead to a valid configuration of @ref NEUpsampleLayer
- *
- * @param[in] input Source tensor info. Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32.
- * @param[out] output Destination tensor info. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] policy Defines the policy to fill the intermediate pixels.
- *
- * @return a status
- */
- static Status validate(const ITensorInfo *input, const ITensorInfo *output, const Size2D &info,
- const InterpolationPolicy &policy);
-
- // Inherited methods overridden:
- void run() override;
-
-private:
- std::unique_ptr<NEUpsampleLayerKernel> _kernel;
- DataLayout _data_layout;
-};
-} // arm_compute
-#endif /* ARM_COMPUTE_NEUPSAMPLELAYER_H */
diff --git a/docs/00_introduction.dox b/docs/00_introduction.dox
index f0196b82a6..448025846b 100644
--- a/docs/00_introduction.dox
+++ b/docs/00_introduction.dox
@@ -96,9 +96,11 @@ v21.02 Public major release
- NEGEMMTranspose1xW
- NEComputeAllAnchors / CLComputeAllAnchors
- NEGEMMAssemblyDispatch
+ - NEUpsampleLayer / CLUpsampleLayer
- Removed kernels:
- NEGEMMMatrixVectorMultiplyKernel
- NELocallyConnectedMatrixMultiplyKernel / CLLocallyConnectedMatrixMultiplyKernel
+ - NEUpsampleLayerKernel / CLUpsampleLayerKernel
v20.11 Public major release
- Various bug fixes.
@@ -439,7 +441,7 @@ v20.08 Public major release
- @ref NEROIPoolingLayerKernel
- @ref NEROIAlignLayerKernel
- NEYOLOLayerKernel
- - @ref NEUpsampleLayerKernel
+ - NEUpsampleLayerKernel
- @ref NEFloorKernel
- @ref NEWidthConcatenateLayerKernel
- @ref NEDepthConcatenateLayerKernel
@@ -500,7 +502,7 @@ v20.05 Public major release
- @ref CLReduceMean
- @ref NEScale
- @ref NEScaleKernel
- - @ref NEUpsampleLayer
+ - NEUpsampleLayer
- @ref NECast
- @ref NEReductionOperation
- @ref NEReduceMean
@@ -893,7 +895,7 @@ v18.11 Public major release
- @ref NEReduceMean
- @ref NEReorgLayer / @ref NEReorgLayerKernel
- @ref NEPriorBoxLayer / @ref NEPriorBoxLayerKernel
- - @ref NEUpsampleLayer / @ref NEUpsampleLayerKernel
+ - NEUpsampleLayer / NEUpsampleLayerKernel
- NEYOLOLayer / NEYOLOLayerKernel
- New OpenCL kernels / functions:
- @ref CLBatchToSpaceLayer / @ref CLBatchToSpaceLayerKernel
@@ -910,7 +912,7 @@ v18.11 Public major release
- @ref CLSlice
- @ref CLSplit
- @ref CLStridedSlice / @ref CLStridedSliceKernel
- - @ref CLUpsampleLayer / @ref CLUpsampleLayerKernel
+ - CLUpsampleLayer / CLUpsampleLayerKernel
- CLYOLOLayer / CLYOLOLayerKernel
- New CPP kernels / functions:
- @ref CPPBoxWithNonMaximaSuppressionLimit / @ref CPPBoxWithNonMaximaSuppressionLimitKernel
diff --git a/examples/graph_yolov3.cpp b/examples/graph_yolov3.cpp
index 9eb24a1718..54aaf201cb 100644
--- a/examples/graph_yolov3.cpp
+++ b/examples/graph_yolov3.cpp
@@ -187,7 +187,7 @@ public:
0.000001f)
.set_name("conv2d_59/BatchNorm")
<< ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f)).set_name("conv2d_60/LeakyRelu")
- << UpsampleLayer(Size2D(2, 2), InterpolationPolicy::NEAREST_NEIGHBOR).set_name("Upsample_60");
+ << ResizeLayer(InterpolationPolicy::NEAREST_NEIGHBOR, 2, 2).set_name("Upsample_60");
SubStream concat_1(route_1);
concat_1 << ConcatLayer(std::move(route_1), std::move(intermediate_layers.second)).set_name("Route1")
<< ConvolutionLayer(
@@ -298,7 +298,7 @@ public:
0.000001f)
.set_name("conv2d_66/BatchNorm")
<< ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f)).set_name("conv2d_68/LeakyRelu")
- << UpsampleLayer(Size2D(2, 2), InterpolationPolicy::NEAREST_NEIGHBOR).set_name("Upsample_68");
+ << ResizeLayer(InterpolationPolicy::NEAREST_NEIGHBOR, 2, 2).set_name("Upsample_68");
SubStream concat_2(route_2);
concat_2 << ConcatLayer(std::move(route_2), std::move(intermediate_layers.first)).set_name("Route2")
<< ConvolutionLayer(
diff --git a/src/core/CL/CLKernels.h b/src/core/CL/CLKernels.h
index 5d0d326489..f23871d4db 100644
--- a/src/core/CL/CLKernels.h
+++ b/src/core/CL/CLKernels.h
@@ -141,7 +141,6 @@
#include "src/core/CL/kernels/CLThresholdKernel.h"
#include "src/core/CL/kernels/CLTileKernel.h"
#include "src/core/CL/kernels/CLTransposeKernel.h"
-#include "src/core/CL/kernels/CLUpsampleLayerKernel.h"
#include "src/core/CL/kernels/CLWarpAffineKernel.h"
#include "src/core/CL/kernels/CLWarpPerspectiveKernel.h"
#include "src/core/CL/kernels/CLWeightsReshapeKernel.h"
diff --git a/src/core/CL/kernels/CLUpsampleLayerKernel.cpp b/src/core/CL/kernels/CLUpsampleLayerKernel.cpp
deleted file mode 100644
index acb2fbcd04..0000000000
--- a/src/core/CL/kernels/CLUpsampleLayerKernel.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "src/core/CL/kernels/CLUpsampleLayerKernel.h"
-
-#include "arm_compute/core/CL/CLHelpers.h"
-#include "arm_compute/core/CL/CLKernelLibrary.h"
-#include "arm_compute/core/CL/ICLTensor.h"
-#include "arm_compute/core/Error.h"
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/core/Validate.h"
-#include "arm_compute/core/Window.h"
-#include "arm_compute/core/utils/misc/ShapeCalculator.h"
-#include "src/core/AccessWindowStatic.h"
-#include "src/core/CL/CLValidate.h"
-#include "src/core/helpers/AutoConfiguration.h"
-#include "src/core/helpers/WindowHelpers.h"
-#include "support/StringSupport.h"
-
-namespace arm_compute
-{
-CLUpsampleLayerKernel::CLUpsampleLayerKernel()
- : _input(nullptr), _output(nullptr), _info(), _data_layout(DataLayout::UNKNOWN), _num_elems_processed_per_iteration_input_x()
-{
-}
-
-Status CLUpsampleLayerKernel::validate(const ITensorInfo *input, const ITensorInfo *output, const Size2D &info, const InterpolationPolicy upsampling_policy)
-{
- ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, output);
- ARM_COMPUTE_UNUSED(upsampling_policy);
-
- DataLayout data_layout = input->data_layout();
- const int idx_width = get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH);
- const int idx_height = get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT);
-
- ARM_COMPUTE_RETURN_ERROR_ON_F16_UNSUPPORTED(input);
- ARM_COMPUTE_RETURN_ERROR_ON(input->data_type() == DataType::UNKNOWN);
-
- ARM_COMPUTE_RETURN_ERROR_ON_MSG(info.x() != 2 || info.y() != 2, "Only stride 2 is supported");
- ARM_COMPUTE_RETURN_ERROR_ON_MSG(upsampling_policy != InterpolationPolicy::NEAREST_NEIGHBOR, "Only nearest neighbor policy supported");
-
- if(output->total_size() != 0)
- {
- ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, output);
- ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_LAYOUT(input, output);
- ARM_COMPUTE_RETURN_ERROR_ON(output->dimension(idx_width) != info.x() * input->dimension(idx_width));
- ARM_COMPUTE_RETURN_ERROR_ON(output->dimension(idx_height) != info.y() * input->dimension(idx_height));
- ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_QUANTIZATION_INFO(input, output);
- }
-
- return Status{};
-}
-
-void CLUpsampleLayerKernel::configure(const ICLTensor *input, ICLTensor *output, const Size2D &info, const InterpolationPolicy upsampling_policy)
-{
- configure(CLKernelLibrary::get().get_compile_context(), input, output, info, upsampling_policy);
-}
-
-void CLUpsampleLayerKernel::configure(const CLCompileContext &compile_context, const ICLTensor *input, ICLTensor *output, const Size2D &info, const InterpolationPolicy upsampling_policy)
-{
- ARM_COMPUTE_ERROR_ON_NULLPTR(input, output);
- ARM_COMPUTE_UNUSED(upsampling_policy);
-
- _input = input;
- _output = output;
- _info = info;
- _data_layout = input->info()->data_layout();
- _num_elems_processed_per_iteration_input_x = 1;
-
- TensorShape output_shape = misc::shape_calculator::compute_upsample_shape(*input->info(), info);
- auto_init_if_empty(*output->info(), output_shape, 1, input->info()->data_type());
- output->info()->set_data_layout(_data_layout);
-
- unsigned int num_elems_processed_per_iteration_x = 16;
- const int output_width_x = output->info()->dimension(0);
- const bool multi_access_x = ((output_width_x / num_elems_processed_per_iteration_x) > 0);
-
- // Perform validation step
- ARM_COMPUTE_ERROR_THROW_ON(CLUpsampleLayerKernel::validate(input->info(), output->info(), info, upsampling_policy));
-
- Window win{};
-
- switch(_data_layout)
- {
- case DataLayout::NCHW:
- {
- win = calculate_max_window(*output->info());
- win.set(Window::DimY, Window::Dimension(win.y().start(), win.y().end(), info.y()));
- if(multi_access_x)
- {
- _num_elems_processed_per_iteration_input_x = num_elems_processed_per_iteration_x / info.x();
- win.set(Window::DimX, Window::Dimension(win.x().start(), ceil_to_multiple(win.x().end(), num_elems_processed_per_iteration_x), num_elems_processed_per_iteration_x));
- }
- break;
- }
- case DataLayout::NHWC:
- {
- win = calculate_max_window(*output->info());
- win.set(Window::DimY, Window::Dimension(win.y().start(), win.y().end(), info.x()));
- win.set(Window::DimZ, Window::Dimension(win.z().start(), win.z().end(), info.y()));
- if(multi_access_x)
- {
- _num_elems_processed_per_iteration_input_x = num_elems_processed_per_iteration_x;
- win.set(Window::DimX, Window::Dimension(win.x().start(), ceil_to_multiple(win.x().end(),
- num_elems_processed_per_iteration_x),
- num_elems_processed_per_iteration_x));
- }
- break;
- }
- default:
- ARM_COMPUTE_ERROR("Not implemented");
- }
-
- // Create kernel
- CLBuildOptions build_opts;
- build_opts.add_option(("-DDATA_TYPE=" + get_cl_unsigned_type_from_element_size(input->info()->element_size())));
- build_opts.add_option_if(multi_access_x, "-DVEC_SIZE_IN=" + support::cpp11::to_string(_num_elems_processed_per_iteration_input_x));
- build_opts.add_option_if(multi_access_x, "-DVEC_SIZE_OUT=" + support::cpp11::to_string(num_elems_processed_per_iteration_x));
- build_opts.add_option_if(multi_access_x, "-DLAST_ACCESSED_X_IN=" + support::cpp11::to_string(std::max<int>(_input->info()->dimension(0) - _num_elems_processed_per_iteration_input_x, 0)));
- build_opts.add_option_if(multi_access_x, "-DLAST_ACCESSED_X_OUT=" + support::cpp11::to_string(std::max<int>(output_width_x - num_elems_processed_per_iteration_x, 0)));
- _kernel = create_kernel(compile_context, "upsample_layer_" + lower_string(string_from_data_layout(input->info()->data_layout())), build_opts.options());
-
- ICLKernel::configure_internal(win);
-}
-
-void CLUpsampleLayerKernel::run(const Window &window, cl::CommandQueue &queue)
-{
- ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this);
- ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(ICLKernel::window(), window);
-
- Window collapsed_window = window.collapse_if_possible(ICLKernel::window(), Window::DimZ);
- Window slice_out = collapsed_window.first_slice_window_3D();
- Window slice_in = collapsed_window.first_slice_window_3D();
-
- switch(_data_layout)
- {
- case DataLayout::NCHW:
- slice_in.set(Window::DimX, Window::Dimension(0, _input->info()->dimension(0), _num_elems_processed_per_iteration_input_x));
- slice_in.set(Window::DimY, Window::Dimension(0, _input->info()->dimension(1), 1));
- break;
- case DataLayout::NHWC:
- slice_in.set(Window::DimY, Window::Dimension(0, _input->info()->dimension(1), 1));
- slice_in.set(Window::DimZ, Window::Dimension(0, _input->info()->dimension(2), 1));
- break;
- default:
- ARM_COMPUTE_ERROR("Not implemented");
- }
-
- do
- {
- unsigned int idx = 0;
- add_3D_tensor_argument(idx, _input, slice_in);
- add_3D_tensor_argument(idx, _output, slice_out);
- enqueue(queue, *this, slice_out, lws_hint());
- }
- while(collapsed_window.slide_window_slice_3D(slice_out) && collapsed_window.slide_window_slice_3D(slice_in));
-}
-} // namespace arm_compute
diff --git a/src/core/CL/kernels/CLUpsampleLayerKernel.h b/src/core/CL/kernels/CLUpsampleLayerKernel.h
deleted file mode 100644
index f90ee07bf4..0000000000
--- a/src/core/CL/kernels/CLUpsampleLayerKernel.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef ARM_COMPUTE_CLUPSAMPLELAYERKERNEL_H
-#define ARM_COMPUTE_CLUPSAMPLELAYERKERNEL_H
-
-#include "src/core/CL/ICLKernel.h"
-
-namespace arm_compute
-{
-class ICLTensor;
-
-/** Interface for the UpsampleLayer kernel on OpenCL. */
-class CLUpsampleLayerKernel : public ICLKernel
-{
-public:
- /** Constructor */
- CLUpsampleLayerKernel();
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- CLUpsampleLayerKernel(const CLUpsampleLayerKernel &) = delete;
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- CLUpsampleLayerKernel &operator=(const CLUpsampleLayerKernel &) = delete;
- /** Default Move Constructor. */
- CLUpsampleLayerKernel(CLUpsampleLayerKernel &&) = default;
- /** Default move assignment operator */
- CLUpsampleLayerKernel &operator=(CLUpsampleLayerKernel &&) = default;
- /** Default destructor */
- ~CLUpsampleLayerKernel() = default;
-
- /** Initialise the kernel's input and output.
- *
- * @param[in] input Source tensor. Data types supported: All.
- * @param[out] output Destination tensor. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] upsampling_policy Defines the policy to fill the intermediate pixels.
- */
- void configure(const ICLTensor *input, ICLTensor *output, const Size2D &info, const InterpolationPolicy upsampling_policy);
- /** Initialise the kernel's input and output.
- *
- * @param[in] compile_context The compile context to be used.
- * @param[in] input Source tensor. Data types supported: All.
- * @param[out] output Destination tensor. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] upsampling_policy Defines the policy to fill the intermediate pixels.
- */
- void configure(const CLCompileContext &compile_context, const ICLTensor *input, ICLTensor *output, const Size2D &info, const InterpolationPolicy upsampling_policy);
- /** Static function to check if given info will lead to a valid configuration of @ref CLUpsampleLayerKernel
- *
- * @param[in] input Source tensor info. Data types supported: All.
- * @param[in] output Destination tensor info. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] upsampling_policy Defines the policy to fill the intermediate pixels.
- *
- * @return a status
- */
- static Status validate(const ITensorInfo *input, const ITensorInfo *output, const Size2D &info, const InterpolationPolicy upsampling_policy);
-
- // Inherited methods overridden:
- void run(const Window &window, cl::CommandQueue &queue) override;
-
-private:
- const ICLTensor *_input;
- ICLTensor *_output;
- Size2D _info;
- DataLayout _data_layout;
- unsigned int _num_elems_processed_per_iteration_input_x;
-};
-} // namespace arm_compute
-#endif /*ARM_COMPUTE_CLUPSAMPLELAYERKERNEL_H */
diff --git a/src/core/NEON/NEKernels.h b/src/core/NEON/NEKernels.h
index 90c7df3c1c..d6cd696414 100644
--- a/src/core/NEON/NEKernels.h
+++ b/src/core/NEON/NEKernels.h
@@ -140,7 +140,6 @@
#include "src/core/NEON/kernels/NEThresholdKernel.h"
#include "src/core/NEON/kernels/NETileKernel.h"
#include "src/core/NEON/kernels/NETransposeKernel.h"
-#include "src/core/NEON/kernels/NEUpsampleLayerKernel.h"
#include "src/core/NEON/kernels/NEWarpKernel.h"
#include "src/core/NEON/kernels/NEWeightsReshapeKernel.h"
#include "src/core/NEON/kernels/NEWidthConcatenateLayerKernel.h"
diff --git a/src/core/NEON/kernels/NEUpsampleLayerKernel.cpp b/src/core/NEON/kernels/NEUpsampleLayerKernel.cpp
deleted file mode 100644
index cbdec50a42..0000000000
--- a/src/core/NEON/kernels/NEUpsampleLayerKernel.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "src/core/NEON/kernels/NEUpsampleLayerKernel.h"
-
-#include "arm_compute/core/Error.h"
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/core/ITensor.h"
-#include "arm_compute/core/TensorInfo.h"
-#include "arm_compute/core/Validate.h"
-#include "arm_compute/core/Window.h"
-#include "arm_compute/core/utils/misc/ShapeCalculator.h"
-#include "src/core/CPP/Validate.h"
-#include "src/core/NEON/wrapper/wrapper.h"
-#include "src/core/helpers/AutoConfiguration.h"
-#include "src/core/helpers/WindowHelpers.h"
-
-#include <arm_neon.h>
-
-namespace arm_compute
-{
-namespace
-{
-template <typename T, int S>
-inline T get_data_out(T data, int offset)
-{
- T out{ 0 };
- for(int i = 0; i < S / 2; ++i)
- {
- out[2 * i] = wrapper::vgetlane(data, i + offset);
- out[2 * i + 1] = wrapper::vgetlane(data, i + offset);
- }
- return out;
-}
-} // namespace
-NEUpsampleLayerKernel::NEUpsampleLayerKernel()
- : _func(nullptr), _input(nullptr), _output(nullptr), _info()
-{
-}
-
-Status NEUpsampleLayerKernel::validate(const ITensorInfo *input, const ITensorInfo *output, const Size2D &info, const InterpolationPolicy policy)
-{
- ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, output);
- ARM_COMPUTE_UNUSED(policy);
-
- const DataLayout data_layout = input->data_layout();
- const int idx_width = get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH);
- const int idx_height = get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT);
-
- ARM_COMPUTE_RETURN_ERROR_ON_CPU_F16_UNSUPPORTED(input);
- ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input, 1, DataType::QASYMM8_SIGNED, DataType::QASYMM8, DataType::F16, DataType::F32);
- ARM_COMPUTE_RETURN_ERROR_ON_MSG(info.x() != 2 || info.y() != 2, "Only stride 2 is supported");
- ARM_COMPUTE_RETURN_ERROR_ON_MSG(policy != InterpolationPolicy::NEAREST_NEIGHBOR, "Only nearest neighbor policy supported");
-
- // Check output if configured
- if(output->total_size() != 0)
- {
- ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, output);
- ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_LAYOUT(input, output);
- ARM_COMPUTE_RETURN_ERROR_ON(output->dimension(idx_width) != info.x() * input->dimension(idx_width));
- ARM_COMPUTE_RETURN_ERROR_ON(output->dimension(idx_height) != info.y() * input->dimension(idx_height));
- ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_QUANTIZATION_INFO(input, output);
- }
- return Status{};
-}
-
-template <typename T, int S>
-void NEUpsampleLayerKernel::upsample_nchw(const arm_compute::Window &window)
-{
- using VectorType = typename wrapper::traits::neon_vector<T, S>::type;
-
- Window window_in(window);
- window_in.set(Window::DimX, Window::Dimension(0, 1, 1));
-
- Window window_out(window);
- window_out.set(Window::DimX, Window::Dimension(0, 1, 1));
- window_out.set(Window::DimY, Window::Dimension(0, _output->info()->dimension(1), _info.y()));
-
- const auto window_start_x = static_cast<int>(window.x().start());
- const auto window_end_x = static_cast<int>(window.x().end());
- const int window_step_x = S;
-
- Iterator input(_input, window_in);
- Iterator output(_output, window_out);
- const int offset_y_out = _output->info()->strides_in_bytes().y() / sizeof(T);
-
- execute_window_loop(window_out, [&](const Coordinates &)
- {
- const auto input_ptr = reinterpret_cast<const T *>(input.ptr());
- const auto output_ptr = reinterpret_cast<T *>(output.ptr());
-
- int x = window_start_x;
- for(; x <= (window_end_x - window_step_x); x += window_step_x)
- {
- const VectorType data = wrapper::vloadq(reinterpret_cast<const T *>(input_ptr + x));
- const VectorType data_out1 = get_data_out<VectorType, S>(data, 0);
- const VectorType data_out2 = get_data_out<VectorType, S>(data, S / 2);
-
- wrapper::vstore(output_ptr + 2 * x, data_out1);
- wrapper::vstore(output_ptr + 2 * x + S, data_out2);
- wrapper::vstore(output_ptr + 2 * x + offset_y_out, data_out1);
- wrapper::vstore(output_ptr + 2 * x + offset_y_out + S, data_out2);
- }
-
- // Compute left-over elements
- for(; x < window_end_x; ++x)
- {
- *(output_ptr + 2 * x) = *(input_ptr + x);
- *(output_ptr + 2 * x + 1) = *(input_ptr + x);
- *(output_ptr + 2 * x + offset_y_out) = *(input_ptr + x);
- *(output_ptr + 2 * x + offset_y_out + 1) = *(input_ptr + x);
- }
- },
- input, output);
-}
-
-template <typename T, int S>
-void NEUpsampleLayerKernel::upsample_nhwc(const arm_compute::Window &window)
-{
- using VectorType = typename wrapper::traits::neon_vector<T, S>::type;
-
- Window window_out(window);
- window_out.set(Window::DimX, Window::Dimension(0, 1, 1));
- window_out.set(Window::DimY, Window::Dimension(0, _output->info()->dimension(1), _info.x()));
- window_out.set(Window::DimZ, Window::Dimension(0, _output->info()->dimension(2), _info.y()));
-
- const auto window_start_x = static_cast<int>(window.x().start());
- const auto window_end_x = static_cast<int>(window.x().end());
- const int window_step_x = S;
-
- Window window_in{ window };
- window_in.set(Window::DimX, Window::Dimension(0, 1, 1));
-
- Iterator input(_input, window_in);
- Iterator output(_output, window_out);
-
- const int offset_y_out = _output->info()->strides_in_bytes().y() / sizeof(T);
- const int offset_z_out = _output->info()->strides_in_bytes().z() / sizeof(T);
-
- execute_window_loop(window_out, [&](const Coordinates &)
- {
- const auto input_ptr = reinterpret_cast<const T *>(input.ptr());
- const auto output_ptr = reinterpret_cast<T *>(output.ptr());
-
- int x = window_start_x;
- for(; x <= (window_end_x - window_step_x); x += window_step_x)
- {
- const VectorType data = wrapper::vloadq(reinterpret_cast<const T *>(input_ptr + x));
-
- wrapper::vstore(output_ptr + x, data);
- wrapper::vstore(output_ptr + x + offset_y_out, data);
- wrapper::vstore(output_ptr + x + offset_z_out, data);
- wrapper::vstore(output_ptr + x + offset_y_out + offset_z_out, data);
- }
-
- // Compute left-over elements
- for(; x < window_end_x; ++x)
- {
- *(output_ptr + x) = *(input_ptr + x);
- *(output_ptr + x + offset_y_out) = *(input_ptr + x);
- *(output_ptr + x + offset_z_out) = *(input_ptr + x);
- *(output_ptr + x + offset_y_out + offset_z_out) = *(input_ptr + x);
- }
- },
- input, output);
-}
-
-void NEUpsampleLayerKernel::configure(const ITensor *input, ITensor *output, const Size2D &info, const InterpolationPolicy policy)
-{
- ARM_COMPUTE_ERROR_ON_NULLPTR(input, output);
- ARM_COMPUTE_UNUSED(policy);
-
- _input = input;
- _output = output;
- _info = info;
-
- const DataLayout data_layout = input->info()->data_layout();
-
- TensorShape output_shape = misc::shape_calculator::compute_upsample_shape(*input->info(), info);
- auto_init_if_empty(*output->info(), output_shape, 1, input->info()->data_type());
- output->info()->set_data_layout(data_layout);
-
- // Perform validation step
- ARM_COMPUTE_ERROR_THROW_ON(NEUpsampleLayerKernel::validate(input->info(), output->info(), info, policy));
-
- switch(data_layout)
- {
- case DataLayout::NCHW:
- {
- switch(input->info()->data_type())
- {
- case DataType::QASYMM8_SIGNED:
- _func = &NEUpsampleLayerKernel::upsample_nchw<int8_t, 16>;
- break;
- case DataType::QASYMM8:
- _func = &NEUpsampleLayerKernel::upsample_nchw<uint8_t, 16>;
- break;
- case DataType::F32:
- _func = &NEUpsampleLayerKernel::upsample_nchw<float, 4>;
- break;
-#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
- case DataType::F16:
- _func = &NEUpsampleLayerKernel::upsample_nchw<float16_t, 8>;
- ;
- break;
-#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
- default:
- ARM_COMPUTE_ERROR("Not implemented");
- }
- break;
- }
- case DataLayout::NHWC:
- {
- switch(input->info()->data_type())
- {
- case DataType::QASYMM8_SIGNED:
- _func = &NEUpsampleLayerKernel::upsample_nhwc<int8_t, 16>;
- break;
- case DataType::QASYMM8:
- _func = &NEUpsampleLayerKernel::upsample_nhwc<uint8_t, 16>;
- break;
- case DataType::F32:
- _func = &NEUpsampleLayerKernel::upsample_nhwc<float, 4>;
- break;
-#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
- case DataType::F16:
- _func = &NEUpsampleLayerKernel::upsample_nhwc<float16_t, 8>;
- break;
-#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
- default:
- ARM_COMPUTE_ERROR("Not implemented");
- }
- break;
- }
- default:
- ARM_COMPUTE_ERROR("Not implemented");
- }
-
- // Configure window
- Window win = calculate_max_window(*input->info(), Steps());
- Coordinates coord;
- coord.set_num_dimensions(output->info()->num_dimensions());
- output->info()->set_valid_region(ValidRegion(coord, output->info()->tensor_shape()));
- INEKernel::configure(win);
-}
-
-void NEUpsampleLayerKernel::run(const Window &window, const ThreadInfo &info)
-{
- ARM_COMPUTE_UNUSED(info);
- ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this);
- ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(INEKernel::window(), window);
- ARM_COMPUTE_ERROR_ON(_func == nullptr);
-
- (this->*_func)(window);
-}
-} // namespace arm_compute
diff --git a/src/core/NEON/kernels/NEUpsampleLayerKernel.h b/src/core/NEON/kernels/NEUpsampleLayerKernel.h
deleted file mode 100644
index 7ff797a9f8..0000000000
--- a/src/core/NEON/kernels/NEUpsampleLayerKernel.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef ARM_COMPUTE_NEUPSAMPLELAYERKERNEL_H
-#define ARM_COMPUTE_NEUPSAMPLELAYERKERNEL_H
-
-#include "src/core/NEON/INEKernel.h"
-
-namespace arm_compute
-{
-class ITensor;
-
-/** Interface for the Upsample layer kernel.*/
-class NEUpsampleLayerKernel : public INEKernel
-{
-public:
- const char *name() const override
- {
- return "NEUpsampleLayerKernel";
- }
- /** Default constructor */
- NEUpsampleLayerKernel();
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- NEUpsampleLayerKernel(const NEUpsampleLayerKernel &) = delete;
- /** Prevent instances of this class from being copied (As this class contains pointers) */
- NEUpsampleLayerKernel &operator=(const NEUpsampleLayerKernel &) = delete;
- /** Default Move Constructor. */
- NEUpsampleLayerKernel(NEUpsampleLayerKernel &&) = default;
- /** Default move assignment operator */
- NEUpsampleLayerKernel &operator=(NEUpsampleLayerKernel &&) = default;
- /** Default destructor */
- ~NEUpsampleLayerKernel() = default;
- /** Set the input output tensors.
- *
- * @param[in] input Source tensor. Data types supported: QASYMM8/QASYMM8_SIGNED/F16/F32.
- * @param[out] output Destination tensor. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] policy Defines the policy to fill the intermediate pixels.
- *
- */
- void configure(const ITensor *input, ITensor *output, const Size2D &info, const InterpolationPolicy policy);
- /** Static function to check if given info will lead to a valid configuration of @ref NEUpsampleLayerKernel
- *
- * @param[in] input Source tensor info. Data types supported: QASYMM8/QASYMM8_SIGNED/F16/F32.
- * @param[in] output Destination tensor info. Data types supported: same as @p input.
- * @param[in] info Contains stride information described in @ref Size2D.
- * @param[in] policy Defines the policy to fill the intermediate pixels.
- *
- * @return a status
- */
- static Status validate(const ITensorInfo *input, const ITensorInfo *output, const Size2D &info, const InterpolationPolicy policy);
-
- // Inherited methods overridden:
- void run(const Window &window, const ThreadInfo &info) override;
-
-private:
- /** Function to run upsample layer (NCHW)
- *
- * @param[in] window Region on which to execute the kernel. (Must be a valid region of the window returned by window()).
- */
- template <typename T, int S>
- void upsample_nchw(const Window &window);
- /** Function to run upsample layer (NHWC)
- *
- * @param[in] window Region on which to execute the kernel. (Must be a valid region of the window returned by window()).
- */
- template <typename T, int S>
- void upsample_nhwc(const Window &window);
-
- using UpsampleFunctionPtr = void (NEUpsampleLayerKernel::*)(const Window &window);
-
-private:
- UpsampleFunctionPtr _func;
- const ITensor *_input;
- ITensor *_output;
- Size2D _info;
-};
-} // namespace arm_compute
-#endif /*ARM_COMPUTE_NEUPSAMPLELAYERKERNEL_H */
diff --git a/src/graph/GraphBuilder.cpp b/src/graph/GraphBuilder.cpp
index 2afc1e2533..4ae666229e 100644
--- a/src/graph/GraphBuilder.cpp
+++ b/src/graph/GraphBuilder.cpp
@@ -732,11 +732,6 @@ NodeID GraphBuilder::add_stack_node(Graph &g, NodeParams params, const std::vect
return create_simple_multiple_input_single_output_node<StackLayerNode>(g, params, inputs, inputs.size(), axis);
}
-NodeID GraphBuilder::add_upsample_node(Graph &g, NodeParams params, NodeIdxPair input, Size2D info, InterpolationPolicy upsampling_policy)
-{
- return create_simple_single_input_output_node<UpsampleLayerNode>(g, params, input, info, upsampling_policy);
-}
-
NodeID GraphBuilder::add_yolo_node(Graph &g, NodeParams params, NodeIdxPair input, ActivationLayerInfo act_info)
{
check_nodeidx_pair(input, g);
diff --git a/src/graph/backends/CL/CLFunctionsFactory.cpp b/src/graph/backends/CL/CLFunctionsFactory.cpp
index eec01ff686..619641804b 100644
--- a/src/graph/backends/CL/CLFunctionsFactory.cpp
+++ b/src/graph/backends/CL/CLFunctionsFactory.cpp
@@ -315,8 +315,6 @@ std::unique_ptr<IFunction> CLFunctionFactory::create(INode *node, GraphContext &
return detail::create_stack_layer<CLStackLayer, CLTargetInfo>(*polymorphic_downcast<StackLayerNode *>(node));
case NodeType::StridedSliceLayer:
return detail::create_strided_slice_layer<CLStridedSlice, CLTargetInfo>(*polymorphic_downcast<StridedSliceLayerNode *>(node));
- case NodeType::UpsampleLayer:
- return detail::create_upsample_layer<CLUpsampleLayer, CLTargetInfo>(*polymorphic_downcast<UpsampleLayerNode *>(node), ctx);
default:
return nullptr;
}
diff --git a/src/graph/backends/CL/CLNodeValidator.cpp b/src/graph/backends/CL/CLNodeValidator.cpp
index aef93c6543..33e8fb4947 100644
--- a/src/graph/backends/CL/CLNodeValidator.cpp
+++ b/src/graph/backends/CL/CLNodeValidator.cpp
@@ -123,8 +123,6 @@ Status CLNodeValidator::validate(INode *node)
return detail::validate_slice_layer<CLSlice>(*polymorphic_downcast<SliceLayerNode *>(node));
case NodeType::StridedSliceLayer:
return detail::validate_strided_slice_layer<CLStridedSlice>(*polymorphic_downcast<StridedSliceLayerNode *>(node));
- case NodeType::UpsampleLayer:
- return detail::validate_upsample_layer<CLUpsampleLayer>(*polymorphic_downcast<UpsampleLayerNode *>(node));
case NodeType::EltwiseLayer:
return detail::validate_eltwise_Layer<CLEltwiseLayerFunctions>(*polymorphic_downcast<EltwiseLayerNode *>(node));
case NodeType::UnaryEltwiseLayer:
diff --git a/src/graph/backends/GLES/GCNodeValidator.cpp b/src/graph/backends/GLES/GCNodeValidator.cpp
index 13a93a2556..a83c1a3506 100644
--- a/src/graph/backends/GLES/GCNodeValidator.cpp
+++ b/src/graph/backends/GLES/GCNodeValidator.cpp
@@ -138,10 +138,6 @@ Status GCNodeValidator::validate(INode *node)
return ARM_COMPUTE_CREATE_ERROR(arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported operation : ROIAlignLayer");
case NodeType::SliceLayer:
return ARM_COMPUTE_CREATE_ERROR(arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported operation : SliceLayer");
- case NodeType::UpsampleLayer:
- return ARM_COMPUTE_CREATE_ERROR(arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported operation : UpsampleLayer");
- case NodeType::YOLOLayer:
- return ARM_COMPUTE_CREATE_ERROR(arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported operation : YOLOLayer");
default:
return Status{};
}
diff --git a/src/graph/backends/NEON/NEFunctionFactory.cpp b/src/graph/backends/NEON/NEFunctionFactory.cpp
index 1115851b49..b2bd87070c 100644
--- a/src/graph/backends/NEON/NEFunctionFactory.cpp
+++ b/src/graph/backends/NEON/NEFunctionFactory.cpp
@@ -200,8 +200,6 @@ std::unique_ptr<IFunction> NEFunctionFactory::create(INode *node, GraphContext &
return detail::create_stack_layer<NEStackLayer, NETargetInfo>(*polymorphic_downcast<StackLayerNode *>(node));
case NodeType::StridedSliceLayer:
return detail::create_strided_slice_layer<NEStridedSlice, NETargetInfo>(*polymorphic_downcast<StridedSliceLayerNode *>(node));
- case NodeType::UpsampleLayer:
- return detail::create_upsample_layer<NEUpsampleLayer, NETargetInfo>(*polymorphic_downcast<UpsampleLayerNode *>(node), ctx);
default:
return nullptr;
}
diff --git a/src/graph/backends/NEON/NENodeValidator.cpp b/src/graph/backends/NEON/NENodeValidator.cpp
index 9fa61bc311..0f824aa82d 100644
--- a/src/graph/backends/NEON/NENodeValidator.cpp
+++ b/src/graph/backends/NEON/NENodeValidator.cpp
@@ -125,8 +125,6 @@ Status NENodeValidator::validate(INode *node)
return detail::validate_slice_layer<NESlice>(*polymorphic_downcast<SliceLayerNode *>(node));
case NodeType::StridedSliceLayer:
return detail::validate_strided_slice_layer<NEStridedSlice>(*polymorphic_downcast<StridedSliceLayerNode *>(node));
- case NodeType::UpsampleLayer:
- return detail::validate_upsample_layer<NEUpsampleLayer>(*polymorphic_downcast<UpsampleLayerNode *>(node));
case NodeType::EltwiseLayer:
return detail::validate_eltwise_Layer<NEEltwiseLayerFunctions>(*polymorphic_downcast<EltwiseLayerNode *>(node));
case NodeType::UnaryEltwiseLayer:
diff --git a/src/graph/nodes/UpsampleLayerNode.cpp b/src/graph/nodes/UpsampleLayerNode.cpp
deleted file mode 100644
index 3f842172a5..0000000000
--- a/src/graph/nodes/UpsampleLayerNode.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2018-2019 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "arm_compute/graph/nodes/UpsampleLayerNode.h"
-
-#include "arm_compute/graph/Graph.h"
-#include "arm_compute/graph/INodeVisitor.h"
-#include "arm_compute/graph/Utils.h"
-
-namespace arm_compute
-{
-namespace graph
-{
-UpsampleLayerNode::UpsampleLayerNode(Size2D info, InterpolationPolicy upsampling_policy)
- : _info(info), _upsampling_policy(upsampling_policy)
-{
- _input_edges.resize(1, EmptyEdgeID);
- _outputs.resize(1, NullTensorID);
-}
-
-Size2D UpsampleLayerNode::info() const
-{
- return _info;
-}
-
-InterpolationPolicy UpsampleLayerNode::upsampling_policy() const
-{
- return _upsampling_policy;
-}
-
-TensorDescriptor UpsampleLayerNode::compute_output_descriptor(const TensorDescriptor &input_descriptor,
- Size2D info)
-{
- const unsigned int input_width = get_dimension_size(input_descriptor, DataLayoutDimension::WIDTH);
- const unsigned int input_height = get_dimension_size(input_descriptor, DataLayoutDimension::HEIGHT);
-
- const DataLayout data_layout = input_descriptor.layout;
- TensorDescriptor output_descriptor = input_descriptor;
- output_descriptor.shape.set(get_dimension_idx(data_layout, DataLayoutDimension::WIDTH), input_width * info.x());
- output_descriptor.shape.set(get_dimension_idx(data_layout, DataLayoutDimension::HEIGHT), input_height * info.y());
-
- return output_descriptor;
-}
-
-bool UpsampleLayerNode::forward_descriptors()
-{
- if((input_id(0) != NullTensorID) && (output_id(0) != NullTensorID))
- {
- Tensor *dst = output(0);
- ARM_COMPUTE_ERROR_ON(dst == nullptr);
- dst->desc() = configure_output(0);
- return true;
- }
- return false;
-}
-
-TensorDescriptor UpsampleLayerNode::configure_output(size_t idx) const
-{
- ARM_COMPUTE_UNUSED(idx);
- ARM_COMPUTE_ERROR_ON(idx >= _outputs.size());
-
- const Tensor *src = input(0);
- ARM_COMPUTE_ERROR_ON(src == nullptr);
-
- return compute_output_descriptor(src->desc(), _info);
-}
-
-NodeType UpsampleLayerNode::type() const
-{
- return NodeType::UpsampleLayer;
-}
-
-void UpsampleLayerNode::accept(INodeVisitor &v)
-{
- v.visit(*this);
-}
-} // namespace graph
-} // namespace arm_compute \ No newline at end of file
diff --git a/src/runtime/CL/functions/CLUpsampleLayer.cpp b/src/runtime/CL/functions/CLUpsampleLayer.cpp
deleted file mode 100644
index 538f27f565..0000000000
--- a/src/runtime/CL/functions/CLUpsampleLayer.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "arm_compute/runtime/CL/functions/CLUpsampleLayer.h"
-
-#include "arm_compute/core/CL/OpenCL.h"
-#include "arm_compute/core/Utils.h"
-#include "arm_compute/runtime/CL/CLScheduler.h"
-#include "src/core/CL/kernels/CLUpsampleLayerKernel.h"
-
-namespace arm_compute
-{
-CLUpsampleLayer::CLUpsampleLayer() // NOLINT
- : _upsample(std::make_unique<CLUpsampleLayerKernel>()),
- _output(nullptr)
-{
-}
-
-CLUpsampleLayer::~CLUpsampleLayer() = default;
-
-Status CLUpsampleLayer::validate(const ITensorInfo *input, const ITensorInfo *output,
- const Size2D &info, const InterpolationPolicy upsampling_policy)
-{
- return CLUpsampleLayerKernel::validate(input, output, info, upsampling_policy);
-}
-
-void CLUpsampleLayer::configure(ICLTensor *input, ICLTensor *output,
- const Size2D &info, const InterpolationPolicy upsampling_policy)
-{
- configure(CLKernelLibrary::get().get_compile_context(), input, output, info, upsampling_policy);
-}
-
-void CLUpsampleLayer::configure(const CLCompileContext &compile_context, ICLTensor *input, ICLTensor *output,
- const Size2D &info, const InterpolationPolicy upsampling_policy)
-{
- ARM_COMPUTE_ERROR_ON_NULLPTR(input, output);
-
- _output = output;
- _upsample->configure(compile_context, input, _output, info, upsampling_policy);
-}
-
-void CLUpsampleLayer::run()
-{
- CLScheduler::get().enqueue(*_upsample, false);
-}
-} // namespace arm_compute
diff --git a/src/runtime/NEON/functions/NEUpsampleLayer.cpp b/src/runtime/NEON/functions/NEUpsampleLayer.cpp
deleted file mode 100644
index 1a08494c63..0000000000
--- a/src/runtime/NEON/functions/NEUpsampleLayer.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "arm_compute/runtime/NEON/functions/NEUpsampleLayer.h"
-
-#include "src/core/NEON/kernels/NEUpsampleLayerKernel.h"
-
-namespace arm_compute
-{
-NEUpsampleLayer::~NEUpsampleLayer() = default;
-
-NEUpsampleLayer::NEUpsampleLayer()
- : _kernel(), _data_layout()
-{
-}
-
-Status NEUpsampleLayer::validate(const ITensorInfo *input, const ITensorInfo *output, const Size2D &info,
- const InterpolationPolicy &policy)
-{
- return NEUpsampleLayerKernel::validate(input, output, info, policy);
-}
-
-void NEUpsampleLayer::configure(const ITensor *input, ITensor *output, const Size2D &info, const InterpolationPolicy &policy)
-{
- _data_layout = input->info()->data_layout();
- _kernel = std::make_unique<NEUpsampleLayerKernel>();
- _kernel->configure(input, output, info, policy);
-}
-
-void NEUpsampleLayer::run()
-{
- const auto win = (_data_layout == DataLayout::NCHW) ? Window::DimZ : Window::DimX;
- NEScheduler::get().schedule(_kernel.get(), win);
-}
-} // namespace arm_compute
diff --git a/tests/validation/CL/UpsampleLayer.cpp b/tests/validation/CL/UpsampleLayer.cpp
deleted file mode 100644
index eff51a487c..0000000000
--- a/tests/validation/CL/UpsampleLayer.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/CL/CLTensor.h"
-#include "arm_compute/runtime/CL/CLTensorAllocator.h"
-#include "arm_compute/runtime/CL/functions/CLUpsampleLayer.h"
-#include "tests/CL/CLAccessor.h"
-#include "tests/PaddingCalculator.h"
-#include "tests/datasets/ShapeDatasets.h"
-#include "tests/framework/Asserts.h"
-#include "tests/framework/Macros.h"
-#include "tests/framework/datasets/Datasets.h"
-#include "tests/validation/Validation.h"
-#include "tests/validation/fixtures/UpsampleLayerFixture.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-namespace
-{
-constexpr AbsoluteTolerance<float> tolerance(0.001f);
-} // namespace
-
-TEST_SUITE(CL)
-TEST_SUITE(UpsampleLayer)
-
-// *INDENT-OFF*
-// clang-format off
-DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
- framework::dataset::make("InputInfo", { TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Mismatching data type
- TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Invalid output shape
- TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Invalid stride
- TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Invalid policy
- TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32),
- }),
- framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(20U, 20U, 2U), 1, DataType::F16),
- TensorInfo(TensorShape(20U, 10U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(20U, 20U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(20U, 20U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(20U, 20U, 2U), 1, DataType::F32),
- })),
- framework::dataset::make("PadInfo", { Size2D(2, 2),
- Size2D(2, 2),
- Size2D(1, 1),
- Size2D(2, 2),
- Size2D(2, 2),
- })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR,
- InterpolationPolicy::NEAREST_NEIGHBOR,
- InterpolationPolicy::NEAREST_NEIGHBOR,
- InterpolationPolicy::BILINEAR,
- InterpolationPolicy::NEAREST_NEIGHBOR,
- })),
- framework::dataset::make("Expected", { false, false, false, false, true })),
- input_info, output_info, pad_info, upsampling_policy, expected)
-{
- bool is_valid = bool(CLUpsampleLayer::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), pad_info, upsampling_policy));
- ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
-}
-// clang-format on
-// *INDENT-ON*
-
-TEST_SUITE(Float)
-template <typename T>
-using CLUpsampleLayerFixture = UpsampleLayerFixture<CLTensor, CLAccessor, CLUpsampleLayer, T>;
-TEST_SUITE(FP32)
-FIXTURE_DATA_TEST_CASE(RunSmall, CLUpsampleLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType", DataType::F32)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })))
-{
- // Validate output
- validate(CLAccessor(_target), _reference, tolerance);
-}
-TEST_SUITE_END() // FP32
-
-TEST_SUITE(FP16)
-
-FIXTURE_DATA_TEST_CASE(RunSmall, CLUpsampleLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType",
- DataType::F16)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })))
-{
- // Validate output
- validate(CLAccessor(_target), _reference, tolerance);
-}
-
-TEST_SUITE_END() // FP16
-TEST_SUITE_END() // Float
-
-TEST_SUITE(Quantized)
-template <typename T>
-using CLUpsampleLayerQuantizedFixture = UpsampleLayerQuantizedFixture<CLTensor, CLAccessor, CLUpsampleLayer, T>;
-TEST_SUITE(QASYMM8)
-FIXTURE_DATA_TEST_CASE(RunSmall, CLUpsampleLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType", DataType::QASYMM8)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })),
- framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f / 255.f, 10) })))
-{
- // Validate output
- validate(CLAccessor(_target), _reference, tolerance);
-}
-TEST_SUITE_END() // QASYMM8
-TEST_SUITE(QASYMM8_SIGNED)
-FIXTURE_DATA_TEST_CASE(RunSmall, CLUpsampleLayerQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })),
- framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f / 255.f, 10) })))
-{
- // Validate output
- validate(CLAccessor(_target), _reference, tolerance);
-}
-TEST_SUITE_END() // QASYMM8_SIGNED
-TEST_SUITE_END() // Quantized
-
-TEST_SUITE_END() // UpsampleLayer
-TEST_SUITE_END() // CL
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation/NEON/Upsample.cpp b/tests/validation/NEON/Upsample.cpp
deleted file mode 100644
index 799e513fb1..0000000000
--- a/tests/validation/NEON/Upsample.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/NEON/functions/NEUpsampleLayer.h"
-#include "tests/NEON/Accessor.h"
-#include "tests/PaddingCalculator.h"
-#include "tests/datasets/ShapeDatasets.h"
-#include "tests/framework/Asserts.h"
-#include "tests/framework/Macros.h"
-#include "tests/framework/datasets/Datasets.h"
-#include "tests/validation/Validation.h"
-#include "tests/validation/fixtures/UpsampleLayerFixture.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-TEST_SUITE(NEON)
-TEST_SUITE(UpsampleLayer)
-
-// *INDENT-OFF*
-// clang-format off
-DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
- framework::dataset::make("InputInfo", { TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Mismatching data type
- TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Invalid output shape
- TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Invalid stride
- TensorInfo(TensorShape(10U, 10U, 2U), 1, DataType::F32), // Invalid policy
- TensorInfo(TensorShape(32U, 32U), 1, DataType::F32),
- }),
- framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(20U, 20U, 2U), 1, DataType::F16),
- TensorInfo(TensorShape(20U, 10U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(20U, 20U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(20U, 20U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(64U, 64U), 1, DataType::F32),
- })),
- framework::dataset::make("PadInfo", { Size2D(2, 2),
- Size2D(2, 2),
- Size2D(1, 1),
- Size2D(2, 2),
- Size2D(2, 2),
- })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR,
- InterpolationPolicy::NEAREST_NEIGHBOR,
- InterpolationPolicy::NEAREST_NEIGHBOR,
- InterpolationPolicy::BILINEAR,
- InterpolationPolicy::NEAREST_NEIGHBOR,
- })),
- framework::dataset::make("Expected", { false, false, false, false, true })),
- input_info, output_info, pad_info, policy, expected)
-{
- bool is_valid = bool(NEUpsampleLayer::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), pad_info, policy));
- ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
-}
-// clang-format on
-// *INDENT-ON*
-
-template <typename T>
-using NEUpsampleLayerFixture = UpsampleLayerFixture<Tensor, Accessor, NEUpsampleLayer, T>;
-
-template <typename T>
-using NEUpsampleLayerQuantizedFixture = UpsampleLayerQuantizedFixture<Tensor, Accessor, NEUpsampleLayer, T>;
-
-TEST_SUITE(Float)
-TEST_SUITE(FP32)
-FIXTURE_DATA_TEST_CASE(RunSmall, NEUpsampleLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType", DataType::F32)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })))
-{
- // Validate output
- validate(Accessor(_target), _reference);
-}
-TEST_SUITE_END() // FP32
-
-#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
-TEST_SUITE(FP16)
-FIXTURE_DATA_TEST_CASE(RunSmall, NEUpsampleLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType",
- DataType::F16)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })))
-{
- // Validate output
- validate(Accessor(_target), _reference);
-}
-TEST_SUITE_END() // FP16
-#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
-TEST_SUITE_END() // Float
-
-TEST_SUITE(Quantized)
-TEST_SUITE(QASYMM8)
-FIXTURE_DATA_TEST_CASE(RunSmall, NEUpsampleLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType", DataType::QASYMM8)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })),
- framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 10))))
-{
- // Validate output
- validate(Accessor(_target), _reference);
-}
-TEST_SUITE_END() // QASYMM8
-TEST_SUITE(QASYMM8_SIGNED)
-FIXTURE_DATA_TEST_CASE(RunSmall, NEUpsampleLayerQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(),
- framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
- framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
- framework::dataset::make("PadInfo", { Size2D(2, 2) })),
- framework::dataset::make("UpsamplingPolicy", { InterpolationPolicy::NEAREST_NEIGHBOR })),
- framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 10))))
-{
- // Validate output
- validate(Accessor(_target), _reference);
-}
-TEST_SUITE_END() // QASYMM8_SIGNED
-TEST_SUITE_END() // Quantized
-
-TEST_SUITE_END() // UpsampleLayer
-TEST_SUITE_END() // NEON
-
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation/fixtures/UpsampleLayerFixture.h b/tests/validation/fixtures/UpsampleLayerFixture.h
deleted file mode 100644
index f7ec91f44a..0000000000
--- a/tests/validation/fixtures/UpsampleLayerFixture.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "tests/AssetsLibrary.h"
-#include "tests/Globals.h"
-#include "tests/IAccessor.h"
-#include "tests/framework/Asserts.h"
-#include "tests/framework/Fixture.h"
-#include "tests/validation/Helpers.h"
-#include "tests/validation/reference/UpsampleLayer.h"
-
-#include <random>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
-class UpsampleLayerFixtureBase : public framework::Fixture
-{
-public:
- template <typename...>
- void setup(TensorShape input_shape, DataType data_type, DataLayout data_layout,
- Size2D info, const InterpolationPolicy &policy, QuantizationInfo quantization_info)
- {
- _data_type = data_type;
-
- _target = compute_target(input_shape, info, policy, data_type, data_layout, quantization_info);
- _reference = compute_reference(input_shape, info, policy, data_type, quantization_info);
- }
-
-protected:
- template <typename U>
- void fill(U &&tensor, int i)
- {
- library->fill_tensor_uniform(tensor, i);
- }
-
- TensorType compute_target(TensorShape input_shape, const Size2D &info, const InterpolationPolicy &policy,
- DataType data_type, DataLayout data_layout, QuantizationInfo quantization_info)
- {
- TensorShape output_shape(input_shape);
- output_shape.set(0, info.x() * input_shape[0]);
- output_shape.set(1, info.y() * input_shape[1]);
-
- if(data_layout == DataLayout::NHWC)
- {
- permute(input_shape, PermutationVector(2U, 0U, 1U));
- permute(output_shape, PermutationVector(2U, 0U, 1U));
- }
-
- // Create tensors
- TensorType src = create_tensor<TensorType>(input_shape, data_type, 1, quantization_info, data_layout);
- TensorType dst = create_tensor<TensorType>(output_shape, data_type, 1, quantization_info, data_layout);
-
- // Create and configure function
- FunctionType upsample;
- upsample.configure(&src, &dst, info, policy);
-
- ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS);
- ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS);
-
- // Allocate tensors
- src.allocator()->allocate();
- dst.allocator()->allocate();
-
- ARM_COMPUTE_EXPECT(!src.info()->is_resizable(), framework::LogLevel::ERRORS);
- ARM_COMPUTE_EXPECT(!dst.info()->is_resizable(), framework::LogLevel::ERRORS);
-
- // Fill tensors
- fill(AccessorType(src), 0);
-
- // Compute DeconvolutionLayer function
- upsample.run();
-
- return dst;
- }
-
- SimpleTensor<T> compute_reference(const TensorShape &input_shape, const Size2D &info, const InterpolationPolicy &policy,
- DataType data_type, QuantizationInfo quantization_info)
- {
- // Create reference
- SimpleTensor<T> src{ input_shape, data_type, 1, quantization_info };
-
- // Fill reference
- fill(src, 0);
-
- return reference::upsample_layer<T>(src, info, policy);
- }
-
- TensorType _target{};
- SimpleTensor<T> _reference{};
- DataType _data_type{};
-};
-
-template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
-class UpsampleLayerFixture : public UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>
-{
-public:
- template <typename...>
- void setup(TensorShape input_shape, DataType data_type, DataLayout data_layout,
- Size2D info, const InterpolationPolicy &policy)
- {
- UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>::setup(input_shape, data_type, data_layout,
- info, policy, QuantizationInfo());
- }
-};
-
-template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
-class UpsampleLayerQuantizedFixture : public UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>
-{
-public:
- template <typename...>
- void setup(TensorShape input_shape, DataType data_type, DataLayout data_layout,
- Size2D info, const InterpolationPolicy &policy, QuantizationInfo quantization_info)
- {
- UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>::setup(input_shape, data_type, data_layout,
- info, policy, quantization_info);
- }
-};
-
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation/reference/UpsampleLayer.cpp b/tests/validation/reference/UpsampleLayer.cpp
deleted file mode 100644
index e5eb3760a7..0000000000
--- a/tests/validation/reference/UpsampleLayer.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "UpsampleLayer.h"
-
-#include "support/Requires.h"
-#include "tests/validation/Helpers.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-namespace reference
-{
-template <typename T>
-SimpleTensor<T> upsample_layer(const SimpleTensor<T> &src, const Size2D &info, const InterpolationPolicy policy)
-{
- ARM_COMPUTE_ERROR_ON(policy != InterpolationPolicy::NEAREST_NEIGHBOR);
- ARM_COMPUTE_UNUSED(policy);
-
- TensorShape output_shape = src.shape();
- output_shape.set(0, src.shape().x() * info.x());
- output_shape.set(1, src.shape().y() * info.y());
-
- // Create reference
- const int stride_x = info.x();
- const int stride_y = info.y();
- int width_out = output_shape.x();
- int height_out = output_shape.y();
- SimpleTensor<T> out{ output_shape, src.data_type(), 1, src.quantization_info() };
-
- const int width_in = src.shape().x();
- const int height_in = src.shape().y();
- const int num_2d_slices = src.shape().total_size() / (width_in * height_in);
-
- for(int slice = 0; slice < num_2d_slices; ++slice)
- {
- const int offset_slice_in = slice * width_in * height_in;
- const int offset_slice_out = slice * height_out * width_out;
- for(int y = 0; y < height_out; ++y)
- {
- for(int x = 0; x < width_out; ++x)
- {
- const int out_offset = y * width_out + x;
- const int in_offset = (y / stride_y) * width_in + x / stride_x;
-
- T *_out = out.data() + offset_slice_out + out_offset;
- const T *in = src.data() + offset_slice_in + in_offset;
- *_out = *in;
- }
- }
- }
- return out;
-}
-
-template SimpleTensor<float> upsample_layer(const SimpleTensor<float> &src,
- const Size2D &info, const InterpolationPolicy policy);
-template SimpleTensor<half> upsample_layer(const SimpleTensor<half> &src,
- const Size2D &info, const InterpolationPolicy policy);
-template SimpleTensor<uint8_t> upsample_layer(const SimpleTensor<uint8_t> &src,
- const Size2D &info, const InterpolationPolicy policy);
-template SimpleTensor<int8_t> upsample_layer(const SimpleTensor<int8_t> &src,
- const Size2D &info, const InterpolationPolicy policy);
-} // namespace reference
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation/reference/UpsampleLayer.h b/tests/validation/reference/UpsampleLayer.h
deleted file mode 100644
index b1d8398cdb..0000000000
--- a/tests/validation/reference/UpsampleLayer.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2018-2019 Arm Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef ARM_COMPUTE_TEST_UPSAMPLE_LAYER_H
-#define ARM_COMPUTE_TEST_UPSAMPLE_LAYER_H
-
-#include "tests/SimpleTensor.h"
-#include "tests/validation/Helpers.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-namespace reference
-{
-template <typename T>
-SimpleTensor<T> upsample_layer(const SimpleTensor<T> &src,
- const Size2D &info, const InterpolationPolicy policy);
-} // namespace reference
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* ARM_COMPUTE_TEST_UPSAMPLE_LAYER_H */