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