Laurent Carlier | 749294b | 2020-06-01 09:03:17 +0100 | [diff] [blame] | 1 | // |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 2 | // Copyright © 2017 Arm Ltd. All rights reserved. |
David Beck | ecb56cd | 2018-09-05 12:52:57 +0100 | [diff] [blame] | 3 | // SPDX-License-Identifier: MIT |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 4 | // |
| 5 | |
| 6 | #pragma once |
| 7 | |
| 8 | #include "RefWorkloadUtils.hpp" |
narpra01 | 5f70318 | 2018-10-26 16:24:58 +0100 | [diff] [blame] | 9 | #include "TensorBufferArrayView.hpp" |
Mike Kelly | 9b39832 | 2019-05-22 17:21:49 +0100 | [diff] [blame] | 10 | #include "BaseIterator.hpp" |
| 11 | #include "Decoders.hpp" |
| 12 | #include "Encoders.hpp" |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 13 | |
| 14 | #include <armnn/Tensor.hpp> |
| 15 | |
Matteo Martincigh | e011d20 | 2019-11-28 11:35:47 +0000 | [diff] [blame] | 16 | #include <armnnUtils/DataLayoutIndexed.hpp> |
Matthew Bentham | 8800c00 | 2018-11-19 13:19:28 +0000 | [diff] [blame] | 17 | |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 18 | #include <cmath> |
| 19 | #include <limits> |
| 20 | |
| 21 | namespace armnn |
| 22 | { |
| 23 | |
telsoa01 | c577f2c | 2018-08-31 09:22:23 +0100 | [diff] [blame] | 24 | /// Performs multiplication of an integer with a multiplier which is less than one, |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 25 | /// using quantized integer arithmetic which is consistent with AndroidNN's CPU executor. |
| 26 | struct QuantizedMultiplierSmallerThanOne |
| 27 | { |
| 28 | public: |
| 29 | /// Constructs a QuantizedMultiplierSmallerThanOne which will multiply by the given multiplier. |
| 30 | /// This stores the appropriate integer quantities (derived from the given multiplier) for later use. |
| 31 | /// The implementation of this function is adapted from Android NN's QuantizeMultiplierSmallerThanOne(). |
| 32 | QuantizedMultiplierSmallerThanOne(float multiplier); |
| 33 | |
telsoa01 | c577f2c | 2018-08-31 09:22:23 +0100 | [diff] [blame] | 34 | /// The implementation of this function is adapted from Android NN's MultiplyByQuantizedMultiplierSmallerThanOne(). |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 35 | int32_t operator*(int32_t rhs) const; |
| 36 | |
| 37 | private: |
telsoa01 | c577f2c | 2018-08-31 09:22:23 +0100 | [diff] [blame] | 38 | /// The implementation of this function is adapted from gemmlowp's SaturatingRoundingDoublingHighMul(). |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 39 | static int32_t SaturatingRoundingDoublingHighMul(int32_t a, int32_t b); |
| 40 | |
telsoa01 | c577f2c | 2018-08-31 09:22:23 +0100 | [diff] [blame] | 41 | /// The implementation of this function is adapted from gemmlowp's RoundingDivideByPOT(). |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 42 | static int32_t RoundingDivideByPOT(int32_t x, int exponent); |
| 43 | |
| 44 | int32_t m_Multiplier; |
| 45 | int32_t m_RightShift; |
| 46 | }; |
| 47 | |
Mike Kelly | 9b39832 | 2019-05-22 17:21:49 +0100 | [diff] [blame] | 48 | void Convolve(const TensorShape& rInputShape, |
| 49 | Decoder<float>& rInputDecoder, |
| 50 | const TensorShape& rOutputShape, |
| 51 | Encoder<float>& rOutputEncoder, |
| 52 | const TensorShape& rFilterShape, |
| 53 | Decoder<float>& rFilterDecoder, |
| 54 | bool biasEnabled, |
| 55 | Decoder<float>* pBiasDecoder, |
| 56 | DataLayout dataLayout, |
| 57 | unsigned int paddingTop, |
| 58 | unsigned int paddingLeft, |
| 59 | unsigned int xStride, |
| 60 | unsigned int yStride, |
| 61 | unsigned int xDilation, |
| 62 | unsigned int yDilation, |
| 63 | bool depthwise = false); |
telsoa01 | 4fcda01 | 2018-03-09 14:13:49 +0000 | [diff] [blame] | 64 | } //namespace armnn |