From 9230e2789e421021804bc3a65cf47df4749b0765 Mon Sep 17 00:00:00 2001 From: Sang-Hoon Park Date: Sat, 18 Apr 2020 00:46:34 +0100 Subject: COMPMID-3241: Add Layer Normalization to NEQLSTMLayer - Add output quantization calculation to Layer Normalization - Add members for Layer Normalization to NEQLSTMLayer - Add configure/validate/run of Layer Normalization to NEQLSTMLayer Change-Id: I278c8e0edbb21212f3afa4d4a336df0f1a4c1bfb Signed-off-by: Sang-Hoon Park Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3059 Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio Comments-Addressed: Arm Jenkins --- .../NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/core/NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp') diff --git a/src/core/NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp b/src/core/NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp index db2ff85db9..e966c6bdba 100644 --- a/src/core/NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp +++ b/src/core/NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp @@ -80,11 +80,9 @@ inline int64x2x2_t mul_add(const int32x4_t &a, const int32x4_t &b, const int32x4 void NEQLSTMLayerNormalizationKernel::configure(const ITensor *input, ITensor *output, const ITensor *weight, const ITensor *bias) { - ARM_COMPUTE_ERROR_ON_NULLPTR(input, weight); - ARM_COMPUTE_ERROR_THROW_ON(validate(input->info(), - output ? output->info() : nullptr, - weight->info(), - bias ? bias->info() : nullptr)); + ARM_COMPUTE_ERROR_ON_NULLPTR(input, weight, bias, output); + ARM_COMPUTE_ERROR_ON(input == output); + ARM_COMPUTE_ERROR_THROW_ON(validate(input->info(), output->info(), weight->info(), bias->info())); static const std::map fn_map = { @@ -98,6 +96,7 @@ void NEQLSTMLayerNormalizationKernel::configure(const ITensor *input, ITensor *o _fn = fn_map.at(_input->info()->data_type()); auto_init_if_empty(*_output->info(), *_input->info()); + _output->info()->set_quantization_info(compute_output_qinfo()); const UniformQuantizationInfo wq_info = _weight->info()->quantization_info().uniform(); const Status s = quantization::calculate_quantized_multiplier(wq_info.scale, &_output_multiplier, &_output_shift); @@ -171,6 +170,14 @@ void NEQLSTMLayerNormalizationKernel::run(const Window &window, const ThreadInfo _fn(*this); } +inline QuantizationInfo NEQLSTMLayerNormalizationKernel::compute_output_qinfo() +{ + const UniformQuantizationInfo iq_info = _input->info()->quantization_info().uniform(); + const UniformQuantizationInfo wq_info = _weight->info()->quantization_info().uniform(); + const float output_scale = (wq_info.scale * iq_info.scale) * 1024; + return QuantizationInfo(output_scale); +} + inline std::pair NEQLSTMLayerNormalizationKernel::sum_qsymm16(const int16_t *input_ptr) { ARM_COMPUTE_ERROR_ON(!input_ptr); -- cgit v1.2.1