// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include #include #include #include #if ARMCOMPUTECL_ENABLED #include #endif #if ARMCOMPUTENEON_ENABLED #include #endif #include #include #include "TensorCopyUtils.hpp" #include "WorkloadTestUtils.hpp" #if ARMCOMPUTECL_ENABLED || ARMCOMPUTENEON_ENABLED #include #endif BOOST_AUTO_TEST_SUITE(MemCopyTestSuite) void MemCopyTest(armnn::IWorkloadFactory& srcWorkloadFactory, armnn::IWorkloadFactory& dstWorkloadFactory, bool withSubtensors) { const std::array shapeData = { { 1u, 1u, 6u, 5u } }; const armnn::TensorShape tensorShape(4, shapeData.data()); const armnn::TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32); boost::multi_array inputData = MakeTensor(tensorInfo, std::vector( { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, }) ); boost::multi_array outputData(shapeData); auto inputTensorHandle = srcWorkloadFactory.CreateTensorHandle(tensorInfo); auto outputTensorHandle = dstWorkloadFactory.CreateTensorHandle(tensorInfo); AllocateAndCopyDataToITensorHandle(inputTensorHandle.get(), inputData.data()); outputTensorHandle->Allocate(); armnn::MemCopyQueueDescriptor memCopyQueueDesc; armnn::WorkloadInfo workloadInfo; const unsigned int origin[4] = {}; auto workloadInput = (withSubtensors && srcWorkloadFactory.SupportsSubTensors()) ? srcWorkloadFactory.CreateSubTensorHandle(*inputTensorHandle, tensorShape, origin) : std::move(inputTensorHandle); auto workloadOutput = (withSubtensors && dstWorkloadFactory.SupportsSubTensors()) ? dstWorkloadFactory.CreateSubTensorHandle(*outputTensorHandle, tensorShape, origin) : std::move(outputTensorHandle); AddInputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadInput.get()); AddOutputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadOutput.get()); dstWorkloadFactory.CreateMemCopy(memCopyQueueDesc, workloadInfo)->Execute(); CopyDataFromITensorHandle(outputData.data(), workloadOutput.get()); BOOST_TEST(CompareTensors(inputData, outputData)); } template void MemCopyTest(bool withSubtensors) { SrcWorkloadFactory srcWorkloadFactory; DstWorkloadFactory dstWorkloadFactory; MemCopyTest(srcWorkloadFactory, dstWorkloadFactory, withSubtensors); } #if ARMCOMPUTECL_ENABLED || ARMCOMPUTENEON_ENABLED BOOST_AUTO_TEST_CASE(AclTypeConversions) { arm_compute::Strides strides(1,2,3,4); armnn::TensorShape convertedStrides = armnn::armcomputetensorutils::GetStrides(strides); BOOST_TEST(convertedStrides[0] == 4); BOOST_TEST(convertedStrides[1] == 3); BOOST_TEST(convertedStrides[2] == 2); BOOST_TEST(convertedStrides[3] == 1); arm_compute::TensorShape shape(5,6,7,8); armnn::TensorShape convertedshape = armnn::armcomputetensorutils::GetShape(shape); BOOST_TEST(convertedshape[0] == 8); BOOST_TEST(convertedshape[1] == 7); BOOST_TEST(convertedshape[2] == 6); BOOST_TEST(convertedshape[3] == 5); } #endif #if ARMCOMPUTECL_ENABLED BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndGpu) { MemCopyTest(false); } BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndCpu) { MemCopyTest(false); } BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndGpuWithSubtensors) { MemCopyTest(true); } BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndCpuWithSubtensors) { MemCopyTest(true); } #endif // ARMCOMPUTECL_ENABLED #if ARMCOMPUTENEON_ENABLED BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndNeon) { MemCopyTest(false); } BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndCpu) { MemCopyTest(false); } BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndNeonWithSubtensors) { MemCopyTest(true); } BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndCpuWithSubtensors) { MemCopyTest(true); } #endif // ARMCOMPUTENEON_ENABLED #if ARMCOMPUTECL_ENABLED && ARMCOMPUTENEON_ENABLED BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndGpu) { MemCopyTest(false); } BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndNeon) { MemCopyTest(false); } BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndGpuWithSubtensors) { MemCopyTest(true); } BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndNeonWithSubtensors) { MemCopyTest(true); } #endif BOOST_AUTO_TEST_SUITE_END()