blob: 4247cc5ef42f38f4cac0b1111ccf0bab54170aee [file] [log] [blame]
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00007#include <backendsCommon/IBackendInternal.hpp>
8
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <backendsCommon/test/LayerTests.hpp>
10#include <backendsCommon/test/TensorCopyUtils.hpp>
Aron Virginas-Tar56055192018-11-12 18:10:43 +000011#include <backendsCommon/test/WorkloadFactoryHelper.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <backendsCommon/test/WorkloadTestUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010013
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014#include <test/TensorHelpers.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010015
16#include <boost/multi_array.hpp>
17
18namespace
19{
20
21LayerTestResult<float, 4> MemCopyTest(armnn::IWorkloadFactory& srcWorkloadFactory,
22 armnn::IWorkloadFactory& dstWorkloadFactory,
23 bool withSubtensors)
24{
25 const std::array<unsigned int, 4> shapeData = { { 1u, 1u, 6u, 5u } };
26 const armnn::TensorShape tensorShape(4, shapeData.data());
27 const armnn::TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
28 boost::multi_array<float, 4> inputData = MakeTensor<float, 4>(tensorInfo, std::vector<float>(
29 {
30 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
31
32 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
33
34 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
35
36 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
37
38 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
39
40 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
41 })
42 );
43
44 LayerTestResult<float, 4> ret(tensorInfo);
45 ret.outputExpected = inputData;
46
47 boost::multi_array<float, 4> outputData(shapeData);
48
49 auto inputTensorHandle = srcWorkloadFactory.CreateTensorHandle(tensorInfo);
50 auto outputTensorHandle = dstWorkloadFactory.CreateTensorHandle(tensorInfo);
51
52 AllocateAndCopyDataToITensorHandle(inputTensorHandle.get(), inputData.data());
53 outputTensorHandle->Allocate();
54
55 armnn::MemCopyQueueDescriptor memCopyQueueDesc;
56 armnn::WorkloadInfo workloadInfo;
57
58 const unsigned int origin[4] = {};
59
60 auto workloadInput = (withSubtensors && srcWorkloadFactory.SupportsSubTensors())
61 ? srcWorkloadFactory.CreateSubTensorHandle(*inputTensorHandle, tensorShape, origin)
62 : std::move(inputTensorHandle);
63 auto workloadOutput = (withSubtensors && dstWorkloadFactory.SupportsSubTensors())
64 ? dstWorkloadFactory.CreateSubTensorHandle(*outputTensorHandle, tensorShape, origin)
65 : std::move(outputTensorHandle);
66
67 AddInputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadInput.get());
68 AddOutputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadOutput.get());
69
70 dstWorkloadFactory.CreateMemCopy(memCopyQueueDesc, workloadInfo)->Execute();
71
72 CopyDataFromITensorHandle(outputData.data(), workloadOutput.get());
73 ret.output = outputData;
74
75 return ret;
76}
77
78template<typename SrcWorkloadFactory, typename DstWorkloadFactory>
79LayerTestResult<float, 4> MemCopyTest(bool withSubtensors)
80{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000081 armnn::IBackendInternal::IMemoryManagerSharedPtr srcMemoryManager =
82 WorkloadFactoryHelper<SrcWorkloadFactory>::GetMemoryManager();
83
84 armnn::IBackendInternal::IMemoryManagerSharedPtr dstMemoryManager =
85 WorkloadFactoryHelper<DstWorkloadFactory>::GetMemoryManager();
86
87 SrcWorkloadFactory srcWorkloadFactory = WorkloadFactoryHelper<SrcWorkloadFactory>::GetFactory(srcMemoryManager);
88 DstWorkloadFactory dstWorkloadFactory = WorkloadFactoryHelper<DstWorkloadFactory>::GetFactory(dstMemoryManager);
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010089
90 return MemCopyTest(srcWorkloadFactory, dstWorkloadFactory, withSubtensors);
91}
92
93} // anonymous namespace