diff options
-rw-r--r-- | src/armnn/layers/TileLayer.cpp | 15 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp | 61 | ||||
-rw-r--r-- | src/backends/reference/test/RefEndToEndTests.cpp | 37 |
4 files changed, 107 insertions, 7 deletions
diff --git a/src/armnn/layers/TileLayer.cpp b/src/armnn/layers/TileLayer.cpp index 3c313905fe..d3629002e0 100644 --- a/src/armnn/layers/TileLayer.cpp +++ b/src/armnn/layers/TileLayer.cpp @@ -33,24 +33,25 @@ std::vector<TensorShape> TileLayer::InferOutputShapes(const std::vector<TensorSh { ARMNN_ASSERT(inputShapes.size() == 1); const TensorShape& inputShape = inputShapes[0]; - const std::vector<uint32_t> multipleShape = m_Param.m_Multiples; - std::vector<unsigned int> dimSizes; + uint32_t numberOfDimensions = inputShape.GetNumDimensions(); + std::vector<unsigned int> dimensionSizes; + dimensionSizes.reserve(numberOfDimensions); // Check input shape and multiples have same length and multiply them together to get output shape - if(inputShape.GetNumDimensions() == multipleShape.size()) + if(numberOfDimensions == m_Param.m_Multiples.size()) { - for(uint32_t i = 0; i < inputShape.GetNumDimensions(); ++i) + for(uint32_t i = 0; i < numberOfDimensions; ++i) { - dimSizes.insert(dimSizes.begin(), inputShape[i] * multipleShape[i]); + dimensionSizes.emplace_back(inputShape[i] * m_Param.m_Multiples[i]); } } else { - throw LayerValidationException("TileLayer: input rank and length of multiples are different."); + throw LayerValidationException("TileLayer: input rank and multiples length are different."); } - return std::vector<TensorShape>({TensorShape({inputShape.GetNumElements(), dimSizes.data()})}); + return std::vector<TensorShape>({TensorShape({numberOfDimensions, dimensionSizes.data()})}); } void TileLayer::ValidateTensorShapesFromInputs() diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index bbd1324010..7c24f9ca10 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -61,6 +61,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources StridedSliceAsyncEndToEndTest.hpp SubgraphUtilsTest.hpp SubtractionEndToEndTestImpl.hpp + TileEndToEndTestImpl.hpp TransposeEndToEndTestImpl.hpp TensorCopyUtils.hpp WorkloadFactoryHelper.hpp diff --git a/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp new file mode 100644 index 0000000000..4047e5ad8e --- /dev/null +++ b/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp @@ -0,0 +1,61 @@ +// +// Copyright © 2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once +#include "armnn/INetwork.hpp" +#include "armnnUtils/QuantizeHelper.hpp" +#include <CommonTestUtils.hpp> +#include <ResolveType.hpp> +#include <doctest/doctest.h> + +namespace +{ +using namespace armnn; +armnn::INetworkPtr CreateTileNetwork(TileDescriptor& descriptor, + const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& outputInfo) +{ + INetworkPtr network(INetwork::Create()); + IConnectableLayer* inputLayer = network->AddInputLayer(0, "input"); + IConnectableLayer* tileLayer = network->AddTileLayer(descriptor, "tile"); + IConnectableLayer* outputLayer = network->AddOutputLayer(0, "output"); + Connect(inputLayer, tileLayer, inputInfo, 0, 0); + Connect(tileLayer, outputLayer, outputInfo, 0, 0); + return network; +} + +template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>> +void TileEndToEnd(const std::vector<BackendId>& backends) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + bool qConst = true; + + const TensorShape inputTensorShape = { 2, 3 }; + const TensorShape outputTensorShape = { 4, 6 }; + + TensorInfo inputInfo (inputTensorShape, ArmnnType, qScale, qOffset, qConst); + TensorInfo outputInfo (outputTensorShape, ArmnnType,qScale, qOffset); + + std::vector<T> inputData = armnnUtils::QuantizedVector<T>({ + 0.f, 1.f, 2.f, + 3.f, 4.f, 5.f + }, qScale, qOffset); + + std::vector<T> expectedOutputData = armnnUtils::QuantizedVector<T>({ + 0.f, 1.f, 2.f, 0.f, 1.f, 2.f, + 3.f, 4.f, 5.f, 3.f, 4.f, 5.f, + 0.f, 1.f, 2.f, 0.f, 1.f, 2.f, + 3.f, 4.f, 5.f, 3.f, 4.f, 5.f + }, qScale, qOffset); + + auto descriptor = armnn::TileDescriptor(std::vector<uint32_t>{ 2, 2 }); + INetworkPtr network = CreateTileNetwork(descriptor, inputInfo, outputInfo); + + std::map<int, std::vector<T>> inputTensor = { { 0, inputData } }; + std::map<int, std::vector<T>> expectedOutputTensor = { { 0, expectedOutputData } }; + EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network), inputTensor, expectedOutputTensor, backends); +} + +} // anonymous namespace
\ No newline at end of file diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp index eb2aabcd1e..6f05ba77cb 100644 --- a/src/backends/reference/test/RefEndToEndTests.cpp +++ b/src/backends/reference/test/RefEndToEndTests.cpp @@ -36,6 +36,7 @@ #include <backendsCommon/test/SplitterEndToEndTestImpl.hpp> #include <backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp> #include <backendsCommon/test/SubgraphUtilsTest.hpp> +#include <backendsCommon/test/TileEndToEndTestImpl.hpp> #include <backendsCommon/test/TransposeConvolution2dEndToEndTestImpl.hpp> #include <backendsCommon/test/TransposeEndToEndTestImpl.hpp> @@ -1180,6 +1181,42 @@ TEST_CASE("RefSplitter4dDim3EndToEndUint8Test") Splitter4dDim3EndToEnd<armnn::DataType::QAsymmU8>(defaultBackends); } +// Tile +TEST_CASE("RefTileEndToEndFloat32") +{ + TileEndToEnd<armnn::DataType::Float32>(defaultBackends); +} + +TEST_CASE("RefTileEndToEndFloat16") +{ + TileEndToEnd<armnn::DataType::Float16>(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQAsymmS8") +{ + TileEndToEnd<armnn::DataType::QAsymmS8>(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQAsymmU8") +{ + TileEndToEnd<armnn::DataType::QAsymmU8>(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQSymmS8") +{ + TileEndToEnd<armnn::DataType::QSymmS8>(defaultBackends); +} + +TEST_CASE("RefTileEndToEndQSymmS16") +{ + TileEndToEnd<armnn::DataType::QSymmS16>(defaultBackends); +} + +TEST_CASE("RefTileEndToEndSigned32") +{ + TileEndToEnd<armnn::DataType::Signed32>(defaultBackends); +} + // TransposeConvolution2d TEST_CASE("RefTransposeConvolution2dEndToEndFloatNchwTest") { |