diff options
author | Luca Foschiani <luca.foschiani@arm.com> | 2020-02-20 12:19:12 +0000 |
---|---|---|
committer | Giuseppe Rossini <giuseppe.rossini@arm.com> | 2020-02-20 17:23:24 +0000 |
commit | c6173fe9b06637415a20b5d8d19ff286ea198c6e (patch) | |
tree | 421aa042797174e46f067de530fbe5969e56df1f /tests/validation/reference/ReductionOperation.cpp | |
parent | 2209921c38e3509668a80313c04440a164910f89 (diff) | |
download | ComputeLibrary-c6173fe9b06637415a20b5d8d19ff286ea198c6e.tar.gz |
COMPMID-3212 Investigate CLReduceMean failure with QASYMM8v20.02
Signed-off-by: Luca Foschiani <luca.foschiani@arm.com>
Change-Id: I96d8cbef2e167e09484b0e9b5d8a12ffee0f6e67
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/2755
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Michalis Spyrou <michalis.spyrou@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'tests/validation/reference/ReductionOperation.cpp')
-rw-r--r-- | tests/validation/reference/ReductionOperation.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/tests/validation/reference/ReductionOperation.cpp b/tests/validation/reference/ReductionOperation.cpp index 9b35cdf6f5..a0b6a8eaed 100644 --- a/tests/validation/reference/ReductionOperation.cpp +++ b/tests/validation/reference/ReductionOperation.cpp @@ -64,7 +64,7 @@ OT reduce_operation(const T *ptr, int reduce_elements, ReductionOperation op, in if(std::is_integral<type>::value) { - auto int_res = static_cast<uint32_t>(res); + auto int_res = static_cast<int32_t>(res); for(int i = 0; i < reduce_elements; ++i) { auto elem = *(ptr + stride * i); @@ -101,7 +101,7 @@ OT reduce_operation(const T *ptr, int reduce_elements, ReductionOperation op, in { int_res /= reduce_elements; } - res = saturate_cast<type>(int_res); + res = static_cast<type>(int_res); } else { @@ -279,9 +279,17 @@ SimpleTensor<uint8_t> reduction_operation(const SimpleTensor<uint8_t> &src, cons { if(src.data_type() == DataType::QASYMM8) { - SimpleTensor<float> src_f = convert_from_asymmetric(src); - SimpleTensor<float> dst_f = reference::reduction_operation<float, float>(src_f, dst_shape, axis, op); - return convert_to_asymmetric<uint8_t>(dst_f, src.quantization_info()); + // If the operation is MEAN_SUM, we can directly use the uint8 implementation without taking into account scale and offset + if(op == ReductionOperation::MEAN_SUM) + { + return compute_reduction_operation<uint8_t, uint8_t>(src, dst_shape, axis, op); + } + else + { + SimpleTensor<float> src_f = convert_from_asymmetric(src); + SimpleTensor<float> dst_f = reference::reduction_operation<float, float>(src_f, dst_shape, axis, op); + return convert_to_asymmetric<uint8_t>(dst_f, src.quantization_info()); + } } else { @@ -294,9 +302,17 @@ SimpleTensor<int8_t> reduction_operation(const SimpleTensor<int8_t> &src, const { if(src.data_type() == DataType::QASYMM8_SIGNED) { - SimpleTensor<float> src_f = convert_from_asymmetric(src); - SimpleTensor<float> dst_f = reference::reduction_operation<float, float>(src_f, dst_shape, axis, op); - return convert_to_asymmetric<int8_t>(dst_f, src.quantization_info()); + // If the operation is MEAN_SUM, we can directly use the int8 implementation without taking into account scale and offset + if(op == ReductionOperation::MEAN_SUM) + { + return compute_reduction_operation<int8_t, int8_t>(src, dst_shape, axis, op); + } + else + { + SimpleTensor<float> src_f = convert_from_asymmetric(src); + SimpleTensor<float> dst_f = reference::reduction_operation<float, float>(src_f, dst_shape, axis, op); + return convert_to_asymmetric<int8_t>(dst_f, src.quantization_info()); + } } else { |