blob: 0a30907f554c8ab95275023a500237f29c551f2c [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00007#include <test/CreateWorkload.hpp>
Colm Donelan25ab3a82021-05-17 13:01:52 +01008#include <test/PredicateResult.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +01009#include <armnn/utility/PolymorphicDowncast.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <backendsCommon/MemCopyWorkload.hpp>
11#include <reference/RefWorkloadFactory.hpp>
Matthew Bentham4cefc412019-06-18 16:14:34 +010012#include <reference/RefTensorHandle.hpp>
telsoa014fcda012018-03-09 14:13:49 +000013
Matteo Martincighd95e9062019-01-31 15:35:59 +000014#if defined(ARMCOMPUTECL_ENABLED)
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <cl/ClTensorHandle.hpp>
telsoa014fcda012018-03-09 14:13:49 +000016#endif
17
Matteo Martincighd95e9062019-01-31 15:35:59 +000018#if defined(ARMCOMPUTENEON_ENABLED)
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000019#include <neon/NeonTensorHandle.hpp>
telsoa014fcda012018-03-09 14:13:49 +000020#endif
21
telsoa014fcda012018-03-09 14:13:49 +000022using namespace armnn;
23
24namespace
25{
26
27using namespace std;
28
29template<typename IComputeTensorHandle>
Colm Donelan25ab3a82021-05-17 13:01:52 +010030PredicateResult CompareTensorHandleShape(IComputeTensorHandle* tensorHandle,
31 std::initializer_list<unsigned int> expectedDimensions)
telsoa014fcda012018-03-09 14:13:49 +000032{
33 arm_compute::ITensorInfo* info = tensorHandle->GetTensor().info();
34
35 auto infoNumDims = info->num_dimensions();
36 auto numExpectedDims = expectedDimensions.size();
37 if (infoNumDims != numExpectedDims)
38 {
Colm Donelan25ab3a82021-05-17 13:01:52 +010039 PredicateResult res(false);
40 res.Message() << "Different number of dimensions [" << info->num_dimensions()
telsoa014fcda012018-03-09 14:13:49 +000041 << "!=" << expectedDimensions.size() << "]";
42 return res;
43 }
44
45 size_t i = info->num_dimensions() - 1;
46
47 for (unsigned int expectedDimension : expectedDimensions)
48 {
49 if (info->dimension(i) != expectedDimension)
50 {
Colm Donelan25ab3a82021-05-17 13:01:52 +010051 PredicateResult res(false);
52 res.Message() << "For dimension " << i <<
Matthew Bentham89105282018-11-20 14:33:33 +000053 " expected size " << expectedDimension <<
54 " got " << info->dimension(i);
telsoa014fcda012018-03-09 14:13:49 +000055 return res;
56 }
57
58 i--;
59 }
60
Colm Donelan25ab3a82021-05-17 13:01:52 +010061 return PredicateResult(true);
telsoa014fcda012018-03-09 14:13:49 +000062}
63
telsoa01c577f2c2018-08-31 09:22:23 +010064template<typename IComputeTensorHandle>
telsoa014fcda012018-03-09 14:13:49 +000065void CreateMemCopyWorkloads(IWorkloadFactory& factory)
66{
Derek Lamberti84da38b2019-06-13 11:40:08 +010067 TensorHandleFactoryRegistry registry;
telsoa014fcda012018-03-09 14:13:49 +000068 Graph graph;
69 RefWorkloadFactory refFactory;
70
telsoa01c577f2c2018-08-31 09:22:23 +010071 // Creates the layers we're testing.
telsoa014fcda012018-03-09 14:13:49 +000072 Layer* const layer1 = graph.AddLayer<MemCopyLayer>("layer1");
73 Layer* const layer2 = graph.AddLayer<MemCopyLayer>("layer2");
74
telsoa01c577f2c2018-08-31 09:22:23 +010075 // Creates extra layers.
telsoa014fcda012018-03-09 14:13:49 +000076 Layer* const input = graph.AddLayer<InputLayer>(0, "input");
77 Layer* const output = graph.AddLayer<OutputLayer>(0, "output");
78
telsoa01c577f2c2018-08-31 09:22:23 +010079 // Connects up.
telsoa014fcda012018-03-09 14:13:49 +000080 TensorInfo tensorInfo({2, 3}, DataType::Float32);
81 Connect(input, layer1, tensorInfo);
82 Connect(layer1, layer2, tensorInfo);
83 Connect(layer2, output, tensorInfo);
84
Derek Lamberti84da38b2019-06-13 11:40:08 +010085 input->CreateTensorHandles(registry, refFactory);
86 layer1->CreateTensorHandles(registry, factory);
87 layer2->CreateTensorHandles(registry, refFactory);
88 output->CreateTensorHandles(registry, refFactory);
telsoa014fcda012018-03-09 14:13:49 +000089
90 // make the workloads and check them
Derek Lamberti94a88d22019-12-10 21:12:59 +000091 auto workload1 = MakeAndCheckWorkload<CopyMemGenericWorkload>(*layer1, factory);
92 auto workload2 = MakeAndCheckWorkload<CopyMemGenericWorkload>(*layer2, refFactory);
telsoa014fcda012018-03-09 14:13:49 +000093
94 MemCopyQueueDescriptor queueDescriptor1 = workload1->GetData();
95 BOOST_TEST(queueDescriptor1.m_Inputs.size() == 1);
96 BOOST_TEST(queueDescriptor1.m_Outputs.size() == 1);
Jan Eilersbb446e52020-04-02 13:56:54 +010097 auto inputHandle1 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor1.m_Inputs[0]);
98 auto outputHandle1 = PolymorphicDowncast<IComputeTensorHandle*>(queueDescriptor1.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000099 BOOST_TEST((inputHandle1->GetTensorInfo() == TensorInfo({2, 3}, DataType::Float32)));
Colm Donelan25ab3a82021-05-17 13:01:52 +0100100 auto result = CompareTensorHandleShape<IComputeTensorHandle>(outputHandle1, {2, 3});
101 BOOST_TEST(result.m_Result, result.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000102
103
104 MemCopyQueueDescriptor queueDescriptor2 = workload2->GetData();
105 BOOST_TEST(queueDescriptor2.m_Inputs.size() == 1);
106 BOOST_TEST(queueDescriptor2.m_Outputs.size() == 1);
Jan Eilersbb446e52020-04-02 13:56:54 +0100107 auto inputHandle2 = PolymorphicDowncast<IComputeTensorHandle*>(queueDescriptor2.m_Inputs[0]);
108 auto outputHandle2 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor2.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100109 result = CompareTensorHandleShape<IComputeTensorHandle>(inputHandle2, {2, 3});
110 BOOST_TEST(result.m_Result, result.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000111 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({2, 3}, DataType::Float32)));
112}
113
Matthew Bentham89105282018-11-20 14:33:33 +0000114} //namespace