blob: b59362032606d6154800a9f52502e9b3a13defbb [file] [log] [blame]
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01003// SPDX-License-Identifier: MIT
4//
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "QuantizeTestImpl.hpp"
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01007
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01008#include <ResolveType.hpp>
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01009
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010010
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000011#include <armnn/backends/IBackendInternal.hpp>
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010012#include <backendsCommon/WorkloadFactory.hpp>
13
Sadik Armagana097d2a2021-11-24 15:47:28 +000014#include <armnnTestUtils/TensorCopyUtils.hpp>
15#include <WorkloadTestUtils.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010016
Sadik Armagana097d2a2021-11-24 15:47:28 +000017#include <TensorHelpers.hpp>
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010018
19namespace
20{
21
22template<typename T, std::size_t Dim>
23LayerTestResult<T, Dim> QuantizeTestImpl(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williamsec36d3e2020-08-28 13:17:05 +010026 const armnn::ITensorHandleFactory& tensorHandleFactory,
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010027 const armnn::TensorInfo& inputTensorInfo,
28 const armnn::TensorInfo& outputTensorInfo,
29 const std::vector<float>& inputData,
30 const std::vector<T>& expectedOutputData,
31 armnn::QuantizeQueueDescriptor descriptor)
32{
Jan Eilers8eb25602020-03-09 12:13:48 +000033 IgnoreUnused(memoryManager);
Sadik Armagan483c8112021-06-01 09:24:52 +010034 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010035
Finn Williamsec36d3e2020-08-28 13:17:05 +010036 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
37 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010038
39 armnn::WorkloadInfo info;
40 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
41 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
42
43 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateQuantize(descriptor, info);
44
45 inputHandle->Allocate();
46 outputHandle->Allocate();
47
Sadik Armagan483c8112021-06-01 09:24:52 +010048 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010049
50 ExecuteWorkload(*workload, memoryManager);
51
Sadik Armagan483c8112021-06-01 09:24:52 +010052 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010053
Sadik Armagan483c8112021-06-01 09:24:52 +010054 return LayerTestResult<T, Dim>(actualOutput,
55 expectedOutputData,
56 outputHandle->GetShape(),
57 outputTensorInfo.GetShape());
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010058}
59
60template <armnn::DataType ArmnnOutputType, typename T = armnn::ResolveType<ArmnnOutputType>>
61LayerTestResult<T, 4> QuantizeSimpleTest(
62 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +010063 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
64 const armnn::ITensorHandleFactory& tensorHandleFactory)
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010065{
66 armnn::QuantizeQueueDescriptor desc;
67
68 const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32);
69 const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, ArmnnOutputType, 0.5f, 1);
70
71 std::vector<float> inputData = std::vector<float>(
72 {
73 1.0f, 2.0f, 3.0f,
74 4.0f, 5.0f, 6.0f,
75 7.0f, 8.0f, 9.0f,
76 10.0f, 11.0f, 12.0f,
77 });
78
79 std::vector<T> expectedOutputData = std::vector<T>(
80 {
81 3, 5, 7,
82 9, 11, 13,
83 15, 17, 19,
84 21, 23, 25,
85 });
86
87 return QuantizeTestImpl<T, 4>(workloadFactory,
88 memoryManager,
Finn Williamsec36d3e2020-08-28 13:17:05 +010089 tensorHandleFactory,
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010090 inputTensorInfo,
91 outputTensorInfo,
92 inputData,
93 expectedOutputData,
94 desc);
95}
96
97template <armnn::DataType ArmnnOutputType, typename T = armnn::ResolveType<ArmnnOutputType>>
98LayerTestResult<T, 4> QuantizeClampTest(
99 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100100 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
101 const armnn::ITensorHandleFactory& tensorHandleFactory)
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +0100102{
103 armnn::QuantizeQueueDescriptor desc;
104
105 const armnn::TensorInfo inputTensorInfo({1, 1, 2, 1}, armnn::DataType::Float32);
106 const armnn::TensorInfo outputTensorInfo({1, 1, 2, 1}, ArmnnOutputType, 0.0001f, 0);
107
108 const T max = std::numeric_limits<T>::max();
109 const T min = std::numeric_limits<T>::lowest();
110
111 std::vector<float> inputData = std::vector<float>(
112 {
113 -100.0f, 100.0f
114 });
115
116 std::vector<T> expectedOutputData = std::vector<T>(
117 {
118 min, max
119 });
120
121 return QuantizeTestImpl<T, 4>(workloadFactory,
122 memoryManager,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100123 tensorHandleFactory,
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +0100124 inputTensorInfo,
125 outputTensorInfo,
126 inputData,
127 expectedOutputData,
128 desc);
129}
130
131} // anonymous namespace
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100132
133LayerTestResult<uint8_t, 4> QuantizeSimpleUint8Test(
134 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100135 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
136 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100137{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100138 return QuantizeSimpleTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100139}
140
141LayerTestResult<uint8_t, 4> QuantizeClampUint8Test(
142 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100143 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
144 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100145{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100146 return QuantizeClampTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100147}
148
Ryan OShea9add1202020-02-07 10:06:33 +0000149LayerTestResult<int8_t, 4> QuantizeClampAsymmInt8Test(
150 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100151 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
152 const armnn::ITensorHandleFactory& tensorHandleFactory)
Ryan OShea9add1202020-02-07 10:06:33 +0000153{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100154 return QuantizeClampTest<armnn::DataType::QAsymmS8>(workloadFactory, memoryManager, tensorHandleFactory);
Ryan OShea9add1202020-02-07 10:06:33 +0000155}
156
Finn Williamsfd271062019-12-04 14:27:27 +0000157LayerTestResult<int8_t, 4> QuantizeClampInt8Test(
Finn Williamsec36d3e2020-08-28 13:17:05 +0100158 armnn::IWorkloadFactory& workloadFactory,
159 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
160 const armnn::ITensorHandleFactory& tensorHandleFactory)
Finn Williamsfd271062019-12-04 14:27:27 +0000161{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100162 return QuantizeClampTest<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory);
Finn Williamsfd271062019-12-04 14:27:27 +0000163}
164
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100165LayerTestResult<int16_t, 4> QuantizeClampInt16Test(
166 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100167 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
168 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100169{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100170 return QuantizeClampTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100171}