// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include TEST_SUITE("NeonEndToEnd") { std::vector neonDefaultBackends = {armnn::Compute::CpuAcc}; // Abs TEST_CASE("NeonAbsEndToEndTestFloat32") { std::vector expectedOutput = { 1.f, 1.f, 1.f, 1.f, 5.f, 5.f, 5.f, 5.f, 3.f, 3.f, 3.f, 3.f, 4.f, 4.f, 4.f, 4.f }; ElementwiseUnarySimpleEndToEnd(neonDefaultBackends, UnaryOperation::Abs, expectedOutput); } // Constant TEST_CASE("ConstantUsage_Neon_Float32") { CHECK(ConstantUsageFloat32Test(neonDefaultBackends)); } #if defined(ARMNNREF_ENABLED) // This test unit needs the reference backend, it's not available if the reference backend is not built TEST_CASE("FallbackToCpuRef") { using namespace armnn; // Create runtime in which test will run and allow fallback to CpuRef. IRuntime::CreationOptions options; IRuntimePtr runtime(IRuntime::Create(options)); // Builds up the structure of the network. INetworkPtr net(INetwork::Create()); IConnectableLayer* input = net->AddInputLayer(0); // This layer configuration isn't supported by CpuAcc but we allow fallback to CpuRef so it shoud pass. NormalizationDescriptor descriptor; IConnectableLayer* pooling = net->AddNormalizationLayer(descriptor); IConnectableLayer* output = net->AddOutputLayer(0); input->GetOutputSlot(0).Connect(pooling->GetInputSlot(0)); pooling->GetOutputSlot(0).Connect(output->GetInputSlot(0)); input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32)); pooling->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32)); // optimize the network std::vector backends = {Compute::CpuAcc, Compute::CpuRef}; IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec()); // Load it into the runtime. It should pass. NetworkId netId; CHECK(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success); } #endif TEST_CASE("NeonGreaterSimpleEndToEndTest") { const std::vector expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }); ComparisonSimpleEndToEnd(neonDefaultBackends, ComparisonOperation::Greater, expectedOutput); } TEST_CASE("NeonGreaterSimpleEndToEndUint8Test") { const std::vector expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }); ComparisonSimpleEndToEnd(neonDefaultBackends, ComparisonOperation::Greater, expectedOutput); } TEST_CASE("NeonGreaterBroadcastEndToEndTest") { const std::vector expectedOutput({ 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }); ComparisonBroadcastEndToEnd(neonDefaultBackends, ComparisonOperation::Greater, expectedOutput); } TEST_CASE("NeonGreaterBroadcastEndToEndUint8Test") { const std::vector expectedOutput({ 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }); ComparisonBroadcastEndToEnd(neonDefaultBackends, ComparisonOperation::Greater, expectedOutput); } TEST_CASE("NeonConcatEndToEndDim0Test") { ConcatDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonConcatEndToEndDim0Uint8Test") { ConcatDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonConcatEndToEndDim1Test") { ConcatDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonConcatEndToEndDim1Uint8Test") { ConcatDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonConcatEndToEndDim3Test") { ConcatDim3EndToEnd(neonDefaultBackends); } TEST_CASE("NeonConcatEndToEndDim3Uint8Test") { ConcatDim3EndToEnd(neonDefaultBackends); } // DepthToSpace TEST_CASE("DephtToSpaceEndToEndNchwFloat32") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NCHW); } TEST_CASE("DephtToSpaceEndToEndNchwFloat16") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NCHW); } TEST_CASE("DephtToSpaceEndToEndNchwUint8") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NCHW); } TEST_CASE("DephtToSpaceEndToEndNchwInt16") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NCHW); } TEST_CASE("DephtToSpaceEndToEndNhwcFloat32") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NHWC); } TEST_CASE("DephtToSpaceEndToEndNhwcFloat16") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NHWC); } TEST_CASE("DephtToSpaceEndToEndNhwcUint8") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NHWC); } TEST_CASE("DephtToSpaceEndToEndNhwcInt16") { DepthToSpaceEndToEnd(neonDefaultBackends, armnn::DataLayout::NHWC); } // Dequantize TEST_CASE("DequantizeEndToEndSimpleTest") { DequantizeEndToEndSimple(neonDefaultBackends); } TEST_CASE("DequantizeEndToEndOffsetTest") { DequantizeEndToEndOffset(neonDefaultBackends); } TEST_CASE("NeonEluEndToEndTestFloat32") { EluEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonEluEndToEndTestFloat16") { EluEndToEndTest(neonDefaultBackends); } // HardSwish TEST_CASE("NeonHardSwishEndToEndTestFloat32") { HardSwishEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonHardSwishEndToEndTestFloat16") { HardSwishEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonHardSwishEndToEndTestQAsymmS8") { HardSwishEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonHardSwishEndToEndTestQAsymmU8") { HardSwishEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonPreluEndToEndFloat32Test") { PreluEndToEndNegativeTest(neonDefaultBackends); } TEST_CASE("NeonPreluEndToEndTestUint8Test") { PreluEndToEndPositiveTest(neonDefaultBackends); } TEST_CASE("NeonSpaceToDepthNhwcEndToEndTest1") { SpaceToDepthNhwcEndToEndTest1(neonDefaultBackends); } TEST_CASE("NeonSpaceToDepthNchwEndToEndTest1") { SpaceToDepthNchwEndToEndTest1(neonDefaultBackends); } TEST_CASE("NeonSpaceToDepthNhwcEndToEndTest2") { SpaceToDepthNhwcEndToEndTest2(neonDefaultBackends); } TEST_CASE("NeonSpaceToDepthNchwEndToEndTest2") { SpaceToDepthNchwEndToEndTest2(neonDefaultBackends); } TEST_CASE("NeonSplitter1dEndToEndTest") { Splitter1dEndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter1dEndToEndUint8Test") { Splitter1dEndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter2dDim0EndToEndTest") { Splitter2dDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter2dDim1EndToEndTest") { Splitter2dDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter2dDim0EndToEndUint8Test") { Splitter2dDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter2dDim1EndToEndUint8Test") { Splitter2dDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter3dDim0EndToEndTest") { Splitter3dDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter3dDim1EndToEndTest") { Splitter3dDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter3dDim2EndToEndTest") { Splitter3dDim2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter3dDim0EndToEndUint8Test") { Splitter3dDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter3dDim1EndToEndUint8Test") { Splitter3dDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter3dDim2EndToEndUint8Test") { Splitter3dDim2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim0EndToEndTest") { Splitter4dDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim1EndToEndTest") { Splitter4dDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim2EndToEndTest") { Splitter4dDim2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim3EndToEndTest") { Splitter4dDim3EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim0EndToEndUint8Test") { Splitter4dDim0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim1EndToEndUint8Test") { Splitter4dDim1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim2EndToEndUint8Test") { Splitter4dDim2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonSplitter4dDim3EndToEndUint8Test") { Splitter4dDim3EndToEnd(neonDefaultBackends); } TEST_CASE("NeonQuantizedLstmEndToEndTest") { QuantizedLstmEndToEnd(neonDefaultBackends); } TEST_CASE("NeonTransposeConvolution2dEndToEndFloatNchwTest") { TransposeConvolution2dEndToEnd( neonDefaultBackends, armnn::DataLayout::NCHW); } TEST_CASE("NeonTransposeConvolution2dEndToEndUint8NchwTest") { TransposeConvolution2dEndToEnd( neonDefaultBackends, armnn::DataLayout::NCHW); } TEST_CASE("NeonTransposeConvolution2dEndToEndFloatNhwcTest") { TransposeConvolution2dEndToEnd( neonDefaultBackends, armnn::DataLayout::NHWC); } TEST_CASE("NeonTransposeConvolution2dEndToEndUint8NhwcTest") { TransposeConvolution2dEndToEnd( neonDefaultBackends, armnn::DataLayout::NHWC); } TEST_CASE("NeonImportNonAlignedInputPointerTest") { ImportNonAlignedInputPointerTest(neonDefaultBackends); } TEST_CASE("NeonExportNonAlignedOutputPointerTest") { ExportNonAlignedOutputPointerTest(neonDefaultBackends); } TEST_CASE("NeonImportAlignedPointerTest") { ImportAlignedPointerTest(neonDefaultBackends); } TEST_CASE("NeonImportOnlyWorkload") { ImportOnlyWorkload(neonDefaultBackends); } TEST_CASE("NeonExportOnlyWorkload") { ExportOnlyWorkload(neonDefaultBackends); } TEST_CASE("NeonImportAndExportWorkload") { ImportAndExportWorkload(neonDefaultBackends); } TEST_CASE("NeonExportOutputWithSeveralOutputSlotConnectionsTest") { ExportOutputWithSeveralOutputSlotConnectionsTest(neonDefaultBackends); } // InstanceNormalization TEST_CASE("NeonInstanceNormalizationNchwEndToEndTest1") { InstanceNormalizationNchwEndToEndTest1(neonDefaultBackends); } TEST_CASE("NeonInstanceNormalizationNchwEndToEndTest2") { InstanceNormalizationNchwEndToEndTest2(neonDefaultBackends); } // Fill TEST_CASE("NeonFillEndToEndTest") { FillEndToEnd(neonDefaultBackends); } TEST_CASE("RefFillEndToEndTestFloat16") { FillEndToEnd(neonDefaultBackends); } TEST_CASE("NeonFillEndToEndTestInt32") { FillEndToEnd(neonDefaultBackends); } // ArgMinMax TEST_CASE("NeonArgMaxSimpleTest") { ArgMaxEndToEndSimple(neonDefaultBackends); } TEST_CASE("NeonArgMinSimpleTest") { ArgMinEndToEndSimple(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis0Test") { ArgMaxAxis0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis0Test") { ArgMinAxis0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis1Test") { ArgMaxAxis1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis1Test") { ArgMinAxis1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis2Test") { ArgMaxAxis2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis2Test") { ArgMinAxis2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis3Test") { ArgMaxAxis3EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis3Test") { ArgMinAxis3EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMaxSimpleTestQuantisedAsymm8") { ArgMaxEndToEndSimple(neonDefaultBackends); } TEST_CASE("NeonArgMinSimpleTestQuantisedAsymm8") { ArgMinEndToEndSimple(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis0TestQuantisedAsymm8") { ArgMaxAxis0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis0TestQuantisedAsymm8") { ArgMinAxis0EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis1TestQuantisedAsymm8") { ArgMaxAxis1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis1TestQuantisedAsymm8") { ArgMinAxis1EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis2TestQuantisedAsymm8") { ArgMaxAxis2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis2TestQuantisedAsymm8") { ArgMinAxis2EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMaxAxis3TestQuantisedAsymm8") { ArgMaxAxis3EndToEnd(neonDefaultBackends); } TEST_CASE("NeonArgMinAxis3TestQuantisedAsymm8") { ArgMinAxis3EndToEnd(neonDefaultBackends); } TEST_CASE("NeonStridedSliceInvalidSliceEndToEndTest") { StridedSliceInvalidSliceEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonForceImportWithAlignedBuffersEndToEndTest") { ForceImportWithAlignedBuffersEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonForceImportWithMisalignedInputBuffersEndToEndTest") { ForceImportWithMisalignedInputBuffersEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonForceImportWithMisalignedOutputBuffersEndToEndTest") { ForceImportWithMisalignedOutputBuffersEndToEndTest(neonDefaultBackends); } TEST_CASE("NeonForceImportWithMisalignedInputAndOutputBuffersEndToEndTest") { ForceImportWithMisalignedInputAndOutputBuffersEndToEndTest(neonDefaultBackends); } // DISABLED //TEST_CASE("NeonDetectionPostProcessRegularNmsTest") //{ // std::vector boxEncodings({ // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, -1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f // }); // std::vector scores({ // 0.0f, 0.9f, 0.8f, // 0.0f, 0.75f, 0.72f, // 0.0f, 0.6f, 0.5f, // 0.0f, 0.93f, 0.95f, // 0.0f, 0.5f, 0.4f, // 0.0f, 0.3f, 0.2f // }); // std::vector anchors({ // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 100.5f, 1.0f, 1.0f // }); // DetectionPostProcessRegularNmsEndToEnd(neonDefaultBackends, // boxEncodings, // scores, // anchors); //} inline void QuantizeData(uint8_t* quant, const float* dequant, const TensorInfo& info) { for (size_t i = 0; i < info.GetNumElements(); i++) { quant[i] = armnn::Quantize(dequant[i], info.GetQuantizationScale(), info.GetQuantizationOffset()); } } // DISABLED //TEST_CASE("NeonDetectionPostProcessRegularNmsUint8Test") //{ // armnn::TensorInfo boxEncodingsInfo({ 1, 6, 4 }, armnn::DataType::Float32); // armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32); // armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32); // // boxEncodingsInfo.SetQuantizationScale(1.0f); // boxEncodingsInfo.SetQuantizationOffset(1); // scoresInfo.SetQuantizationScale(0.01f); // scoresInfo.SetQuantizationOffset(0); // anchorsInfo.SetQuantizationScale(0.5f); // anchorsInfo.SetQuantizationOffset(0); // // std::vector boxEncodings({ // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, -1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f // }); // std::vector scores({ // 0.0f, 0.9f, 0.8f, // 0.0f, 0.75f, 0.72f, // 0.0f, 0.6f, 0.5f, // 0.0f, 0.93f, 0.95f, // 0.0f, 0.5f, 0.4f, // 0.0f, 0.3f, 0.2f // }); // std::vector anchors({ // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 100.5f, 1.0f, 1.0f // }); // // std::vector qBoxEncodings(boxEncodings.size(), 0); // std::vector qScores(scores.size(), 0); // std::vector qAnchors(anchors.size(), 0); // QuantizeData(qBoxEncodings.data(), boxEncodings.data(), boxEncodingsInfo); // QuantizeData(qScores.data(), scores.data(), scoresInfo); // QuantizeData(qAnchors.data(), anchors.data(), anchorsInfo); // DetectionPostProcessRegularNmsEndToEnd(neonDefaultBackends, qBoxEncodings, // qScores, qAnchors, // 1.0f, 1, 0.01f, 0, 0.5f, 0); //} // //TEST_CASE("NeonDetectionPostProcessFastNmsTest") //{ // std::vector boxEncodings({ // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, -1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f // }); // std::vector scores({ // 0.0f, 0.9f, 0.8f, // 0.0f, 0.75f, 0.72f, // 0.0f, 0.6f, 0.5f, // 0.0f, 0.93f, 0.95f, // 0.0f, 0.5f, 0.4f, // 0.0f, 0.3f, 0.2f // }); // std::vector anchors({ // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 100.5f, 1.0f, 1.0f // }); // DetectionPostProcessFastNmsEndToEnd(neonDefaultBackends, // boxEncodings, // scores, // anchors); //} // // DISABLED //TEST_CASE("NeonDetectionPostProcessFastNmsUint8Test") //{ // armnn::TensorInfo boxEncodingsInfo({ 1, 6, 4 }, armnn::DataType::Float32); // armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32); // armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32); // // boxEncodingsInfo.SetQuantizationScale(1.0f); // boxEncodingsInfo.SetQuantizationOffset(1); // scoresInfo.SetQuantizationScale(0.01f); // scoresInfo.SetQuantizationOffset(0); // anchorsInfo.SetQuantizationScale(0.5f); // anchorsInfo.SetQuantizationOffset(0); // // std::vector boxEncodings({ // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, -1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f, // 0.0f, 1.0f, 0.0f, 0.0f, // 0.0f, 0.0f, 0.0f, 0.0f // }); // std::vector scores({ // 0.0f, 0.9f, 0.8f, // 0.0f, 0.75f, 0.72f, // 0.0f, 0.6f, 0.5f, // 0.0f, 0.93f, 0.95f, // 0.0f, 0.5f, 0.4f, // 0.0f, 0.3f, 0.2f // }); // std::vector anchors({ // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 0.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 10.5f, 1.0f, 1.0f, // 0.5f, 100.5f, 1.0f, 1.0f // }); // // std::vector qBoxEncodings(boxEncodings.size(), 0); // std::vector qScores(scores.size(), 0); // std::vector qAnchors(anchors.size(), 0); // QuantizeData(qBoxEncodings.data(), boxEncodings.data(), boxEncodingsInfo); // QuantizeData(qScores.data(), scores.data(), scoresInfo); // QuantizeData(qAnchors.data(), anchors.data(), anchorsInfo); // DetectionPostProcessFastNmsEndToEnd(neonDefaultBackends, qBoxEncodings, // qScores, qAnchors, // 1.0f, 1, 0.01f, 0, 0.5f, 0); //} TEST_CASE("NeonQLstmEndToEndTest") { QLstmEndToEnd(neonDefaultBackends); } }