blob: 6d749de62894a9e7c0f8c734bf7ecb23c88b1400 [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>
Colm Donelan0c479742021-12-10 12:43:54 +000012#include <armnn/backends/WorkloadFactory.hpp>
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010013
Sadik Armagana097d2a2021-11-24 15:47:28 +000014#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000015#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010016
Colm Donelanc42a9872022-02-02 16:35:09 +000017#include <armnnTestUtils/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
Teresa Charlin611c7fb2022-01-07 09:47:29 +000043 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Quantize,
44 descriptor,
45 info);
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010046
47 inputHandle->Allocate();
48 outputHandle->Allocate();
49
Sadik Armagan483c8112021-06-01 09:24:52 +010050 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010051
52 ExecuteWorkload(*workload, memoryManager);
53
Sadik Armagan483c8112021-06-01 09:24:52 +010054 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010055
Sadik Armagan483c8112021-06-01 09:24:52 +010056 return LayerTestResult<T, Dim>(actualOutput,
57 expectedOutputData,
58 outputHandle->GetShape(),
59 outputTensorInfo.GetShape());
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010060}
61
62template <armnn::DataType ArmnnOutputType, typename T = armnn::ResolveType<ArmnnOutputType>>
63LayerTestResult<T, 4> QuantizeSimpleTest(
64 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +010065 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
66 const armnn::ITensorHandleFactory& tensorHandleFactory)
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010067{
68 armnn::QuantizeQueueDescriptor desc;
69
70 const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32);
71 const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, ArmnnOutputType, 0.5f, 1);
72
73 std::vector<float> inputData = std::vector<float>(
74 {
75 1.0f, 2.0f, 3.0f,
76 4.0f, 5.0f, 6.0f,
77 7.0f, 8.0f, 9.0f,
78 10.0f, 11.0f, 12.0f,
79 });
80
81 std::vector<T> expectedOutputData = std::vector<T>(
82 {
83 3, 5, 7,
84 9, 11, 13,
85 15, 17, 19,
86 21, 23, 25,
87 });
88
89 return QuantizeTestImpl<T, 4>(workloadFactory,
90 memoryManager,
Finn Williamsec36d3e2020-08-28 13:17:05 +010091 tensorHandleFactory,
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010092 inputTensorInfo,
93 outputTensorInfo,
94 inputData,
95 expectedOutputData,
96 desc);
97}
98
99template <armnn::DataType ArmnnOutputType, typename T = armnn::ResolveType<ArmnnOutputType>>
100LayerTestResult<T, 4> QuantizeClampTest(
101 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100102 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
103 const armnn::ITensorHandleFactory& tensorHandleFactory)
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +0100104{
105 armnn::QuantizeQueueDescriptor desc;
106
107 const armnn::TensorInfo inputTensorInfo({1, 1, 2, 1}, armnn::DataType::Float32);
108 const armnn::TensorInfo outputTensorInfo({1, 1, 2, 1}, ArmnnOutputType, 0.0001f, 0);
109
110 const T max = std::numeric_limits<T>::max();
111 const T min = std::numeric_limits<T>::lowest();
112
113 std::vector<float> inputData = std::vector<float>(
114 {
115 -100.0f, 100.0f
116 });
117
118 std::vector<T> expectedOutputData = std::vector<T>(
119 {
120 min, max
121 });
122
123 return QuantizeTestImpl<T, 4>(workloadFactory,
124 memoryManager,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100125 tensorHandleFactory,
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +0100126 inputTensorInfo,
127 outputTensorInfo,
128 inputData,
129 expectedOutputData,
130 desc);
131}
132
133} // anonymous namespace
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100134
135LayerTestResult<uint8_t, 4> QuantizeSimpleUint8Test(
136 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100137 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
138 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100139{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100140 return QuantizeSimpleTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100141}
142
143LayerTestResult<uint8_t, 4> QuantizeClampUint8Test(
144 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100145 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
146 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100147{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100148 return QuantizeClampTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100149}
150
Ryan OShea9add1202020-02-07 10:06:33 +0000151LayerTestResult<int8_t, 4> QuantizeClampAsymmInt8Test(
152 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100153 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
154 const armnn::ITensorHandleFactory& tensorHandleFactory)
Ryan OShea9add1202020-02-07 10:06:33 +0000155{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100156 return QuantizeClampTest<armnn::DataType::QAsymmS8>(workloadFactory, memoryManager, tensorHandleFactory);
Ryan OShea9add1202020-02-07 10:06:33 +0000157}
158
Finn Williamsfd271062019-12-04 14:27:27 +0000159LayerTestResult<int8_t, 4> QuantizeClampInt8Test(
Finn Williamsec36d3e2020-08-28 13:17:05 +0100160 armnn::IWorkloadFactory& workloadFactory,
161 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
162 const armnn::ITensorHandleFactory& tensorHandleFactory)
Finn Williamsfd271062019-12-04 14:27:27 +0000163{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100164 return QuantizeClampTest<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory);
Finn Williamsfd271062019-12-04 14:27:27 +0000165}
166
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100167LayerTestResult<int16_t, 4> QuantizeClampInt16Test(
168 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsec36d3e2020-08-28 13:17:05 +0100169 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
170 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100171{
Finn Williamsec36d3e2020-08-28 13:17:05 +0100172 return QuantizeClampTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100173}