blob: 79eb2e4419cb20c41332fa7570f9d1bb372e4789 [file] [log] [blame]
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "LayerTestResult.hpp"
9
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010010
11#include <ResolveType.hpp>
12
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000013#include <armnn/backends/IBackendInternal.hpp>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010014#include <backendsCommon/Workload.hpp>
15#include <backendsCommon/WorkloadData.hpp>
16#include <backendsCommon/WorkloadFactory.hpp>
17
josh minor4a3c6102020-01-06 16:40:46 -060018#include <backendsCommon/test/DataTypeUtils.hpp>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010019#include <backendsCommon/test/TensorCopyUtils.hpp>
20#include <backendsCommon/test/WorkloadTestUtils.hpp>
21
22#include <test/TensorHelpers.hpp>
23
24#include <memory>
25
26template<typename DescriptorType>
27std::unique_ptr<armnn::IWorkload> CreateWorkload(
28 const armnn::IWorkloadFactory& workloadFactory,
29 const armnn::WorkloadInfo& info,
30 const DescriptorType& descriptor)
31{
32 return CreateWorkload(workloadFactory, info, descriptor);
33}
34
35template <std::size_t NumDims,
36 typename Descriptor,
37 armnn::DataType ArmnnTypeInput,
38 armnn::DataType ArmnnTypeOutput,
39 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
40 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
41LayerTestResult<TOutput, NumDims> ElementwiseTestHelper(
42 armnn::IWorkloadFactory & workloadFactory,
43 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
44 const unsigned int shape0[NumDims],
45 std::vector<TInput> values0,
46 float quantScale0,
47 int quantOffset0,
48 const unsigned int shape1[NumDims],
49 std::vector<TInput> values1,
50 float quantScale1,
51 int quantOffset1,
52 const unsigned int outShape[NumDims],
53 std::vector<TOutput> outValues,
54 float outQuantScale,
55 int outQuantOffset)
56{
57 armnn::TensorInfo inputTensorInfo0{NumDims, shape0, ArmnnTypeInput};
58 armnn::TensorInfo inputTensorInfo1{NumDims, shape1, ArmnnTypeInput};
59 armnn::TensorInfo outputTensorInfo{NumDims, outShape, ArmnnTypeOutput};
60
61 auto input0 = MakeTensor<TInput, NumDims>(inputTensorInfo0, values0);
62 auto input1 = MakeTensor<TInput, NumDims>(inputTensorInfo1, values1);
63
64 inputTensorInfo0.SetQuantizationScale(quantScale0);
65 inputTensorInfo0.SetQuantizationOffset(quantOffset0);
66
67 inputTensorInfo1.SetQuantizationScale(quantScale1);
68 inputTensorInfo1.SetQuantizationOffset(quantOffset1);
69
70 outputTensorInfo.SetQuantizationScale(outQuantScale);
71 outputTensorInfo.SetQuantizationOffset(outQuantOffset);
72
73 LayerTestResult<TOutput, NumDims> ret(outputTensorInfo);
74
75 if(ArmnnTypeOutput == armnn::DataType::Boolean)
76 {
77 ret.compareBoolean = true;
78 }
79
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010080 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010081 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
82 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
83 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010084 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010085
86 Descriptor data;
87 armnn::WorkloadInfo info;
88 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
89 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
90 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
91 auto workload = CreateWorkload<Descriptor>(workloadFactory, info, data);
92
93 inputHandle0->Allocate();
94 inputHandle1->Allocate();
95 outputHandle->Allocate();
96
97 CopyDataToITensorHandle(inputHandle0.get(), input0.origin());
98 CopyDataToITensorHandle(inputHandle1.get(), input1.origin());
99
100 workload->PostAllocationConfigure();
101 ExecuteWorkload(*workload, memoryManager);
102
103 CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
104
105 ret.outputExpected = MakeTensor<TOutput, NumDims>(outputTensorInfo, outValues);
106 return ret;
107}
108
109template <std::size_t NumDims,
110 typename Descriptor,
111 armnn::DataType ArmnnType,
112 typename T = armnn::ResolveType<ArmnnType>>
113LayerTestResult<T, NumDims> ElementwiseTestHelper(
114 armnn::IWorkloadFactory & workloadFactory,
115 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
116 const unsigned int shape0[NumDims],
117 std::vector<T> values0,
118 float quantScale0,
119 int quantOffset0,
120 const unsigned int shape1[NumDims],
121 std::vector<T> values1,
122 float quantScale1,
123 int quantOffset1,
124 const unsigned int outShape[NumDims],
125 std::vector<T> outValues,
126 float outQuantScale,
127 int outQuantOffset)
128{
129 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnType, ArmnnType>(
130 workloadFactory,
131 memoryManager,
132 shape0,
133 values0,
134 quantScale0,
135 quantOffset0,
136 shape1,
137 values1,
138 quantScale1,
139 quantOffset1,
140 outShape,
141 outValues,
142 outQuantScale,
143 outQuantOffset);
144}
145
146template <std::size_t NumDims,
147 typename Descriptor,
148 armnn::DataType ArmnnTypeInput,
149 armnn::DataType ArmnnTypeOutput,
150 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
151 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
152LayerTestResult<TOutput, NumDims> ElementwiseTestHelper(
153 armnn::IWorkloadFactory & workloadFactory,
154 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
155 const unsigned int shape0[NumDims],
156 std::vector<TInput> values0,
157 const unsigned int shape1[NumDims],
158 std::vector<TInput> values1,
159 const unsigned int outShape[NumDims],
160 std::vector<TOutput> outValues,
161 float quantScale = 1.0f,
162 int quantOffset = 0)
163{
164 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnTypeInput, ArmnnTypeOutput>(
165 workloadFactory,
166 memoryManager,
167 shape0,
168 values0,
169 quantScale,
170 quantOffset,
171 shape1,
172 values1,
173 quantScale,
174 quantOffset,
175 outShape,
176 outValues,
177 quantScale,
178 quantOffset);
179}
180
181template <std::size_t NumDims,
182 typename Descriptor,
183 armnn::DataType ArmnnType,
184 typename T = armnn::ResolveType<ArmnnType>>
185LayerTestResult<T, NumDims> ElementwiseTestHelper(
186 armnn::IWorkloadFactory & workloadFactory,
187 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
188 const unsigned int shape0[NumDims],
189 std::vector<T> values0,
190 const unsigned int shape1[NumDims],
191 std::vector<T> values1,
192 const unsigned int outShape[NumDims],
193 std::vector<T> outValues,
194 float quantScale = 1.0f,
195 int quantOffset = 0)
196{
197 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnType, ArmnnType>(
198 workloadFactory,
199 memoryManager,
200 shape0,
201 values0,
202 shape1,
203 values1,
204 outShape,
205 outValues,
206 quantScale,
207 quantOffset);
josh minor4a3c6102020-01-06 16:40:46 -0600208}