// // Copyright © 2017 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "PadTestImpl.hpp" #include #include #include #include // // Implementation templates // template LayerTestResult Pad2dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset, const float customPaddingValue) { IgnoreUnused(memoryManager); const armnn::TensorShape inputShape{ 3, 3 }; const armnn::TensorShape outputShape{ 7, 7 }; const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset); const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset); std::vector inputValues = armnnUtils::QuantizedVector( { // Height (3) x Width (3) 4, 8, 6, 7, 4, 4, 3, 2, 4 }, qScale, qOffset); auto p = customPaddingValue; std::vector expectedOutputValues = armnnUtils::QuantizedVector( { p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, 4, 8, 6, p, p, p, p, 7, 4, 4, p, p, p, p, 3, 2, 4, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p }, qScale, qOffset); std::vector actualOutput(outputTensorInfo.GetNumElements()); std::unique_ptr inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::PadQueueDescriptor descriptor; std::vector> padList; padList.push_back(std::pair(2,2)); padList.push_back(std::pair(2,2)); descriptor.m_Parameters.m_PadList = padList; descriptor.m_Parameters.m_PadValue = customPaddingValue; armnn::WorkloadInfo info; AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); std::unique_ptr workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad, descriptor, info); inputHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputValues.data()); workload->PostAllocationConfigure(); workload->Execute(); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, expectedOutputValues, outputHandle->GetShape(), outputTensorInfo.GetShape()); } template LayerTestResult Pad3dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset) { IgnoreUnused(memoryManager); const armnn::TensorShape inputShape{ 2, 2, 2 }; const armnn::TensorShape outputShape{ 3, 5, 6 }; const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset); const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset); std::vector inputValues = armnnUtils::QuantizedVector( { // Channel 0, Height (2) x Width (2) 0, 4, 2, 5, // Channel 1, Height (2) x Width (2) 6, 1, 5, 2 }, qScale, qOffset); std::vector expectedOutputValues = armnnUtils::QuantizedVector( { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, qScale, qOffset); std::vector actualOutput(outputTensorInfo.GetNumElements()); std::unique_ptr inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::PadQueueDescriptor descriptor; std::vector> PadList; PadList.push_back(std::pair(0,1)); PadList.push_back(std::pair(2,1)); PadList.push_back(std::pair(2,2)); descriptor.m_Parameters.m_PadList = PadList; armnn::WorkloadInfo info; AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); std::unique_ptr workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad, descriptor, info); inputHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputValues.data()); workload->PostAllocationConfigure(); workload->Execute(); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, expectedOutputValues, outputHandle->GetShape(), outputTensorInfo.GetShape()); } template LayerTestResult Pad4dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset) { IgnoreUnused(memoryManager); const armnn::TensorShape inputShape{ 2, 2, 3, 2 }; const armnn::TensorShape outputShape{ 4, 5, 7, 4 }; const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset); const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset); std::vector inputValues = armnnUtils::QuantizedVector( { // Batch 0, Channel 0, Height (3) x Width (2) 0, 1, 2, 3, 4, 5, // Batch 0, Channel 1, Height (3) x Width (2) 6, 7, 8, 9, 10, 11, // Batch 1, Channel 0, Height (3) x Width (2) 12, 13, 14, 15, 16, 17, // Batch 1, Channel 1, Height (3) x Width (2) 18, 19, 20, 21, 22, 23 }, qScale, qOffset); std::vector expectedOutputValues = armnnUtils::QuantizedVector( { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 8, 9, 0, 0, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 14, 15, 0, 0, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 0, 0, 20, 21, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, qScale, qOffset); std::vector actualOutput(outputTensorInfo.GetNumElements()); std::unique_ptr inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::PadQueueDescriptor descriptor; std::vector> PadList; PadList.push_back(std::pair(1,1)); PadList.push_back(std::pair(2,1)); PadList.push_back(std::pair(3,1)); PadList.push_back(std::pair(1,1)); descriptor.m_Parameters.m_PadList = PadList; armnn::WorkloadInfo info; AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); std::unique_ptr workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad, descriptor, info); inputHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputValues.data()); workload->PostAllocationConfigure(); workload->Execute(); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, expectedOutputValues, outputHandle->GetShape(), outputTensorInfo.GetShape()); } template LayerTestResult PadQAsymmTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset, const float customPaddingValue) { IgnoreUnused(memoryManager); const armnn::TensorShape inputShape{ 3, 3 }; const armnn::TensorShape outputShape{ 7, 7 }; const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset); const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset); std::vector inputValues = { // Height (3) x Width (3) 4, 8, 6, 7, 4, 4, 3, 2, 4 }; T p = static_cast(customPaddingValue); std::vector expectedOutputValues = { p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, 4, 8, 6, p, p, p, p, 7, 4, 4, p, p, p, p, 3, 2, 4, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p }; std::vector actualOutput(outputTensorInfo.GetNumElements()); std::unique_ptr inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::PadQueueDescriptor descriptor; std::vector> padList; padList.push_back(std::pair(2,2)); padList.push_back(std::pair(2,2)); descriptor.m_Parameters.m_PadList = padList; descriptor.m_Parameters.m_PadValue = customPaddingValue; armnn::WorkloadInfo info; AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); std::unique_ptr workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad, descriptor, info); inputHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputValues.data()); workload->PostAllocationConfigure(); workload->Execute(); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, expectedOutputValues, outputHandle->GetShape(), outputTensorInfo.GetShape()); } // // Explicit template specializations // template LayerTestResult, 2> Pad2dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset, const float customPaddingValue); template LayerTestResult, 3> Pad3dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset); template LayerTestResult, 4> Pad4dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset); template LayerTestResult, 2> PadQAsymmTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset, const float customPaddingValue); template LayerTestResult, 2> PadQAsymmTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory, float qScale, int32_t qOffset, const float customPaddingValue); // // Implementation functions // LayerTestResult PadUint82dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0); } LayerTestResult PadUint82dCustomPaddingTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon( workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f); } LayerTestResult PadUint83dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad3dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0); } LayerTestResult PadUint84dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad4dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0); } LayerTestResult PadFloat322dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0); } LayerTestResult PadFloat322dCustomPaddingTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon( workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f); } LayerTestResult PadFloat323dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad3dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0); } LayerTestResult PadFloat324dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad4dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0); } LayerTestResult PadBFloat162dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0); } LayerTestResult PadBFloat162dCustomPaddingTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon( workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f); } LayerTestResult PadBFloat163dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad3dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0); } LayerTestResult PadBFloat164dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad4dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0); } LayerTestResult PadInt82dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon( workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0); } LayerTestResult PadInt82dCustomPaddingTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad2dTestCommon( workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f); } LayerTestResult PadInt83dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad3dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0); } LayerTestResult PadInt84dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return Pad4dTestCommon(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0); } LayerTestResult PadInt8AsymmTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return PadQAsymmTestCommon( workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 2); } LayerTestResult PadInt8CustomPaddingAsymmTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { return PadQAsymmTestCommon( workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 3, 1.0f); }