• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include "LayerTestResult.hpp"
9 
10 
11 #include <ResolveType.hpp>
12 
13 #include <armnn/backends/IBackendInternal.hpp>
14 #include <backendsCommon/Workload.hpp>
15 #include <backendsCommon/WorkloadData.hpp>
16 #include <backendsCommon/WorkloadFactory.hpp>
17 
18 #include <backendsCommon/test/DataTypeUtils.hpp>
19 #include <backendsCommon/test/TensorCopyUtils.hpp>
20 #include <backendsCommon/test/WorkloadTestUtils.hpp>
21 
22 #include <test/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 {
32     return CreateWorkload(workloadFactory, info, descriptor);
33 }
34 
35 template <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>>
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)41 LayerTestResult<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     const armnn::ITensorHandleFactory& tensorHandleFactory,
55     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 
81     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);
84 
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 
108 template <std::size_t NumDims,
109           typename Descriptor,
110           armnn::DataType ArmnnType,
111           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)112 LayerTestResult<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,
125     const armnn::ITensorHandleFactory& tensorHandleFactory,
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         tensorHandleFactory,
143         outQuantScale,
144         outQuantOffset);
145 }
146 
147 template <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>>
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)153 LayerTestResult<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,
162     const armnn::ITensorHandleFactory& tensorHandleFactory,
163     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,
179         tensorHandleFactory,
180         quantScale,
181         quantOffset);
182 }
183 
184 template <std::size_t NumDims,
185           typename Descriptor,
186           armnn::DataType ArmnnType,
187           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)188 LayerTestResult<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,
197     const armnn::ITensorHandleFactory& tensorHandleFactory,
198     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,
210         tensorHandleFactory,
211         quantScale,
212         quantOffset);
213 }