blob: 5497e1b8988da67dfa832105f7a4c7a7efdf81be [file] [log] [blame]
Matteo Martincigha8d572d2019-02-07 17:51:09 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Nattapat Chaimanowong7ac07f32019-03-20 11:51:14 +00008#include "NetworkQuantizationScheme.hpp"
9
Matteo Martincigha8d572d2019-02-07 17:51:09 +000010#include <armnn/Tensor.hpp>
11#include <armnn/TypesUtils.hpp>
12#include <armnn/ILayerVisitor.hpp>
Finn Williamsb454c5c2021-02-09 15:56:23 +000013#include <armnn/IStrategy.hpp>
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010014#include <armnn/utility/Assert.hpp>
Matteo Martincigha8d572d2019-02-07 17:51:09 +000015
16#include <utility>
17#include <limits>
18
Matteo Martincigha8d572d2019-02-07 17:51:09 +000019namespace armnn
20{
21
Matteo Martincigha8d572d2019-02-07 17:51:09 +000022template<typename srcType>
Nattapat Chaimanowong7ac07f32019-03-20 11:51:14 +000023void QuantizeConstant(const srcType* src, uint8_t* dst, size_t numElements, float& scale, int& offset)
Matteo Martincigha8d572d2019-02-07 17:51:09 +000024{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010025 ARMNN_ASSERT(src);
26 ARMNN_ASSERT(dst);
Matteo Martincigha8d572d2019-02-07 17:51:09 +000027
28 float min = std::numeric_limits<srcType>::max();
29 float max = std::numeric_limits<srcType>::lowest();
30 for (size_t i = 0; i < numElements; ++i)
31 {
32 min = std::min(min, src[i]);
33 max = std::max(max, src[i]);
34 }
35
Ryan OShea9add1202020-02-07 10:06:33 +000036 QAsymmU8QuantizationScheme quantizationScheme;
Nattapat Chaimanowong7ac07f32019-03-20 11:51:14 +000037 OffsetScalePair qParams = quantizationScheme.ComputeScheme(min, max);
Ferran Balaguerb2845652019-02-27 09:42:06 +000038 scale = qParams.first;
39 offset = qParams.second;
Nattapat Chaimanowong7ac07f32019-03-20 11:51:14 +000040
Matteo Martincigha8d572d2019-02-07 17:51:09 +000041 for (size_t i = 0; i < numElements; ++i)
42 {
43 dst[i] = armnn::Quantize<uint8_t>(src[i], scale, offset);
44 }
45}
46
47ConstTensor CreateQuantizedConst(const ConstTensor& tensor, std::vector<uint8_t>& backing);
48
49template <typename LayerContainer>
50void VisitLayers(const LayerContainer& layerContainer, ILayerVisitor& visitor)
51{
Jim Flynnf92dfce2019-05-02 11:33:25 +010052 visitor.StartVisit();
Matteo Martincigha8d572d2019-02-07 17:51:09 +000053 for (auto layer : layerContainer)
54 {
55 layer->Accept(visitor);
56 }
Jim Flynnf92dfce2019-05-02 11:33:25 +010057 visitor.FinishVisit();
Matteo Martincigha8d572d2019-02-07 17:51:09 +000058}
59
Finn Williamsb454c5c2021-02-09 15:56:23 +000060template <typename LayerContainer>
61void ApplyStrategyToLayers(const LayerContainer& layerContainer, IStrategy& strategy)
62{
63 for (auto layer : layerContainer)
64 {
65 layer->ExecuteStrategy(strategy);
66 }
67 strategy.FinishStrategy();
68}
69
Matteo Martincigha8d572d2019-02-07 17:51:09 +000070} // namespace armnn