blob: 9688ce49f218e8b9f46061896b0355c9556d2a7c [file] [log] [blame]
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "SoftmaxTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01009#include <ResolveType.hpp>
10
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010011
James Conroy1f58f032021-04-27 17:13:27 +010012#include <backendsCommon/TensorHandle.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010013
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010014#include <backendsCommon/test/TensorCopyUtils.hpp>
15#include <backendsCommon/test/WorkloadTestUtils.hpp>
16
17#include <test/TensorHelpers.hpp>
18
19#include <algorithm>
20
21namespace
22{
23
24struct Simple3dSoftmaxOutputData
25{
26 const std::vector<float> outputData =
27 {
28 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
29 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f
30 };
31
32 const armnn::TensorShape inputShape{ 1, 8, 1 };
33
34 const std::vector<float> inputData =
35 {
36 0.0f, 1.0f, 0.0f, 0.0f,
37 0.5f, 0.0f, 0.0f, 0.0f,
38 };
39};
40
41struct Simple4dSoftmaxData
42{
43 const armnn::TensorShape inputShape{ 1, 8, 1, 1 };
44
45 const std::vector<float> outputData =
46 {
47 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
48 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f
49 };
50
51 const std::vector<float> inputData =
52 {
53 0.0f, 1.0f, 0.0f, 0.0f,
54 0.5f, 0.0f, 0.0f, 0.0f
55 };
56};
57
58template<armnn::DataType ArmnnType, std::size_t n, typename T = armnn::ResolveType<ArmnnType>>
59LayerTestResult<T, n> SimpleSoftmaxBaseTestImpl(
60 armnn::IWorkloadFactory& workloadFactory,
61 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +010062 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010063 float beta,
64 const armnn::TensorShape& inputShape,
65 const std::vector<float>& outputData,
66 const std::vector<float>& inputData,
David Monahan9b14bfc2020-06-30 15:57:56 +010067 int axis = -1)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010068{
69 using std::exp;
70
71 const float qScale = 1.f / 256.f;
72 const int qOffset = 0;
73
74 armnn::TensorInfo inputTensorInfo;
75 armnn::TensorInfo outputTensorInfo;
76
77 inputTensorInfo = armnn::TensorInfo(inputShape, ArmnnType);
78 inputTensorInfo.SetQuantizationScale(qScale);
79 inputTensorInfo.SetQuantizationOffset(qOffset);
80
81 outputTensorInfo = armnn::TensorInfo(inputShape, ArmnnType);
82 outputTensorInfo.SetQuantizationScale(qScale);
83 outputTensorInfo.SetQuantizationOffset(qOffset);
84
85 LayerTestResult<T, n> ret(outputTensorInfo);
86
87 // Each row is independently softmax'd.
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010088 auto input = MakeTensor<T, n>(inputTensorInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010089
Sadik Armagan89de3b42020-08-28 10:38:53 +010090 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
91 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010092
93 armnn::SoftmaxQueueDescriptor data;
94 data.m_Parameters.m_Beta = beta;
95 data.m_Parameters.m_Axis = axis;
96
97 armnn::WorkloadInfo info;
98 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
99 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
100
101 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSoftmax(data, info);
102
103 inputHandle->Allocate();
104 outputHandle->Allocate();
105 CopyDataToITensorHandle(inputHandle.get(), input.origin());
106
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100107 ARMNN_ASSERT(workload);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100108
109 ExecuteWorkload(*workload, memoryManager);
110
111 CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
112
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100113 std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(outputData, qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100114 ret.outputExpected = MakeTensor<T, n>(outputTensorInfo, expectedOutput);
115
116 return ret;
117}
118
119template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
120LayerTestResult<T, 2> SimpleSoftmaxTestImpl(
121 armnn::IWorkloadFactory& workloadFactory,
122 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100123 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100124 float beta)
125{
126 using std::exp;
127 const armnn::TensorShape inputShape{ 2, 4 };
128
129 float x0[4] = { exp((0.f - 1.0f) * beta), exp((1.0f - 1.0f) * beta),
130 exp((0.0f - 1.0f) * beta), exp((0.0f - 1.0f) * beta) };
131 float sum0 = x0[0] + x0[1] + x0[2] + x0[3];
132 float x1[4] = { exp((0.5f - 0.5f) * beta), exp((0.0f - 0.5f) * beta),
133 exp((0.0f - 0.5f) * beta), exp((0.0f - 0.5f) * beta) };
134 float sum1 = x1[0] + x1[1] + x1[2] + x1[3];
135
136 const std::vector<float> outputData = { x0[0] / sum0, x0[1] / sum0, x0[2] / sum0, x0[3] / sum0,
137 x1[0] / sum1, x1[1] / sum1, x1[2] / sum1, x1[3] / sum1 };
138
139 const std::vector<float> inputData =
140 {
141 0.f, 1.f, 0.f, 0.f,
142 .5f, 0.f, 0.f, 0.f,
143 };
144
Sadik Armagan56785c72020-08-27 12:57:20 +0100145 return SimpleSoftmaxBaseTestImpl<ArmnnType, 2>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100146 inputShape, outputData, inputData);
147}
148
149template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
150LayerTestResult<T, 2> SimpleSoftmaxTestImpl(
151 armnn::IWorkloadFactory& workloadFactory,
152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100153 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100154 float beta,
155 int axis)
156{
157 armnn::TensorShape inputShape;
158 std::vector<float> inputData;
159 std::vector<float> outputData;
160 switch (axis)
161 {
162 case -2:
163 case 0:
164 {
165 inputShape = {5, 2};
166
167 inputData =
168 {
169 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
170 };
171
172 outputData =
173 {
174 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
175 0.087144312427294f,
176 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
177 7.246299848982885e-08f
178 };
179 break;
180 }
181 case -1:
182 case 1:
183 {
184 inputShape = {2, 5};
185
186 inputData =
187 {
188 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
189 };
190
191 outputData =
192 {
193 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
194 7.246299848982885e-08f,
195 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
196 7.246299848982885e-08f
197 };
198 break;
199 }
200 }
Sadik Armagan56785c72020-08-27 12:57:20 +0100201 return SimpleSoftmaxBaseTestImpl<ArmnnType, 2>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100202 inputShape, outputData, inputData, axis);
203}
204
205template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
206LayerTestResult<T, 3> Simple3dSoftmaxTestImpl(
207 armnn::IWorkloadFactory& workloadFactory,
208 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100209 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100210 float beta,
211 const armnn::TensorShape& inputShape,
212 const std::vector<float>& outputData,
213 const std::vector<float>& inputData,
214 int axis = 1)
215{
Sadik Armagan56785c72020-08-27 12:57:20 +0100216 return SimpleSoftmaxBaseTestImpl<ArmnnType, 3>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100217 inputShape, outputData, inputData, axis);
218}
219
220template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
221LayerTestResult<T, 4> Simple4dSoftmaxTestImpl(
222 armnn::IWorkloadFactory& workloadFactory,
223 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100224 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100225 float beta,
226 const armnn::TensorShape& inputShape,
227 const std::vector<float>& outputData,
228 const std::vector<float>& inputData,
229 int axis = 1)
230{
231
Sadik Armagan56785c72020-08-27 12:57:20 +0100232 return SimpleSoftmaxBaseTestImpl<ArmnnType, 4>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100233 inputShape, outputData, inputData, axis);
234}
235
236template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
237LayerTestResult<T, 2> CompareSoftmaxTestImpl(
238 armnn::IWorkloadFactory& workloadFactory,
239 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
240 armnn::IWorkloadFactory& refWorkloadFactory,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100241 const armnn::ITensorHandleFactory& tensorHandleFactory,
242 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100243 float beta)
244{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100245 const int batchSize = 20;
246 const int channels = 30;
247
248 armnn::TensorInfo inputTensorInfo;
249 armnn::TensorInfo outputTensorInfo;
250
251 unsigned int inputShape[] = { batchSize, channels };
252
253 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
254 outputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
255 float qScale = 1.f / 256.f;
256 int qOffset = 0;
257 inputTensorInfo.SetQuantizationScale(qScale);
258 inputTensorInfo.SetQuantizationOffset(qOffset);
259 outputTensorInfo.SetQuantizationScale(qScale);
260 outputTensorInfo.SetQuantizationOffset(qOffset);
261
262
263 LayerTestResult<T, 2> ret(outputTensorInfo);
264 auto input = MakeRandomTensor<T, 2>(inputTensorInfo, 0xF00D, 0.0f, 1.0f);
265
Sadik Armagan89de3b42020-08-28 10:38:53 +0100266 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
267 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100268
269 armnn::SoftmaxQueueDescriptor data;
270 data.m_Parameters.m_Beta = beta;
271
272 armnn::WorkloadInfo info;
273 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
274 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
275
Sadik Armagan56785c72020-08-27 12:57:20 +0100276 std::unique_ptr<armnn::ITensorHandle> outputHandleRef =
Sadik Armagan89de3b42020-08-28 10:38:53 +0100277 refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Sadik Armagan56785c72020-08-27 12:57:20 +0100278 std::unique_ptr<armnn::ITensorHandle> inputHandleRef =
Sadik Armagan89de3b42020-08-28 10:38:53 +0100279 refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100280
281 armnn::SoftmaxQueueDescriptor refData = data;
282 armnn::WorkloadInfo refInfo = info;
283 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
284 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
285
286 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSoftmax(data, info);
287 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateSoftmax(refData, refInfo);
288
289 outputHandleRef->Allocate();
290 inputHandleRef->Allocate();
291
292 inputHandle->Allocate();
293 outputHandle->Allocate();
294
295 CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
296 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0]);
297
298 ExecuteWorkload(*workload, memoryManager);
299
300 workloadRef->Execute();
301
302 CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
303 CopyDataFromITensorHandle(&ret.outputExpected[0][0], outputHandleRef.get());
304
305 return ret;
306}
307
308} // anonymous namespace
309
310LayerTestResult<float,2> SimpleSoftmaxTest(
311 armnn::IWorkloadFactory& workloadFactory,
312 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100313 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100314 float beta)
315{
Sadik Armagan56785c72020-08-27 12:57:20 +0100316 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, beta);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100317}
318
319LayerTestResult<float,2> SimpleAxisSoftmaxTest(
320 armnn::IWorkloadFactory& workloadFactory,
321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100322 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100323 float beta,
324 int axis)
325{
Sadik Armagan56785c72020-08-27 12:57:20 +0100326 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager,
327 tensorHandleFactory, beta, axis);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100328}
329
330LayerTestResult<float,3> Simple3dSoftmaxTest(
331 armnn::IWorkloadFactory& workloadFactory,
332 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100333 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100334 float beta)
335{
336 Simple3dSoftmaxOutputData data;
Sadik Armagan56785c72020-08-27 12:57:20 +0100337 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100338 data.inputShape, data.outputData, data.inputData);
339}
340
341LayerTestResult<float,3> Simple3dAxisSoftmaxTest(
342 armnn::IWorkloadFactory& workloadFactory,
343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100344 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100345 float beta,
346 int axis)
347{
348 armnn::TensorShape inputShape;
349 std::vector<float> inputData;
350 std::vector<float> outputData;
351 switch (axis)
352 {
353 case -3:
354 case 0:
355 {
356 inputShape = {5, 2, 2};
357
358 inputData =
359 {
360 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
361
362 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
363 };
364
365 outputData =
366 {
367 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
368 0.236882800924671f,
369 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
370 0.087144312427294f,
371
372 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
373 0.032058600957022f,
374 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
375 7.246299848982885e-08f
376 };
377 break;
378 }
379 case -2:
380 case 1:
381 {
382 inputShape = {2, 5, 2};
383
384 inputData =
385 {
386 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
387
388 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
389 };
390
391 outputData =
392 {
393 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
394 0.087144312427294f,
395 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
396 7.246299848982885e-08f,
397
398 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
399 0.087144312427294f,
400 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
401 7.246299848982885e-08f
402 };
403 break;
404 }
405 case -1:
406 case 2:
407 {
408 inputShape = {2, 2, 5};
409
410 inputData =
411 {
412 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
413 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
414 };
415
416 outputData =
417 {
418 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
419 7.246299848982885e-08f,
420 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
421 7.246299848982885e-08f,
422
423 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
424 7.246299848982885e-08f,
425 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
426 7.246299848982885e-08f
427 };
428 break;
429 }
430 }
431
Sadik Armagan56785c72020-08-27 12:57:20 +0100432 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100433 inputShape, outputData, inputData, axis);
434}
435
436LayerTestResult<float,4> Simple4dSoftmaxTest(
437 armnn::IWorkloadFactory& workloadFactory,
438 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100439 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100440 float beta)
441{
442 Simple4dSoftmaxData data;
Sadik Armagan56785c72020-08-27 12:57:20 +0100443 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory,
444 beta, data.inputShape, data.outputData, data.inputData);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100445}
446
447LayerTestResult<float,4> Simple4dAxisSoftmaxTest(
448 armnn::IWorkloadFactory& workloadFactory,
449 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100450 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100451 float beta,
452 int axis)
453{
454 armnn::TensorShape inputShape;
455 std::vector<float> inputData;
456 std::vector<float> outputData;
457 switch (axis)
458 {
459 case -4:
460 case 0:
461 {
462 inputShape = {5, 2, 2, 2};
463
464 inputData =
465 {
466 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f,
467 16.0f, -2.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f, 15.0f, -3.0f,
468 15.0f, -3.0f, 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 14.0f, -4.0f,
469 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f
470 };
471
472 outputData =
473 {
474 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
475 0.643914213228014f,
476 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.236882800924671f,
477 0.236882800924671f,
478 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.236882800924671f,
479 0.236882800924671f,
480 0.236882800924671f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
481 0.087144312427294f,
482
483 0.087144312427294f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
484 0.032058600957022f,
485 0.032058600957022f, 0.032058600957022f, 0.032058600957022f, 0.032058600957022f,
486 0.032058600957022f,
487 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f,
488 7.246299848982885e-08f,
489 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
490 7.246299848982885e-08f, 7.246299848982885e-08f
491 };
492 break;
493 }
494 case -3:
495 case 1:
496 {
497 inputShape = {2, 5, 2, 2};
498
499 inputData =
500 {
501 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
502 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f,
503 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
504 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
505 };
506
507 outputData =
508 {
509 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
510 0.236882800924671f,
511 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
512 0.087144312427294f,
513 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
514 0.032058600957022f,
515 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
516 7.246299848982885e-08f,
517
518
519 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
520 0.236882800924671f,
521 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
522 0.087144312427294f,
523 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
524 0.032058600957022f,
525 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
526 7.246299848982885e-08f
527 };
528 break;
529 }
530 case -2:
531 case 2:
532 {
533 inputShape = {2, 2, 5, 2};
534
535 inputData =
536 {
537 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
538 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
539 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
540 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
541 };
542
543 outputData =
544 {
545 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
546 0.087144312427294f,
547 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
548 7.246299848982885e-08f,
549 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
550 0.087144312427294f,
551 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
552 7.246299848982885e-08f,
553
554 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
555 0.087144312427294f,
556 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
557 7.246299848982885e-08f,
558 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
559 0.087144312427294f,
560 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
561 7.246299848982885e-08f
562 };
563 break;
564 }
565 case -1:
566 case 3:
567 {
568 inputShape = {2, 2, 2, 5};
569
570 inputData =
571 {
572 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
573 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
574 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
575 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
576 };
577
578 outputData =
579 {
580 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
581 7.246299848982885e-08f,
582 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
583 7.246299848982885e-08f,
584 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
585 7.246299848982885e-08f,
586 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
587 7.246299848982885e-08f,
588
589 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
590 7.246299848982885e-08f,
591 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
592 7.246299848982885e-08f,
593 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
594 7.246299848982885e-08f,
595 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
596 7.246299848982885e-08f
597 };
598 break;
599 }
600 }
601
602 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(
603 workloadFactory,
604 memoryManager,
Sadik Armagan56785c72020-08-27 12:57:20 +0100605 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100606 beta,
607 inputShape,
608 outputData,
609 inputData,
610 axis);
611}
612
613LayerTestResult<uint8_t,2> SimpleSoftmaxUint8Test(
614 armnn::IWorkloadFactory& workloadFactory,
615 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100616 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100617 float beta)
618{
Sadik Armagan56785c72020-08-27 12:57:20 +0100619 return SimpleSoftmaxTestImpl<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, beta);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100620}
621
622LayerTestResult<uint8_t,3> Simple3dSoftmaxUint8Test(
623 armnn::IWorkloadFactory& workloadFactory,
624 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100625 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100626 float beta)
627{
628 Simple3dSoftmaxOutputData data;
Derek Lambertif90c56d2020-01-10 17:14:08 +0000629 return Simple3dSoftmaxTestImpl<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100630 workloadFactory,
631 memoryManager,
Sadik Armagan56785c72020-08-27 12:57:20 +0100632 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100633 beta,
634 data.inputShape,
635 data.outputData,
636 data.inputData);
637}
638
639LayerTestResult<uint8_t,4> Simple4dSoftmaxUint8Test(
640 armnn::IWorkloadFactory& workloadFactory,
641 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100642 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100643 float beta)
644{
645 Simple4dSoftmaxData data;
646
Sadik Armagan56785c72020-08-27 12:57:20 +0100647 return Simple4dSoftmaxTestImpl<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100648 data.inputShape, data.outputData, data.inputData);
649}
650
Matthew Jackson9bff1442019-09-12 09:08:23 +0100651LayerTestResult<armnn::Half,2> SimpleSoftmaxFloat16Test(
652 armnn::IWorkloadFactory& workloadFactory,
653 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100654 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100655 float beta)
656{
Sadik Armagan56785c72020-08-27 12:57:20 +0100657 return SimpleSoftmaxTestImpl<armnn::DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory, beta);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100658}
659
660LayerTestResult<armnn::Half,3> Simple3dSoftmaxFloat16Test(
661 armnn::IWorkloadFactory& workloadFactory,
662 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100663 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100664 float beta)
665{
666 Simple3dSoftmaxOutputData data;
Sadik Armagan56785c72020-08-27 12:57:20 +0100667 return Simple3dSoftmaxTestImpl<armnn::DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100668 data.inputShape, data.outputData, data.inputData);
669}
670
671LayerTestResult<armnn::Half,4> Simple4dSoftmaxFloat16Test(
672 armnn::IWorkloadFactory& workloadFactory,
673 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100674 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100675 float beta)
676{
677 Simple4dSoftmaxData data;
Sadik Armagan56785c72020-08-27 12:57:20 +0100678 return Simple4dSoftmaxTestImpl<armnn::DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100679 data.inputShape, data.outputData, data.inputData);
680}
681
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100682LayerTestResult<int16_t,2> SimpleSoftmaxUint16Test(
683 armnn::IWorkloadFactory& workloadFactory,
684 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100685 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100686 float beta)
687{
Sadik Armagan56785c72020-08-27 12:57:20 +0100688 return SimpleSoftmaxTestImpl<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, beta);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100689}
690
691LayerTestResult<int16_t,3> Simple3dSoftmaxUint16Test(
692 armnn::IWorkloadFactory& workloadFactory,
693 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100694 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100695 float beta)
696{
697 Simple3dSoftmaxOutputData data;
Sadik Armagan56785c72020-08-27 12:57:20 +0100698 return Simple3dSoftmaxTestImpl<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100699 data.inputShape, data.outputData, data.inputData);
700}
701
702LayerTestResult<int16_t,4> Simple4dSoftmaxUint16Test(
703 armnn::IWorkloadFactory& workloadFactory,
704 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100705 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100706 float beta)
707{
708 Simple4dSoftmaxData data;
709
Sadik Armagan56785c72020-08-27 12:57:20 +0100710 return Simple4dSoftmaxTestImpl<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, beta,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100711 data.inputShape, data.outputData, data.inputData);
712}
713
714LayerTestResult<float,2> CompareSoftmaxTest(
715 armnn::IWorkloadFactory& workloadFactory,
716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
717 armnn::IWorkloadFactory& refWorkloadFactory,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100718 const armnn::ITensorHandleFactory& tensorHandleFactory,
719 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100720 float beta)
721{
722 return CompareSoftmaxTestImpl<armnn::DataType::Float32>(
Sadik Armagan56785c72020-08-27 12:57:20 +0100723 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, beta);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100724}
725
726LayerTestResult<uint8_t,2> CompareSoftmaxUint8Test(
727 armnn::IWorkloadFactory& workloadFactory,
728 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
729 armnn::IWorkloadFactory& refWorkloadFactory,
Sadik Armagan89de3b42020-08-28 10:38:53 +0100730 const armnn::ITensorHandleFactory& tensorHandleFactory,
731 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100732 float beta)
733{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000734 return CompareSoftmaxTestImpl<armnn::DataType::QAsymmU8>(
Sadik Armagan56785c72020-08-27 12:57:20 +0100735 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, beta);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100736}