blob: ec5bfb0396d2801fa1c5c0bf353db07d9c978c7b [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,
Keith Davis33a626f2020-08-27 15:38:12 +010054 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010055 float outQuantScale,
56 int outQuantOffset)
57{
58 armnn::TensorInfo inputTensorInfo0{NumDims, shape0, ArmnnTypeInput};
59 armnn::TensorInfo inputTensorInfo1{NumDims, shape1, ArmnnTypeInput};
60 armnn::TensorInfo outputTensorInfo{NumDims, outShape, ArmnnTypeOutput};
61
62 auto input0 = MakeTensor<TInput, NumDims>(inputTensorInfo0, values0);
63 auto input1 = MakeTensor<TInput, NumDims>(inputTensorInfo1, values1);
64
65 inputTensorInfo0.SetQuantizationScale(quantScale0);
66 inputTensorInfo0.SetQuantizationOffset(quantOffset0);
67
68 inputTensorInfo1.SetQuantizationScale(quantScale1);
69 inputTensorInfo1.SetQuantizationOffset(quantOffset1);
70
71 outputTensorInfo.SetQuantizationScale(outQuantScale);
72 outputTensorInfo.SetQuantizationOffset(outQuantOffset);
73
74 LayerTestResult<TOutput, NumDims> ret(outputTensorInfo);
75
76 if(ArmnnTypeOutput == armnn::DataType::Boolean)
77 {
78 ret.compareBoolean = true;
79 }
80
Keith Davis33a626f2020-08-27 15:38:12 +010081 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = tensorHandleFactory.CreateTensorHandle(inputTensorInfo0);
82 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = tensorHandleFactory.CreateTensorHandle(inputTensorInfo1);
83 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010084
85 Descriptor data;
86 armnn::WorkloadInfo info;
87 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
88 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
89 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
90 auto workload = CreateWorkload<Descriptor>(workloadFactory, info, data);
91
92 inputHandle0->Allocate();
93 inputHandle1->Allocate();
94 outputHandle->Allocate();
95
96 CopyDataToITensorHandle(inputHandle0.get(), input0.origin());
97 CopyDataToITensorHandle(inputHandle1.get(), input1.origin());
98
99 workload->PostAllocationConfigure();
100 ExecuteWorkload(*workload, memoryManager);
101
102 CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
103
104 ret.outputExpected = MakeTensor<TOutput, NumDims>(outputTensorInfo, outValues);
105 return ret;
106}
107
108template <std::size_t NumDims,
109 typename Descriptor,
110 armnn::DataType ArmnnType,
111 typename T = armnn::ResolveType<ArmnnType>>
112LayerTestResult<T, NumDims> ElementwiseTestHelper(
113 armnn::IWorkloadFactory & workloadFactory,
114 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
115 const unsigned int shape0[NumDims],
116 std::vector<T> values0,
117 float quantScale0,
118 int quantOffset0,
119 const unsigned int shape1[NumDims],
120 std::vector<T> values1,
121 float quantScale1,
122 int quantOffset1,
123 const unsigned int outShape[NumDims],
124 std::vector<T> outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100125 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100126 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,
Keith Davis33a626f2020-08-27 15:38:12 +0100142 tensorHandleFactory,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100143 outQuantScale,
144 outQuantOffset);
145}
146
147template <std::size_t NumDims,
148 typename Descriptor,
149 armnn::DataType ArmnnTypeInput,
150 armnn::DataType ArmnnTypeOutput,
151 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
152 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
153LayerTestResult<TOutput, NumDims> ElementwiseTestHelper(
154 armnn::IWorkloadFactory & workloadFactory,
155 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
156 const unsigned int shape0[NumDims],
157 std::vector<TInput> values0,
158 const unsigned int shape1[NumDims],
159 std::vector<TInput> values1,
160 const unsigned int outShape[NumDims],
161 std::vector<TOutput> outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100162 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100163 float quantScale = 1.0f,
164 int quantOffset = 0)
165{
166 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnTypeInput, ArmnnTypeOutput>(
167 workloadFactory,
168 memoryManager,
169 shape0,
170 values0,
171 quantScale,
172 quantOffset,
173 shape1,
174 values1,
175 quantScale,
176 quantOffset,
177 outShape,
178 outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100179 tensorHandleFactory,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100180 quantScale,
181 quantOffset);
182}
183
184template <std::size_t NumDims,
185 typename Descriptor,
186 armnn::DataType ArmnnType,
187 typename T = armnn::ResolveType<ArmnnType>>
188LayerTestResult<T, NumDims> ElementwiseTestHelper(
189 armnn::IWorkloadFactory & workloadFactory,
190 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
191 const unsigned int shape0[NumDims],
192 std::vector<T> values0,
193 const unsigned int shape1[NumDims],
194 std::vector<T> values1,
195 const unsigned int outShape[NumDims],
196 std::vector<T> outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100197 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100198 float quantScale = 1.0f,
199 int quantOffset = 0)
200{
201 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnType, ArmnnType>(
202 workloadFactory,
203 memoryManager,
204 shape0,
205 values0,
206 shape1,
207 values1,
208 outShape,
209 outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100210 tensorHandleFactory,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100211 quantScale,
212 quantOffset);
josh minor4a3c6102020-01-06 16:40:46 -0600213}