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 <aclCommon/ArmComputeTensorUtils.hpp> 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTECL_ENABLED) && defined(ARMCOMPUTENEON_ENABLED) 9*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/LayerTestResult.hpp> 10*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/MemCopyTestImpl.hpp> 11*89c4ff92SAndroid Build Coastguard Worker #include <cl/ClWorkloadFactory.hpp> 12*89c4ff92SAndroid Build Coastguard Worker #include <cl/test/ClContextControlFixture.hpp> 13*89c4ff92SAndroid Build Coastguard Worker #include <cl/test/ClWorkloadFactoryHelper.hpp> 14*89c4ff92SAndroid Build Coastguard Worker #include <neon/NeonWorkloadFactory.hpp> 15*89c4ff92SAndroid Build Coastguard Worker #include <neon/test/NeonWorkloadFactoryHelper.hpp> 16*89c4ff92SAndroid Build Coastguard Worker #endif 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h> 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("MemCopyCommon") 21*89c4ff92SAndroid Build Coastguard Worker { 22*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("AclTypeConversions") 23*89c4ff92SAndroid Build Coastguard Worker { 24*89c4ff92SAndroid Build Coastguard Worker arm_compute::Strides strides(1, 2, 3, 4); 25*89c4ff92SAndroid Build Coastguard Worker armnn::TensorShape convertedStrides = armnn::armcomputetensorutils::GetStrides(strides); 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedStrides[0] == 4); 28*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedStrides[1] == 3); 29*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedStrides[2] == 2); 30*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedStrides[3] == 1); 31*89c4ff92SAndroid Build Coastguard Worker 32*89c4ff92SAndroid Build Coastguard Worker arm_compute::TensorShape shape(5, 6, 7, 8); 33*89c4ff92SAndroid Build Coastguard Worker armnn::TensorShape convertedshape = armnn::armcomputetensorutils::GetShape(shape); 34*89c4ff92SAndroid Build Coastguard Worker 35*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedshape[0] == 8); 36*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedshape[1] == 7); 37*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedshape[2] == 6); 38*89c4ff92SAndroid Build Coastguard Worker CHECK(convertedshape[3] == 5); 39*89c4ff92SAndroid Build Coastguard Worker } 40*89c4ff92SAndroid Build Coastguard Worker 41*89c4ff92SAndroid Build Coastguard Worker } 42*89c4ff92SAndroid Build Coastguard Worker 43*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTECL_ENABLED) && defined(ARMCOMPUTENEON_ENABLED) 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker namespace 46*89c4ff92SAndroid Build Coastguard Worker { 47*89c4ff92SAndroid Build Coastguard Worker 48*89c4ff92SAndroid Build Coastguard Worker template <> 49*89c4ff92SAndroid Build Coastguard Worker struct MemCopyTestHelper<armnn::NeonWorkloadFactory> 50*89c4ff92SAndroid Build Coastguard Worker { GetMemoryManager__anon582182280111::MemCopyTestHelper51*89c4ff92SAndroid Build Coastguard Worker static armnn::IBackendInternal::IMemoryManagerSharedPtr GetMemoryManager() 52*89c4ff92SAndroid Build Coastguard Worker { 53*89c4ff92SAndroid Build Coastguard Worker armnn::NeonBackend backend; 54*89c4ff92SAndroid Build Coastguard Worker return backend.CreateMemoryManager(); 55*89c4ff92SAndroid Build Coastguard Worker } 56*89c4ff92SAndroid Build Coastguard Worker GetFactory__anon582182280111::MemCopyTestHelper57*89c4ff92SAndroid Build Coastguard Worker static armnn::NeonWorkloadFactory GetFactory( 58*89c4ff92SAndroid Build Coastguard Worker const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, 59*89c4ff92SAndroid Build Coastguard Worker const armnn::ModelOptions& modelOptions = {}) 60*89c4ff92SAndroid Build Coastguard Worker { 61*89c4ff92SAndroid Build Coastguard Worker armnn::NeonBackend backend; 62*89c4ff92SAndroid Build Coastguard Worker return armnn::NeonWorkloadFactory(armnn::PolymorphicPointerDowncast<armnn::NeonMemoryManager>(memoryManager), 63*89c4ff92SAndroid Build Coastguard Worker backend.CreateBackendSpecificModelContext(modelOptions)); 64*89c4ff92SAndroid Build Coastguard Worker } 65*89c4ff92SAndroid Build Coastguard Worker }; 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker template <> 68*89c4ff92SAndroid Build Coastguard Worker struct MemCopyTestHelper<armnn::ClWorkloadFactory> 69*89c4ff92SAndroid Build Coastguard Worker { GetMemoryManager__anon582182280111::MemCopyTestHelper70*89c4ff92SAndroid Build Coastguard Worker static armnn::IBackendInternal::IMemoryManagerSharedPtr GetMemoryManager() 71*89c4ff92SAndroid Build Coastguard Worker { 72*89c4ff92SAndroid Build Coastguard Worker armnn::ClBackend backend; 73*89c4ff92SAndroid Build Coastguard Worker return backend.CreateMemoryManager(); 74*89c4ff92SAndroid Build Coastguard Worker } 75*89c4ff92SAndroid Build Coastguard Worker GetFactory__anon582182280111::MemCopyTestHelper76*89c4ff92SAndroid Build Coastguard Worker static armnn::ClWorkloadFactory GetFactory( 77*89c4ff92SAndroid Build Coastguard Worker const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, 78*89c4ff92SAndroid Build Coastguard Worker const armnn::ModelOptions& modelOptions = {}) 79*89c4ff92SAndroid Build Coastguard Worker { 80*89c4ff92SAndroid Build Coastguard Worker armnn::ClBackend backend; 81*89c4ff92SAndroid Build Coastguard Worker return armnn::ClWorkloadFactory(armnn::PolymorphicPointerDowncast<armnn::ClMemoryManager>(memoryManager), 82*89c4ff92SAndroid Build Coastguard Worker backend.CreateBackendSpecificModelContext(modelOptions)); 83*89c4ff92SAndroid Build Coastguard Worker } 84*89c4ff92SAndroid Build Coastguard Worker }; 85*89c4ff92SAndroid Build Coastguard Worker } // namespace 86*89c4ff92SAndroid Build Coastguard Worker 87*89c4ff92SAndroid Build Coastguard Worker 88*89c4ff92SAndroid Build Coastguard Worker 89*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(ClContextControlFixture, "CopyBetweenNeonAndGpu") 90*89c4ff92SAndroid Build Coastguard Worker { 91*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 92*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::NeonWorkloadFactory, armnn::ClWorkloadFactory, armnn::DataType::Float32>(false); 93*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 94*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 95*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 96*89c4ff92SAndroid Build Coastguard Worker } 97*89c4ff92SAndroid Build Coastguard Worker 98*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(ClContextControlFixture, "CopyBetweenGpuAndNeon") 99*89c4ff92SAndroid Build Coastguard Worker { 100*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 101*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::ClWorkloadFactory, armnn::NeonWorkloadFactory, armnn::DataType::Float32>(false); 102*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 103*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 104*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 105*89c4ff92SAndroid Build Coastguard Worker } 106*89c4ff92SAndroid Build Coastguard Worker 107*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(ClContextControlFixture, "CopyBetweenNeonAndGpuWithSubtensors") 108*89c4ff92SAndroid Build Coastguard Worker { 109*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 110*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::NeonWorkloadFactory, armnn::ClWorkloadFactory, armnn::DataType::Float32>(true); 111*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 112*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 113*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 114*89c4ff92SAndroid Build Coastguard Worker } 115*89c4ff92SAndroid Build Coastguard Worker 116*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(ClContextControlFixture, "CopyBetweenGpuAndNeonWithSubtensors") 117*89c4ff92SAndroid Build Coastguard Worker { 118*89c4ff92SAndroid Build Coastguard Worker LayerTestResult<float, 4> result = 119*89c4ff92SAndroid Build Coastguard Worker MemCopyTest<armnn::ClWorkloadFactory, armnn::NeonWorkloadFactory, armnn::DataType::Float32>(true); 120*89c4ff92SAndroid Build Coastguard Worker auto predResult = CompareTensors(result.m_ActualData, result.m_ExpectedData, 121*89c4ff92SAndroid Build Coastguard Worker result.m_ActualShape, result.m_ExpectedShape); 122*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str()); 123*89c4ff92SAndroid Build Coastguard Worker } 124*89c4ff92SAndroid Build Coastguard Worker 125*89c4ff92SAndroid Build Coastguard Worker #endif 126