From 4951d84b1174a4bb0a5d9c900740f64201f765bf Mon Sep 17 00:00:00 2001 From: narpra01 Date: Fri, 18 Jan 2019 16:53:53 +0000 Subject: IVGCVSW-2510 Ref workload implementation for Gather operator * add implemenentation for GatherQueueDescriptor validate function * add FirstInputTypedWorkload to allow type check on the first input tensor only * add ref workload implemenentation for float and uint8 * add Gather layer support in Ref * unit tests Change-Id: I4578a3211f11d24aa29d15bcf7f45b0445bcd1ee --- .../backendsCommon/test/GatherTestImpl.hpp | 128 +++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 src/backends/backendsCommon/test/GatherTestImpl.hpp (limited to 'src/backends/backendsCommon/test/GatherTestImpl.hpp') diff --git a/src/backends/backendsCommon/test/GatherTestImpl.hpp b/src/backends/backendsCommon/test/GatherTestImpl.hpp new file mode 100644 index 0000000000..16b266ed29 --- /dev/null +++ b/src/backends/backendsCommon/test/GatherTestImpl.hpp @@ -0,0 +1,128 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "WorkloadTestUtils.hpp" + +#include +#include +#include +#include + +template , + unsigned int paramsDim, unsigned int indicesDim, unsigned int OutputDim> +LayerTestResult GatherTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::TensorInfo& paramsInfo, + const armnn::TensorInfo& indicesInfo, + const armnn::TensorInfo& outputInfo, + const std::vector& paramsData, + const std::vector& indicesData, + const std::vector& outputData) +{ + auto params = MakeTensor(paramsInfo, paramsData); + auto indices = MakeTensor(indicesInfo, indicesData); + + LayerTestResult result(outputInfo); + result.outputExpected = MakeTensor(outputInfo, outputData); + + std::unique_ptr paramsHandle = workloadFactory.CreateTensorHandle(paramsInfo); + std::unique_ptr indicesHandle = workloadFactory.CreateTensorHandle(indicesInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputInfo); + + armnn::GatherQueueDescriptor data; + armnn::WorkloadInfo info; + AddInputToWorkload(data, info, paramsInfo, paramsHandle.get()); + AddInputToWorkload(data, info, indicesInfo, indicesHandle.get()); + AddOutputToWorkload(data, info, outputInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateGather(data, info); + + paramsHandle->Allocate(); + indicesHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(paramsHandle.get(), params.origin()); + CopyDataToITensorHandle(indicesHandle.get(), indices.origin()); + + workload->Execute(); + + CopyDataFromITensorHandle(result.output.origin(), outputHandle.get()); + + return result; +} + +template > +LayerTestResult Gather1DParamsTestImpl(armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::TensorInfo paramsInfo({ 8 }, ArmnnType); + armnn::TensorInfo indicesInfo({ 4 }, armnn::DataType::Signed32); + armnn::TensorInfo outputInfo({ 4 }, ArmnnType); + + const std::vector params = std::vector({ 1, 2, 3, 4, 5, 6, 7, 8 }); + const std::vector indices = std::vector({ 0, 2, 1, 5 }); + const std::vector expectedOutput = std::vector({ 1, 3, 2, 6 }); + + return GatherTestImpl(workloadFactory, memoryManager, + paramsInfo, indicesInfo, outputInfo, + params,indices, expectedOutput); +} + +template > +LayerTestResult GatherMultiDimParamsTestImpl( + armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::TensorInfo paramsInfo({ 5, 2 }, ArmnnType); + armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32); + armnn::TensorInfo outputInfo({ 3, 2 }, ArmnnType); + + const std::vector params = std::vector({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); + const std::vector indices = std::vector({ 1, 3, 4 }); + const std::vector expectedOutput = std::vector({ 3, 4, 7, 8, 9, 10 }); + + return GatherTestImpl(workloadFactory, memoryManager, + paramsInfo, indicesInfo, outputInfo, + params,indices, expectedOutput); +} + +template > +LayerTestResult GatherMultiDimParamsMultiDimIndicesTestImpl( + armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::TensorInfo paramsInfo({ 3, 2, 3}, ArmnnType); + armnn::TensorInfo indicesInfo({ 2, 3 }, armnn::DataType::Signed32); + armnn::TensorInfo outputInfo({ 2, 3, 2, 3 }, ArmnnType); + + const std::vector params = std::vector({ + 1, 2, 3, + 4, 5, 6, + + 7, 8, 9, + 10, 11, 12, + + 13, 14, 15, + 16, 17, 18 }); + const std::vector indices = std::vector({ 1, 2, 1, 2, 1, 0 }); + const std::vector expectedOutput = std::vector({ + 7, 8, 9, + 10, 11, 12, + 13, 14, 15, + 16, 17, 18, + 7, 8, 9, + 10, 11, 12, + + 13, 14, 15, + 16, 17, 18, + 7, 8, 9, + 10, 11, 12, + 1, 2, 3, + 4, 5, 6 }); + + return GatherTestImpl(workloadFactory, memoryManager, + paramsInfo, indicesInfo, outputInfo, + params,indices, expectedOutput); +} -- cgit v1.2.1