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