1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #pragma once
7
8 #include <armnnTestUtils/LayerTestResult.hpp>
9
10
11 #include <ResolveType.hpp>
12
13 #include <armnn/backends/IBackendInternal.hpp>
14 #include <armnn/backends/Workload.hpp>
15 #include <armnn/backends/WorkloadData.hpp>
16 #include <armnn/backends/WorkloadFactory.hpp>
17
18 #include <DataTypeUtils.hpp>
19 #include <armnnTestUtils/TensorCopyUtils.hpp>
20 #include <armnnTestUtils/WorkloadTestUtils.hpp>
21
22 #include <armnnTestUtils/TensorHelpers.hpp>
23
24 #include <memory>
25
26 template<typename DescriptorType>
CreateWorkload(const armnn::IWorkloadFactory & workloadFactory,const armnn::WorkloadInfo & info,const DescriptorType & descriptor)27 std::unique_ptr<armnn::IWorkload> CreateWorkload(
28 const armnn::IWorkloadFactory& workloadFactory,
29 const armnn::WorkloadInfo& info,
30 const DescriptorType& descriptor) {
31 return CreateWorkload(workloadFactory, info, descriptor);
32 }
33
34 template<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>>
ElementwiseTestHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const unsigned int shape0[NumDims],std::vector<TInput> values0,float quantScale0,int quantOffset0,const unsigned int shape1[NumDims],std::vector<TInput> values1,float quantScale1,int quantOffset1,const unsigned int outShape[NumDims],std::vector<TOutput> outValues,const armnn::ITensorHandleFactory & tensorHandleFactory,float outQuantScale,int outQuantOffset)40 LayerTestResult<TOutput, NumDims> ElementwiseTestHelper(
41 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) {
56 armnn::TensorInfo inputTensorInfo0{NumDims, shape0, ArmnnTypeInput};
57 armnn::TensorInfo inputTensorInfo1{NumDims, shape1, ArmnnTypeInput};
58 armnn::TensorInfo outputTensorInfo{NumDims, outShape, ArmnnTypeOutput};
59
60 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
69 std::vector<TOutput> actualOutput(outputTensorInfo.GetNumElements());
70
71 bool isBoolean = false;
72 if (ArmnnTypeOutput == armnn::DataType::Boolean)
73 {
74 isBoolean = true;
75 }
76
77 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);
80
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
92 CopyDataToITensorHandle(inputHandle0.get(), values0.data());
93 CopyDataToITensorHandle(inputHandle1.get(), values1.data());
94
95 workload->PostAllocationConfigure();
96 ExecuteWorkload(*workload, memoryManager);
97
98 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
99
100 return LayerTestResult<TOutput, NumDims>(actualOutput,
101 outValues,
102 outputHandle->GetShape(),
103 outputTensorInfo.GetShape(),
104 isBoolean);
105 }
106
107 template<std::size_t NumDims,
108 typename Descriptor,
109 armnn::DataType ArmnnType,
110 typename T = armnn::ResolveType<ArmnnType>>
ElementwiseTestHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const unsigned int shape0[NumDims],std::vector<T> values0,float quantScale0,int quantOffset0,const unsigned int shape1[NumDims],std::vector<T> values1,float quantScale1,int quantOffset1,const unsigned int outShape[NumDims],std::vector<T> outValues,const armnn::ITensorHandleFactory & tensorHandleFactory,float outQuantScale,int outQuantOffset)111 LayerTestResult<T, NumDims> ElementwiseTestHelper(
112 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) {
127 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnType, ArmnnType>(
128 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);
143 }
144
145 template<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>>
ElementwiseTestHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const unsigned int shape0[NumDims],std::vector<TInput> values0,const unsigned int shape1[NumDims],std::vector<TInput> values1,const unsigned int outShape[NumDims],std::vector<TOutput> outValues,const armnn::ITensorHandleFactory & tensorHandleFactory,float quantScale=1.0f,int quantOffset=0)151 LayerTestResult<TOutput, NumDims> ElementwiseTestHelper(
152 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) {
163 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnTypeInput, ArmnnTypeOutput>(
164 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);
179 }
180
181 template<std::size_t NumDims,
182 typename Descriptor,
183 armnn::DataType ArmnnType,
184 typename T = armnn::ResolveType<ArmnnType>>
ElementwiseTestHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const unsigned int shape0[NumDims],std::vector<T> values0,const unsigned int shape1[NumDims],std::vector<T> values1,const unsigned int outShape[NumDims],std::vector<T> outValues,const armnn::ITensorHandleFactory & tensorHandleFactory,float quantScale=1.0f,int quantOffset=0)185 LayerTestResult<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 const armnn::ITensorHandleFactory& tensorHandleFactory,
195 float quantScale = 1.0f,
196 int quantOffset = 0) {
197 return ElementwiseTestHelper<NumDims, Descriptor, ArmnnType, ArmnnType>(
198 workloadFactory,
199 memoryManager,
200 shape0,
201 values0,
202 shape1,
203 values1,
204 outShape,
205 outValues,
206 tensorHandleFactory,
207 quantScale,
208 quantOffset);
209 }