• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "LogSoftmaxTestImpl.hpp"
7 
8 #include <Half.hpp>
9 #include <QuantizeHelper.hpp>
10 #include <ResolveType.hpp>
11 
12 
13 #include <backendsCommon/CpuTensorHandle.hpp>
14 #include <armnn/backends/IBackendInternal.hpp>
15 #include <backendsCommon/WorkloadFactory.hpp>
16 
17 #include <backendsCommon/test/TensorCopyUtils.hpp>
18 #include <backendsCommon/test/WorkloadTestUtils.hpp>
19 
20 #include <test/TensorHelpers.hpp>
21 
22 namespace
23 {
24 
25 template<armnn::DataType ArmnnType,
26          std::size_t NumDims,
27          typename T = armnn::ResolveType<ArmnnType>>
LogSoftmaxTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::TensorInfo & inputInfo,const armnn::TensorInfo & outputInfo,const std::vector<float> & inputValues,const std::vector<float> & expectedOutputValues,armnn::LogSoftmaxQueueDescriptor descriptor,float qScale=1.0f,int32_t qOffset=0)28 LayerTestResult<T, NumDims> LogSoftmaxTestImpl(
29     armnn::IWorkloadFactory& workloadFactory,
30     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
31     const armnn::ITensorHandleFactory& tensorHandleFactory,
32     const armnn::TensorInfo& inputInfo,
33     const armnn::TensorInfo& outputInfo,
34     const std::vector<float>& inputValues,
35     const std::vector<float>& expectedOutputValues,
36     armnn::LogSoftmaxQueueDescriptor descriptor,
37     float qScale = 1.0f,
38     int32_t qOffset = 0)
39 {
40     IgnoreUnused(memoryManager);
41     LayerTestResult<T, NumDims> result(outputInfo);
42     result.outputExpected =
43         MakeTensor<T, NumDims>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputValues, qScale, qOffset));
44 
45     std::unique_ptr<armnn::ITensorHandle> inputHandle  = tensorHandleFactory.CreateTensorHandle(inputInfo);
46     std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
47 
48     armnn::WorkloadInfo info;
49 
50     AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
51     AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
52 
53     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateLogSoftmax(descriptor, info);
54 
55     inputHandle->Allocate();
56     outputHandle->Allocate();
57 
58     auto inputTensor = MakeTensor<T, NumDims>(inputInfo, armnnUtils::QuantizedVector<T>(inputValues, qScale, qOffset));
59     CopyDataToITensorHandle(inputHandle.get(), inputTensor.origin());
60 
61     ExecuteWorkload(*workload, memoryManager);
62 
63     CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
64 
65     return result;
66 }
67 
68 } // anonymous namespace
69 
70 template<armnn::DataType ArmnnType, typename T>
LogSoftmaxTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)71 LayerTestResult<T, 4> LogSoftmaxTest1(
72     armnn::IWorkloadFactory& workloadFactory,
73     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
74     const armnn::ITensorHandleFactory& tensorHandleFactory)
75 {
76     const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
77 
78     armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
79     armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
80 
81     std::vector<float> inputValues
82     {
83         0.f, -6.f,  2.f, 4.f,
84         3.f, -2.f, 10.f, 1.f
85     };
86 
87     std::vector<float> expectedOutputValues
88     {
89         -4.14297f, -10.14297f, -2.14297f, -0.14297f,
90         -7.00104f, -12.00104f, -0.00105f, -9.00104f
91     };
92 
93     armnn::LogSoftmaxQueueDescriptor descriptor;
94     descriptor.m_Parameters.m_Beta = 1.0f; // default beta
95     descriptor.m_Parameters.m_Axis = -1;   // default axis
96 
97     return LogSoftmaxTestImpl<ArmnnType, 4>(
98         workloadFactory,
99         memoryManager,
100         tensorHandleFactory,
101         inputTensorInfo,
102         outputTensorInfo,
103         inputValues,
104         expectedOutputValues,
105         descriptor);
106 }
107 
108 template<armnn::DataType ArmnnType, typename T>
LogSoftmaxTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)109 LayerTestResult<T, 4> LogSoftmaxTest2(
110     armnn::IWorkloadFactory& workloadFactory,
111     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
112     const armnn::ITensorHandleFactory& tensorHandleFactory)
113 {
114     const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
115 
116     armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
117     armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
118 
119     std::vector<float> inputValues
120     {
121         0.f, -6.f,  2.f, 4.f,
122         3.f, -2.f, 10.f, 1.f
123     };
124 
125     std::vector<float> expectedOutputValues
126     {
127         -4.14297f, -10.14297f, -2.14297f, -0.14297f,
128         -7.00104f, -12.00104f, -0.00105f, -9.00104f
129     };
130 
131     armnn::LogSoftmaxQueueDescriptor descriptor;
132     descriptor.m_Parameters.m_Beta = 1.0f; // default beta
133     descriptor.m_Parameters.m_Axis = 3;    // positive axis
134 
135     return LogSoftmaxTestImpl<ArmnnType, 4>(
136         workloadFactory,
137         memoryManager,
138         tensorHandleFactory,
139         inputTensorInfo,
140         outputTensorInfo,
141         inputValues,
142         expectedOutputValues,
143         descriptor);
144 }
145 
146 template<armnn::DataType ArmnnType, typename T>
LogSoftmaxTest3(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)147 LayerTestResult<T, 4> LogSoftmaxTest3(
148     armnn::IWorkloadFactory& workloadFactory,
149     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
150     const armnn::ITensorHandleFactory& tensorHandleFactory)
151 {
152     const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
153 
154     armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
155     armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
156 
157     std::vector<float> inputValues
158     {
159         0.0f, -0.6f, 0.2f, 0.4f,
160         0.3f, -0.2f, 1.0f, 0.1f
161     };
162 
163     std::vector<float> expectedOutputValues
164     {
165         -4.14297f, -10.14297f, -2.14297f, -0.14297f,
166         -7.00104f, -12.00104f, -0.00105f, -9.00104f
167     };
168 
169     armnn::LogSoftmaxQueueDescriptor descriptor;
170     descriptor.m_Parameters.m_Beta = 10.0f; // non-default beta
171     descriptor.m_Parameters.m_Axis = 3;     // positive axis
172 
173     return LogSoftmaxTestImpl<ArmnnType, 4>(
174         workloadFactory,
175         memoryManager,
176         tensorHandleFactory,
177         inputTensorInfo,
178         outputTensorInfo,
179         inputValues,
180         expectedOutputValues,
181         descriptor);
182 }
183 
184 template<armnn::DataType ArmnnType, typename T>
LogSoftmaxTest4(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)185 LayerTestResult<T, 4> LogSoftmaxTest4(
186     armnn::IWorkloadFactory& workloadFactory,
187     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
188     const armnn::ITensorHandleFactory& tensorHandleFactory)
189 {
190     const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
191 
192     armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
193     armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
194 
195     std::vector<float> inputValues
196     {
197         0.f, -6.f,  2.f, 4.f,
198         3.f, -2.f, 10.f, 1.f
199     };
200 
201     std::vector<float> expectedOutputValues
202     {
203         -3.048587f, -4.018149f, -8.000336f, -0.048587f,
204         -0.048587f, -0.018149f, -0.000335f, -3.048587f
205     };
206 
207     armnn::LogSoftmaxQueueDescriptor descriptor;
208     descriptor.m_Parameters.m_Beta = 1.0f; // default beta
209     descriptor.m_Parameters.m_Axis = -2;   // negative axis
210 
211     return LogSoftmaxTestImpl<ArmnnType, 4>(
212         workloadFactory,
213         memoryManager,
214         tensorHandleFactory,
215         inputTensorInfo,
216         outputTensorInfo,
217         inputValues,
218         expectedOutputValues,
219         descriptor);
220 }
221 
222 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
223 LogSoftmaxTest1<armnn::DataType::Float32>(
224     armnn::IWorkloadFactory& workloadFactory,
225     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
226     const armnn::ITensorHandleFactory& tensorHandleFactory);
227 
228 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
229 LogSoftmaxTest2<armnn::DataType::Float32>(
230     armnn::IWorkloadFactory& workloadFactory,
231     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
232     const armnn::ITensorHandleFactory& tensorHandleFactory);
233 
234 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
235 LogSoftmaxTest3<armnn::DataType::Float32>(
236     armnn::IWorkloadFactory& workloadFactory,
237     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
238     const armnn::ITensorHandleFactory& tensorHandleFactory);
239 
240 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
241 LogSoftmaxTest4<armnn::DataType::Float32>(
242     armnn::IWorkloadFactory& workloadFactory,
243     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
244     const armnn::ITensorHandleFactory& tensorHandleFactory);
245 
246 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
247 LogSoftmaxTest1<armnn::DataType::Float16>(
248     armnn::IWorkloadFactory& workloadFactory,
249     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
250     const armnn::ITensorHandleFactory& tensorHandleFactory);
251 
252 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
253 LogSoftmaxTest2<armnn::DataType::Float16>(
254     armnn::IWorkloadFactory& workloadFactory,
255     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
256     const armnn::ITensorHandleFactory& tensorHandleFactory);
257 
258 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
259 LogSoftmaxTest3<armnn::DataType::Float16>(
260     armnn::IWorkloadFactory& workloadFactory,
261     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
262     const armnn::ITensorHandleFactory& tensorHandleFactory);
263 
264 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
265 LogSoftmaxTest4<armnn::DataType::Float16>(
266     armnn::IWorkloadFactory& workloadFactory,
267     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
268     const armnn::ITensorHandleFactory& tensorHandleFactory);
269