blob: da6e11fe3e9c14fbb18534c0c1d880e460ede259 [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
Sadik Armagana097d2a2021-11-24 15:47:28 +00008#include <armnnTestUtils/LayerTestResult.hpp>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +01009
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>
Colm Donelan0c479742021-12-10 12:43:54 +000014#include <armnn/backends/Workload.hpp>
15#include <armnn/backends/WorkloadData.hpp>
16#include <armnn/backends/WorkloadFactory.hpp>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010017
Sadik Armagana097d2a2021-11-24 15:47:28 +000018#include <DataTypeUtils.hpp>
19#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000020#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010021
Colm Donelanc42a9872022-02-02 16:35:09 +000022#include <armnnTestUtils/TensorHelpers.hpp>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010023
24#include <memory>
25
26template<typename DescriptorType>
27std::unique_ptr<armnn::IWorkload> CreateWorkload(
Sadik Armagan483c8112021-06-01 09:24:52 +010028 const armnn::IWorkloadFactory& workloadFactory,
29 const armnn::WorkloadInfo& info,
30 const DescriptorType& descriptor) {
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010031 return CreateWorkload(workloadFactory, info, descriptor);
32}
33
Sadik Armagan483c8112021-06-01 09:24:52 +010034template<std::size_t NumDims,
35 typename Descriptor,
36 armnn::DataType ArmnnTypeInput,
37 armnn::DataType ArmnnTypeOutput,
38 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
39 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010040LayerTestResult<TOutput, NumDims> ElementwiseTestHelper(
Sadik Armagan483c8112021-06-01 09:24:52 +010041 armnn::IWorkloadFactory& workloadFactory,
42 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
43 const unsigned int shape0[NumDims],
44 std::vector<TInput> values0,
45 float quantScale0,
46 int quantOffset0,
47 const unsigned int shape1[NumDims],
48 std::vector<TInput> values1,
49 float quantScale1,
50 int quantOffset1,
51 const unsigned int outShape[NumDims],
52 std::vector<TOutput> outValues,
53 const armnn::ITensorHandleFactory& tensorHandleFactory,
54 float outQuantScale,
55 int outQuantOffset) {
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010056 armnn::TensorInfo inputTensorInfo0{NumDims, shape0, ArmnnTypeInput};
57 armnn::TensorInfo inputTensorInfo1{NumDims, shape1, ArmnnTypeInput};
58 armnn::TensorInfo outputTensorInfo{NumDims, outShape, ArmnnTypeOutput};
59
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010060 inputTensorInfo0.SetQuantizationScale(quantScale0);
61 inputTensorInfo0.SetQuantizationOffset(quantOffset0);
62
63 inputTensorInfo1.SetQuantizationScale(quantScale1);
64 inputTensorInfo1.SetQuantizationOffset(quantOffset1);
65
66 outputTensorInfo.SetQuantizationScale(outQuantScale);
67 outputTensorInfo.SetQuantizationOffset(outQuantOffset);
68
Sadik Armagan483c8112021-06-01 09:24:52 +010069 std::vector<TOutput> actualOutput(outputTensorInfo.GetNumElements());
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010070
Sadik Armagan483c8112021-06-01 09:24:52 +010071 bool isBoolean = false;
72 if (ArmnnTypeOutput == armnn::DataType::Boolean)
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010073 {
Sadik Armagan483c8112021-06-01 09:24:52 +010074 isBoolean = true;
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010075 }
76
Keith Davis33a626f2020-08-27 15:38:12 +010077 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = tensorHandleFactory.CreateTensorHandle(inputTensorInfo0);
78 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = tensorHandleFactory.CreateTensorHandle(inputTensorInfo1);
79 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010080
81 Descriptor data;
82 armnn::WorkloadInfo info;
83 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
84 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
85 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
86 auto workload = CreateWorkload<Descriptor>(workloadFactory, info, data);
87
88 inputHandle0->Allocate();
89 inputHandle1->Allocate();
90 outputHandle->Allocate();
91
Sadik Armagan483c8112021-06-01 09:24:52 +010092 CopyDataToITensorHandle(inputHandle0.get(), values0.data());
93 CopyDataToITensorHandle(inputHandle1.get(), values1.data());
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010094
95 workload->PostAllocationConfigure();
96 ExecuteWorkload(*workload, memoryManager);
97
Sadik Armagan483c8112021-06-01 09:24:52 +010098 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010099
Sadik Armagan483c8112021-06-01 09:24:52 +0100100 return LayerTestResult<TOutput, NumDims>(actualOutput,
101 outValues,
102 outputHandle->GetShape(),
103 outputTensorInfo.GetShape(),
104 isBoolean);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100105}
106
Sadik Armagan483c8112021-06-01 09:24:52 +0100107template<std::size_t NumDims,
108 typename Descriptor,
109 armnn::DataType ArmnnType,
110 typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100111LayerTestResult<T, NumDims> ElementwiseTestHelper(
Sadik Armagan483c8112021-06-01 09:24:52 +0100112 armnn::IWorkloadFactory& workloadFactory,
113 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
114 const unsigned int shape0[NumDims],
115 std::vector<T> values0,
116 float quantScale0,
117 int quantOffset0,
118 const unsigned int shape1[NumDims],
119 std::vector<T> values1,
120 float quantScale1,
121 int quantOffset1,
122 const unsigned int outShape[NumDims],
123 std::vector<T> outValues,
124 const armnn::ITensorHandleFactory& tensorHandleFactory,
125 float outQuantScale,
126 int outQuantOffset) {
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100127 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnType, ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100128 workloadFactory,
129 memoryManager,
130 shape0,
131 values0,
132 quantScale0,
133 quantOffset0,
134 shape1,
135 values1,
136 quantScale1,
137 quantOffset1,
138 outShape,
139 outValues,
140 tensorHandleFactory,
141 outQuantScale,
142 outQuantOffset);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100143}
144
Sadik Armagan483c8112021-06-01 09:24:52 +0100145template<std::size_t NumDims,
146 typename Descriptor,
147 armnn::DataType ArmnnTypeInput,
148 armnn::DataType ArmnnTypeOutput,
149 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
150 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100151LayerTestResult<TOutput, NumDims> ElementwiseTestHelper(
Sadik Armagan483c8112021-06-01 09:24:52 +0100152 armnn::IWorkloadFactory& workloadFactory,
153 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
154 const unsigned int shape0[NumDims],
155 std::vector<TInput> values0,
156 const unsigned int shape1[NumDims],
157 std::vector<TInput> values1,
158 const unsigned int outShape[NumDims],
159 std::vector<TOutput> outValues,
160 const armnn::ITensorHandleFactory& tensorHandleFactory,
161 float quantScale = 1.0f,
162 int quantOffset = 0) {
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100163 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnTypeInput, ArmnnTypeOutput>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100164 workloadFactory,
165 memoryManager,
166 shape0,
167 values0,
168 quantScale,
169 quantOffset,
170 shape1,
171 values1,
172 quantScale,
173 quantOffset,
174 outShape,
175 outValues,
176 tensorHandleFactory,
177 quantScale,
178 quantOffset);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100179}
180
Sadik Armagan483c8112021-06-01 09:24:52 +0100181template<std::size_t NumDims,
182 typename Descriptor,
183 armnn::DataType ArmnnType,
184 typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100185LayerTestResult<T, NumDims> ElementwiseTestHelper(
Sadik Armagan483c8112021-06-01 09:24:52 +0100186 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 const armnn::ITensorHandleFactory& tensorHandleFactory,
195 float quantScale = 1.0f,
196 int quantOffset = 0) {
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100197 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnType, ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100198 workloadFactory,
199 memoryManager,
200 shape0,
201 values0,
202 shape1,
203 values1,
204 outShape,
205 outValues,
206 tensorHandleFactory,
207 quantScale,
208 quantOffset);
josh minor4a3c6102020-01-06 16:40:46 -0600209}