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