From dd6aceaa884815e68ed69fca71de81babd3204da Mon Sep 17 00:00:00 2001 From: Mohamed Nour Abouelseoud Date: Thu, 18 Oct 2018 12:26:19 +0100 Subject: IVGCVSW-2013 Add a UInt8 Reference Implementation for the PAD Operator Change-Id: I41f3606198db1fda8d72aaf5169594ba9156eb38 --- src/backends/cl/test/ClLayerTests.cpp | 6 +- src/backends/reference/RefWorkloadFactory.cpp | 2 +- src/backends/reference/test/RefLayerTests.cpp | 10 +- src/backends/reference/workloads/Pad.cpp | 44 +- src/backends/reference/workloads/Pad.hpp | 9 +- .../reference/workloads/RefPadWorkload.cpp | 17 +- .../reference/workloads/RefPadWorkload.hpp | 25 +- .../reference/workloads/RefPermuteWorkload.hpp | 2 +- src/backends/test/LayerTests.cpp | 577 +++++++++++---------- src/backends/test/LayerTests.hpp | 9 +- 10 files changed, 369 insertions(+), 332 deletions(-) diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index a4f824a47e..d5e941977a 100755 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -248,9 +248,9 @@ ARMNN_AUTO_TEST_CASE(SimpleReshapeFloat32, SimpleReshapeFloat32Test) ARMNN_AUTO_TEST_CASE(SimpleReshapeUint8, SimpleReshapeUint8Test) // Pad -ARMNN_AUTO_TEST_CASE(Pad2d, Pad2dTest) -ARMNN_AUTO_TEST_CASE(Pad3d, Pad3dTest) -ARMNN_AUTO_TEST_CASE(Pad4d, Pad4dTest) +ARMNN_AUTO_TEST_CASE(PadFloat322d, PadFloat322dTest) +ARMNN_AUTO_TEST_CASE(PadFloat323d, PadFloat323dTest) +ARMNN_AUTO_TEST_CASE(PadFloat324d, PadFloat324dTest) // Permute ARMNN_AUTO_TEST_CASE(SimplePermuteFloat32, SimplePermuteFloat32Test) diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 4d157d4f8b..b1f9d6c70a 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -249,7 +249,7 @@ std::unique_ptr RefWorkloadFactory::CreateMean( std::unique_ptr RefWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + return MakeWorkload(descriptor, info); } diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 259739ba55..9f044cdbaf 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -213,9 +213,13 @@ ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest) ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest) // Pad -ARMNN_AUTO_TEST_CASE(Pad2d, Pad2dTest) -ARMNN_AUTO_TEST_CASE(Pad3d, Pad3dTest) -ARMNN_AUTO_TEST_CASE(Pad4d, Pad4dTest) +ARMNN_AUTO_TEST_CASE(PadFloat322d, PadFloat322dTest) +ARMNN_AUTO_TEST_CASE(PadFloat323d, PadFloat323dTest) +ARMNN_AUTO_TEST_CASE(PadFloat324d, PadFloat324dTest) + +ARMNN_AUTO_TEST_CASE(PadUint82d, PadUint82dTest) +ARMNN_AUTO_TEST_CASE(PadUint83d, PadUint83dTest) +ARMNN_AUTO_TEST_CASE(PadUint84d, PadUint84dTest) ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dNhwcTest) ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dNhwcTest) diff --git a/src/backends/reference/workloads/Pad.cpp b/src/backends/reference/workloads/Pad.cpp index 5c859317dd..a50fa23c6c 100644 --- a/src/backends/reference/workloads/Pad.cpp +++ b/src/backends/reference/workloads/Pad.cpp @@ -5,24 +5,22 @@ #include "Pad.hpp" #include "backends/WorkloadData.hpp" - #include #include "TensorBufferArrayView.hpp" - #include #include #include #include #include - namespace armnn { +template void Pad(const TensorInfo& inputInfo, const TensorInfo& outputInfo, std::vector> m_PadList, - const float* inputData, - float* outData) + const T* inputData, + T* outData) { unsigned int numOutputElements = outputInfo.GetNumElements(); @@ -30,10 +28,12 @@ void Pad(const TensorInfo& inputInfo, TensorShape inputShape = inputInfo.GetShape(); unsigned int numInputDimensions = inputShape.GetNumDimensions(); + #ifndef NDEBUG - unsigned int numOutputDimensions = outputShape.GetNumDimensions(); + unsigned int numOutputDimensions = outputShape.GetNumDimensions(); assert(numInputDimensions == numOutputDimensions); + #endif unsigned int inputBatches = 0; @@ -51,29 +51,27 @@ void Pad(const TensorInfo& inputInfo, } switch(numInputDimensions) { + case 1: inputWidth = inputShape[0]; for (unsigned int w = 0; w < inputWidth ; w++) { - outData[w+std::get<0>(m_PadList[0])] = inputData[w]; - } break; + case 2 : inputHeight = inputShape[0]; inputWidth = inputShape[1]; - outputHeight = outputShape[0]; outputWidth = outputShape[1]; for (unsigned int h = 0; h < inputHeight; h++) { - for (unsigned int w = 0; w < inputWidth ; w++) { outData[(h+std::get<0>(m_PadList[0]))*outputWidth @@ -82,25 +80,22 @@ void Pad(const TensorInfo& inputInfo, } break; + case 3 : inputChannels = inputShape[0]; inputHeight = inputShape[1]; inputWidth = inputShape[2]; - outputChannels = outputShape[0]; outputHeight = outputShape[1]; outputWidth = outputShape[2]; for (unsigned int c = 0; c < inputChannels; c++) { - for (unsigned int h = 0; h < inputHeight; h++) { - for (unsigned int w = 0; w < inputWidth ; w++) { - outData[(c+std::get<0>(m_PadList[0]))*outputHeight*outputWidth + (h+std::get<0>(m_PadList[1]))*outputWidth + (w+std::get<0>(m_PadList[2]))] = inputData[c * inputHeight * inputWidth @@ -111,13 +106,13 @@ void Pad(const TensorInfo& inputInfo, } break; + case 4 : inputBatches = inputShape[0]; inputChannels = inputShape[1]; inputHeight = inputShape[2]; inputWidth = inputShape[3]; - outputChannels = outputShape[1]; outputHeight = outputShape[2]; outputWidth = outputShape[3]; @@ -126,13 +121,10 @@ void Pad(const TensorInfo& inputInfo, { for (unsigned int c = 0; c < inputChannels; c++) { - for (unsigned int h = 0; h < inputHeight; h++) { - for (unsigned int w = 0; w < inputWidth ; w++) { - outData[(b+std::get<0>(m_PadList[0])) * outputChannels * outputHeight * outputWidth + (c+std::get<0>(m_PadList[1])) * outputHeight * outputWidth + (h+std::get<0>(m_PadList[2])) * outputWidth @@ -141,7 +133,6 @@ void Pad(const TensorInfo& inputInfo, + c * inputHeight * inputWidth + h * inputWidth + w]; - } } } @@ -150,9 +141,20 @@ void Pad(const TensorInfo& inputInfo, break; default : + break; } - } -} //namespace armnn +template void Pad(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + std::vector> m_PadList, + const float* inputData, + float* outData); +template void Pad(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + std::vector> m_PadList, + const uint8_t* inputData, + uint8_t* outData); + +} //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/Pad.hpp b/src/backends/reference/workloads/Pad.hpp index ed80ef8eb0..42318d6fcf 100644 --- a/src/backends/reference/workloads/Pad.hpp +++ b/src/backends/reference/workloads/Pad.hpp @@ -12,9 +12,10 @@ namespace armnn { +template void Pad(const TensorInfo& inputInfo, - const TensorInfo& outputInfo, - std::vector> m_PadList, - const float* inputData, - float* outData); + const TensorInfo& outputInfo, + std::vector> m_PadList, + const T* inputData, + T* outData); } //namespace armnn diff --git a/src/backends/reference/workloads/RefPadWorkload.cpp b/src/backends/reference/workloads/RefPadWorkload.cpp index 233fbe4f34..b41c2de9af 100644 --- a/src/backends/reference/workloads/RefPadWorkload.cpp +++ b/src/backends/reference/workloads/RefPadWorkload.cpp @@ -10,28 +10,31 @@ #include "Profiling.hpp" +#include "TypeUtils.hpp" + #include namespace armnn { -RefPadWorkload::RefPadWorkload(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) - :BaseWorkload(descriptor, info) {} - - -void RefPadWorkload::Execute() const +template +void RefPadWorkload::Execute() const { + using T = ResolveType; ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefPadWorkload_Execute"); const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); - const float* inputData = GetInputTensorDataFloat(0, m_Data); - float* outputData = GetOutputTensorDataFloat(0, m_Data); + const T* inputData = GetInputTensorData(0, m_Data); + T* outputData = GetOutputTensorData(0, m_Data); Pad(inputInfo, outputInfo, m_Data.m_Parameters.m_PadList, inputData, outputData); } +template class RefPadWorkload; +template class RefPadWorkload; + } //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefPadWorkload.hpp b/src/backends/reference/workloads/RefPadWorkload.hpp index 7ff117d6a5..938fcf2004 100644 --- a/src/backends/reference/workloads/RefPadWorkload.hpp +++ b/src/backends/reference/workloads/RefPadWorkload.hpp @@ -5,17 +5,32 @@ #pragma once -#include "backends/Workload.hpp" -#include "backends/WorkloadData.hpp" +#include +#include + +#include namespace armnn { -class RefPadWorkload : public BaseWorkload +template +class RefPadWorkload : public TypedWorkload { public: - explicit RefPadWorkload (const PadQueueDescriptor& descriptor, const WorkloadInfo& info); - virtual void Execute() const override; + + static const std::string& GetName() + { + static const std::string name = std::string("RefPad") + GetDataTypeName(DataType) + "Workload"; + return name; + } + + using TypedWorkload::m_Data; + using TypedWorkload::TypedWorkload; + + void Execute() const override; }; +using RefPadFloat32Workload = RefPadWorkload; +using RefPadUint8Workload = RefPadWorkload; + } //namespace armnn diff --git a/src/backends/reference/workloads/RefPermuteWorkload.hpp b/src/backends/reference/workloads/RefPermuteWorkload.hpp index 841a080dfd..50caa3e9ec 100644 --- a/src/backends/reference/workloads/RefPermuteWorkload.hpp +++ b/src/backends/reference/workloads/RefPermuteWorkload.hpp @@ -31,4 +31,4 @@ using RefPermuteFloat16Workload = RefPermuteWorkload; using RefPermuteFloat32Workload = RefPermuteWorkload; using RefPermuteUint8Workload = RefPermuteWorkload; -} //namespace armnn +} //namespace armnn \ No newline at end of file diff --git a/src/backends/test/LayerTests.cpp b/src/backends/test/LayerTests.cpp index 95f2a32297..e762152b67 100755 --- a/src/backends/test/LayerTests.cpp +++ b/src/backends/test/LayerTests.cpp @@ -3441,123 +3441,120 @@ float CalcInvL2Norm(std::initializer_list elements) } // anonymous namespace -LayerTestResult Pad2dTest(armnn::IWorkloadFactory& workloadFactory) +template +LayerTestResult Pad2dTestCommon(armnn::IWorkloadFactory& workloadFactory, float qScale, int32_t qOffset) { - const armnn::TensorShape inputShape{ 3, 3 }; - const armnn::TensorShape outputShape{ 7, 7 }; - - const armnn::TensorInfo inputTensorInfo(inputShape, armnn::DataType::Float32); - const armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Float32); + const armnn::TensorShape inputShape{ 3, 3 }; + const armnn::TensorShape outputShape{ 7, 7 }; + const armnn::TensorInfo inputTensorInfo(inputShape, armnn::GetDataType()); + const armnn::TensorInfo outputTensorInfo(outputShape, armnn::GetDataType()); - std::vector inputValues + std::vector inputValues( + QuantizedVector(qScale, qOffset, { + // Height (3) x Width (3) + 4, 8, 6, + 7, 4, 4, + 3, 2, 4 + })); - // Height (3) x Width (3) - 4.0f, 8.0f, 6.0f, - 7.0f, 4.0f, 4.0f, - 3.0f, 2.0f, 4.0f - - }; - - std::vector expectedOutputValues + std::vector expectedOutputValues( + QuantizedVector(qScale, qOffset, { + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 8, 6, 0, 0, + 0, 0, 7, 4, 4, 0, 0, + 0, 0, 3, 2, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 + })); - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 4.0f, 8.0f, 6.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 7.0f, 4.0f, 4.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 3.0f, 2.0f, 4.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f - - }; - - auto inputTensor = MakeTensor(inputTensorInfo, std::vector(inputValues)); + auto inputTensor = MakeTensor(inputTensorInfo, std::vector(inputValues)); - LayerTestResult result(outputTensorInfo); - result.outputExpected = MakeTensor(outputTensorInfo, std::vector(expectedOutputValues)); + LayerTestResult result(outputTensorInfo); + result.outputExpected = MakeTensor(outputTensorInfo, std::vector(expectedOutputValues)); - std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); - std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); + std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); - armnn::PadQueueDescriptor descriptor; + armnn::PadQueueDescriptor descriptor; - std::vector> PadList; - PadList.push_back(std::pair(2,2)); - PadList.push_back(std::pair(2,2)); + std::vector> PadList; + PadList.push_back(std::pair(2,2)); + PadList.push_back(std::pair(2,2)); - descriptor.m_Parameters.m_PadList = PadList; - armnn::WorkloadInfo info; + descriptor.m_Parameters.m_PadList = PadList; + armnn::WorkloadInfo info; - AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); - AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); + AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); - std::unique_ptr workload = workloadFactory.CreatePad(descriptor, info); + std::unique_ptr workload = workloadFactory.CreatePad(descriptor, info); - inputHandle->Allocate(); - outputHandle->Allocate(); + inputHandle->Allocate(); + outputHandle->Allocate(); - CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]); + CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]); - workloadFactory.Finalize(); - workload->Execute(); + workloadFactory.Finalize(); + workload->Execute(); - CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get()); + CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get()); - return result; -}; + return result; +} -LayerTestResult Pad3dTest(armnn::IWorkloadFactory& workloadFactory) +template +LayerTestResult Pad3dTestCommon(armnn::IWorkloadFactory& workloadFactory, float qScale, int32_t qOffset) { const armnn::TensorShape inputShape{ 2, 2, 2 }; const armnn::TensorShape outputShape{ 3, 5, 6 }; - const armnn::TensorInfo inputTensorInfo(inputShape, armnn::DataType::Float32); - const armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Float32); - + const armnn::TensorInfo inputTensorInfo(inputShape, armnn::GetDataType()); + const armnn::TensorInfo outputTensorInfo(outputShape, armnn::GetDataType()); - std::vector inputValues + std::vector inputValues( + QuantizedVector(qScale,qOffset, { - // Channel 0, Height (2) x Width (2) - 0.0f, 4.0f, - 2.0f, 5.0f, + 0, 4, + 2, 5, // Channel 1, Height (2) x Width (2) - 6.0f, 1.0f, - 5.0f, 2.0f - }; + 6, 1, + 5, 2 + })); - std::vector expectedOutputValues + std::vector expectedOutputValues( + QuantizedVector(qScale,qOffset, { - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 4.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 2.0f, 5.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - + 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.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 6.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 5.0f, 2.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 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 - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f - - }; + })); - auto inputTensor = MakeTensor(inputTensorInfo, std::vector(inputValues)); + auto inputTensor = MakeTensor(inputTensorInfo, std::vector(inputValues)); - LayerTestResult result(outputTensorInfo); - result.outputExpected = MakeTensor(outputTensorInfo, std::vector(expectedOutputValues)); + LayerTestResult result(outputTensorInfo); + result.outputExpected = MakeTensor(outputTensorInfo, std::vector(expectedOutputValues)); std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); @@ -3588,227 +3585,209 @@ LayerTestResult Pad3dTest(armnn::IWorkloadFactory& workloadFactory) CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get()); return result; -}; +} -LayerTestResult Pad4dTest(armnn::IWorkloadFactory& workloadFactory) +template +LayerTestResult Pad4dTestCommon(armnn::IWorkloadFactory& workloadFactory, float qScale, int32_t qOffset) { const armnn::TensorShape inputShape{ 2, 2, 3, 2 }; const armnn::TensorShape outputShape{ 4, 5, 7, 4 }; - const armnn::TensorInfo inputTensorInfo(inputShape, armnn::DataType::Float32); - const armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Float32); + const armnn::TensorInfo inputTensorInfo(inputShape, armnn::GetDataType()); + const armnn::TensorInfo outputTensorInfo(outputShape, armnn::GetDataType()); - std::vector inputValues + std::vector inputValues( + QuantizedVector(qScale,qOffset, { // Batch 0, Channel 0, Height (3) x Width (2) - 0.0f, 1.0f, - 2.0f, 3.0f, - 4.0f, 5.0f, + 0, 1, + 2, 3, + 4, 5, // Batch 0, Channel 1, Height (3) x Width (2) - 6.0f, 7.0f, - 8.0f, 9.0f, - 10.0f, 11.0f, + 6, 7, + 8, 9, + 10, 11, // Batch 1, Channel 0, Height (3) x Width (2) - 12.0f, 13.0f, - 14.0f, 15.0f, - 16.0f, 17.0f, + 12, 13, + 14, 15, + 16, 17, // Batch 1, Channel 1, Height (3) x Width (2) - 18.0f, 19.0f, - 20.0f, 21.0f, - 22.0f, 23.0f - - }; + 18, 19, + 20, 21, + 22, 23 + })); - std::vector expectedOutputValues + std::vector expectedOutputValues( + QuantizedVector(qScale,qOffset, { - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 2.0f, 3.0f, 0.0f, - 0.0f, 4.0f, 5.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 6.0f, 7.0f, 0.0f, - 0.0f, 8.0f, 9.0f, 0.0f, - 0.0f, 10.0f, 11.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 12.0f, 13.0f, 0.0f, - 0.0f, 14.0f, 15.0f, 0.0f, - 0.0f, 16.0f, 17.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 18.0f, 19.0f, 0.0f, - 0.0f, 20.0f, 21.0f, 0.0f, - 0.0f, 22.0f, 23.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - - - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 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 + })); - }; + auto inputTensor = MakeTensor(inputTensorInfo, std::vector(inputValues)); - auto inputTensor = MakeTensor(inputTensorInfo, std::vector(inputValues)); - - LayerTestResult result(outputTensorInfo); - result.outputExpected = MakeTensor(outputTensorInfo, std::vector(expectedOutputValues)); + LayerTestResult result(outputTensorInfo); + result.outputExpected = MakeTensor(outputTensorInfo, std::vector(expectedOutputValues)); std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); @@ -3841,7 +3820,37 @@ LayerTestResult Pad4dTest(armnn::IWorkloadFactory& workloadFactory) CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get()); return result; -}; +} + +LayerTestResult PadUint82dTest(armnn::IWorkloadFactory& workloadFactory) +{ + return Pad2dTestCommon(workloadFactory, 1.0f, 0); +} + +LayerTestResult PadUint83dTest(armnn::IWorkloadFactory& workloadFactory) +{ + return Pad3dTestCommon(workloadFactory, 1.0f, 0); +} + +LayerTestResult PadUint84dTest(armnn::IWorkloadFactory& workloadFactory) +{ + return Pad4dTestCommon(workloadFactory, 1.0f, 0); +} + +LayerTestResult PadFloat322dTest(armnn::IWorkloadFactory& workloadFactory) +{ + return Pad2dTestCommon(workloadFactory, 0.0f, 0); +} + +LayerTestResult PadFloat323dTest(armnn::IWorkloadFactory& workloadFactory) +{ + return Pad3dTestCommon(workloadFactory, 0.0f, 0); +} + +LayerTestResult PadFloat324dTest(armnn::IWorkloadFactory& workloadFactory) +{ + return Pad4dTestCommon(workloadFactory, 0.0f, 0); +} LayerTestResult L2Normalization1dTest(armnn::IWorkloadFactory& workloadFactory) { diff --git a/src/backends/test/LayerTests.hpp b/src/backends/test/LayerTests.hpp index 925e3e6ea6..5790869366 100644 --- a/src/backends/test/LayerTests.hpp +++ b/src/backends/test/LayerTests.hpp @@ -353,10 +353,13 @@ LayerTestResult FullyConnectedLargeTest(armnn::IWorkloadFactory& workl LayerTestResult SimplePermuteFloat32Test(armnn::IWorkloadFactory& workloadFactory); LayerTestResult SimplePermuteUint8Test(armnn::IWorkloadFactory& workloadFactory); -LayerTestResult Pad2dTest(armnn::IWorkloadFactory& workloadFactory); -LayerTestResult Pad3dTest(armnn::IWorkloadFactory& workloadFactory); -LayerTestResult Pad4dTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult PadUint82dTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult PadUint83dTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult PadUint84dTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult PadFloat322dTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult PadFloat323dTest(armnn::IWorkloadFactory& workloadFactory); +LayerTestResult PadFloat324dTest(armnn::IWorkloadFactory& workloadFactory); LayerTestResult PermuteFloat32ValueSet1Test(armnn::IWorkloadFactory& workloadFactory); LayerTestResult PermuteFloat32ValueSet2Test(armnn::IWorkloadFactory& workloadFactory); -- cgit v1.2.1