46 int output_multiplier{};
53 output_multiplier = 0;
57 const uint32_t num_batch = src.
shape()[1];
58 const uint32_t num_input = src.
shape()[0];
60 for(uint32_t batch_idx = 0; batch_idx < num_batch; ++batch_idx)
65 for(uint32_t input_idx = 0; input_idx < num_input; ++input_idx)
67 const auto index = batch_idx * num_input + input_idx;
68 const auto val =
static_cast<int32_t
>(src[index]);
73 const auto temp =
static_cast<int64_t
>(0x100000) / num_input;
74 const auto mean = sum * 1024 /
static_cast<int64_t
>(num_input);
75 const auto variance = ((sum_sq * temp) - (mean * mean)) / 0x100000;
77 int32_t stddev_invsqrt_mul{};
78 int32_t stddev_invsqrt_shift{};
81 for(uint32_t input_idx = 0; input_idx < num_input; ++input_idx)
83 const auto index = batch_idx * num_input + input_idx;
84 const auto val =
static_cast<int32_t
>(src[index]);
85 const auto shifted = (val << 10) - mean;
87 const int64_t weighted = rescaled * weight[input_idx] + bias[input_idx];
88 const auto reverse_shifted =
static_cast<int32_t
>((weighted + 512) >> 10);
90 out_val = arm_compute::utility::clamp<decltype(out_val), int16_t>(out_val, std::numeric_limits<int16_t>::min());
91 output[index] =
static_cast<int16_t
>(out_val);
SimpleTensor< int16_t > qlstm_layer_normalization(const SimpleTensor< int16_t > &src, const SimpleTensor< int16_t > &weight, const SimpleTensor< int32_t > &bias)
quantized, symmetric fixed-point 16-bit number
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
TensorShape shape() const override
Shape of the tensor.
Status calculate_quantized_multiplier(float multiplier, int32_t *quant_multiplier, int32_t *shift, bool ignore_epsilon=false)
Calculate quantized representation of multiplier.
SimpleTensor< float > src
Copyright (c) 2017-2021 Arm Limited.
void get_invsqrt_quantized_multiplier_exp(int32_t input, int32_t reverse_shift, int32_t &output_inv_sqrt, int32_t &output_shift)
Compute quantized multiplier and shift for the inverse square root of input.
int32_t multiply_by_quantized_multiplier(int32_t input, int32_t qmul, int32_t shift)
Compute the value multiplied by given quantized multiplier and shift.
Simple tensor object that stores elements in a consecutive chunk of memory.
QuantizationInfo quantization_info() const override
Quantization info in case of asymmetric quantized type.