1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include "../NeonWorkloadFactory.hpp" 7*89c4ff92SAndroid Build Coastguard Worker #include <neon/NeonBackend.hpp> 8*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/LayerTestResult.hpp> 9*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/MemCopyTestImpl.hpp> 10*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/MockBackend.hpp> 11*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h> 12*89c4ff92SAndroid Build Coastguard Worker 13*89c4ff92SAndroid Build Coastguard Worker namespace 14*89c4ff92SAndroid Build Coastguard Worker { 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker template <> 17*89c4ff92SAndroid Build Coastguard Worker struct MemCopyTestHelper<armnn::NeonWorkloadFactory> 18*89c4ff92SAndroid Build Coastguard Worker { GetMemoryManager__anon902cea6f0111::MemCopyTestHelper19*89c4ff92SAndroid Build Coastguard Worker static armnn::IBackendInternal::IMemoryManagerSharedPtr GetMemoryManager() 20*89c4ff92SAndroid Build Coastguard Worker { 21*89c4ff92SAndroid Build Coastguard Worker armnn::NeonBackend backend; 22*89c4ff92SAndroid Build Coastguard Worker return backend.CreateMemoryManager(); 23*89c4ff92SAndroid Build Coastguard Worker } 24*89c4ff92SAndroid Build Coastguard Worker GetFactory__anon902cea6f0111::MemCopyTestHelper25*89c4ff92SAndroid Build Coastguard Worker static armnn::NeonWorkloadFactory GetFactory( 26*89c4ff92SAndroid Build Coastguard Worker const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, 27*89c4ff92SAndroid Build Coastguard Worker const armnn::ModelOptions& modelOptions = {}) 28*89c4ff92SAndroid Build Coastguard Worker { 29*89c4ff92SAndroid Build Coastguard Worker armnn::NeonBackend backend; 30*89c4ff92SAndroid Build Coastguard Worker return armnn::NeonWorkloadFactory(armnn::PolymorphicPointerDowncast<armnn::NeonMemoryManager>(memoryManager), 31*89c4ff92SAndroid Build Coastguard Worker backend.CreateBackendSpecificModelContext(modelOptions)); 32*89c4ff92SAndroid Build Coastguard Worker } 33*89c4ff92SAndroid Build Coastguard Worker }; 34*89c4ff92SAndroid Build Coastguard Worker } // namespace 35*89c4ff92SAndroid Build Coastguard Worker 36*89c4ff92SAndroid Build Coastguard Worker 37*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("NeonMemCopy") 38*89c4ff92SAndroid Build Coastguard Worker { 39*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CopyBetweenCpuAndNeon") 40*89c4ff92SAndroid Build Coastguard Worker { 41*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 42*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::MockWorkloadFactory, armnn::NeonWorkloadFactory, armnn::DataType::Float32>(false); 43*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 44*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 45*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 46*89c4ff92SAndroid Build Coastguard Worker } 47*89c4ff92SAndroid Build Coastguard Worker 48*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CopyBetweenNeonAndCpu") 49*89c4ff92SAndroid Build Coastguard Worker { 50*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 51*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::NeonWorkloadFactory, armnn::MockWorkloadFactory, armnn::DataType::Float32>(false); 52*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 53*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 54*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 55*89c4ff92SAndroid Build Coastguard Worker } 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CopyBetweenCpuAndNeonWithSubtensors") 58*89c4ff92SAndroid Build Coastguard Worker { 59*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 60*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::MockWorkloadFactory, armnn::NeonWorkloadFactory, armnn::DataType::Float32>(true); 61*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 62*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 63*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 64*89c4ff92SAndroid Build Coastguard Worker } 65*89c4ff92SAndroid Build Coastguard Worker 66*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CopyBetweenNeonAndCpuWithSubtensors") 67*89c4ff92SAndroid Build Coastguard Worker { 68*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 69*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::NeonWorkloadFactory, armnn::MockWorkloadFactory, armnn::DataType::Float32>(true); 70*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 71*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 72*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 73*89c4ff92SAndroid Build Coastguard Worker } 74*89c4ff92SAndroid Build Coastguard Worker 75*89c4ff92SAndroid Build Coastguard Worker } 76