aboutsummaryrefslogtreecommitdiff
path: root/src/backends/aclCommon/test/MemCopyTestImpl.hpp
blob: 322cb07c1adbd15d189600f2f38a5f5a0c30e866 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once

#include <backends/test/LayerTests.hpp>
#include <backends/test/TensorCopyUtils.hpp>
#include <backends/test/WorkloadTestUtils.hpp>

#include <armnn/test/TensorHelpers.hpp>

#include <boost/multi_array.hpp>

namespace
{

LayerTestResult<float, 4> MemCopyTest(armnn::IWorkloadFactory& srcWorkloadFactory,
                                      armnn::IWorkloadFactory& dstWorkloadFactory,
                                      bool withSubtensors)
{
    const std::array<unsigned int, 4> shapeData = { { 1u, 1u, 6u, 5u } };
    const armnn::TensorShape tensorShape(4, shapeData.data());
    const armnn::TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
    boost::multi_array<float, 4> inputData = MakeTensor<float, 4>(tensorInfo, std::vector<float>(
        {
            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,
        })
    );

    LayerTestResult<float, 4> ret(tensorInfo);
    ret.outputExpected = inputData;

    boost::multi_array<float, 4> 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());
    ret.output = outputData;

    return ret;
}

template<typename SrcWorkloadFactory, typename DstWorkloadFactory>
LayerTestResult<float, 4> MemCopyTest(bool withSubtensors)
{
    SrcWorkloadFactory srcWorkloadFactory;
    DstWorkloadFactory dstWorkloadFactory;

    return MemCopyTest(srcWorkloadFactory, dstWorkloadFactory, withSubtensors);
}

} // anonymous namespace