diff options
author | Ramy Elgammal <ramy.elgammal@arm.com> | 2023-03-31 16:16:15 +0100 |
---|---|---|
committer | Ramy Elgammal <ramy.elgammal@arm.com> | 2023-04-11 09:27:02 +0000 |
commit | 8b7f42aa0e76a65a4ffa46ee875df6a6220695ae (patch) | |
tree | 3bc006b26a659e5b404dbda48ecb259626d26fef /src/cpu/kernels/CpuElementwiseUnaryKernel.cpp | |
parent | dcab9ca1b7914eb8cadadfaa5fb468e469dca5d9 (diff) | |
download | ComputeLibrary-8b7f42aa0e76a65a4ffa46ee875df6a6220695ae.tar.gz |
Enable quantized data types for CpuElementwiseUnary on Armv7a
- Adding fallback functions neon_qasymm8_signed_elementwise_unary() and
neon_qasymm8_elementwise_unary()
- They would be called in case target is not aarch64
Resolves: COMPMID-5994
Change-Id: Id0db1e7cb0fe92f1eaef0b3a9ed2bea01b3f2a15
Signed-off-by: Ramy Elgammal <ramy.elgammal@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/9416
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Viet-Hoa Do <viet-hoa.do@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Benchmark: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/cpu/kernels/CpuElementwiseUnaryKernel.cpp')
-rw-r--r-- | src/cpu/kernels/CpuElementwiseUnaryKernel.cpp | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/cpu/kernels/CpuElementwiseUnaryKernel.cpp b/src/cpu/kernels/CpuElementwiseUnaryKernel.cpp index 0adf28af63..4b61ee3a1e 100644 --- a/src/cpu/kernels/CpuElementwiseUnaryKernel.cpp +++ b/src/cpu/kernels/CpuElementwiseUnaryKernel.cpp @@ -51,18 +51,18 @@ std::unique_ptr<uint8_t[]> q8_prepare_lut(ElementWiseUnary op, const ITensorInfo ARM_COMPUTE_ERROR_ON(!is_data_type_quantized(src->data_type())); ARM_COMPUTE_ERROR_ON(src->element_size() != 1); - auto lut = std::unique_ptr<uint8_t[]>(new uint8_t[256]); + auto lut = std::unique_ptr<uint8_t[]>(new uint8_t[256]); const auto is_signed = src->data_type() == DataType::QASYMM8_SIGNED; - const auto src_qi = src->quantization_info().uniform(); - const auto dst_qi = dst->quantization_info().uniform(); + const auto src_qi = src->quantization_info().uniform(); + const auto dst_qi = dst->quantization_info().uniform(); const auto dst_min_fp = (((is_signed) ? -128 : 0) - dst_qi.offset) * dst_qi.scale; const auto dst_max_fp = (((is_signed) ? 127 : 255) - dst_qi.offset) * dst_qi.scale; for(int i = 0; i < 256; ++i) { - const auto in = (is_signed) ? dequantize_qasymm8_signed(static_cast<int8_t>(i), src_qi) : dequantize_qasymm8(i, src_qi); - float result = 0; + const auto in = (is_signed) ? dequantize_qasymm8_signed(static_cast<int8_t>(i), src_qi) : dequantize_qasymm8(i, src_qi); + float result = 0; switch(op) { @@ -101,7 +101,7 @@ std::unique_ptr<uint8_t[]> q8_prepare_lut(ElementWiseUnary op, const ITensorInfo result = utility::clamp(result, dst_min_fp, dst_max_fp); const auto out = (is_signed) ? static_cast<uint8_t>(quantize_qasymm8_signed(result, dst_qi)) : quantize_qasymm8(result, dst_qi); - lut[i] = out; + lut[i] = out; } return lut; @@ -174,7 +174,7 @@ static const std::vector<CpuElementwiseUnaryKernel::ElementwiseUnaryKernel> avai }, REGISTER_QASYMM8_SVE(sve_q8_elementwise_unary), &q8_prepare_lut, - }, + }, { "neon_q8_elementwise_unary", [](const DataTypeISASelectorData & data) @@ -184,6 +184,25 @@ static const std::vector<CpuElementwiseUnaryKernel::ElementwiseUnaryKernel> avai REGISTER_QASYMM8_NEON(neon_q8_elementwise_unary), &q8_prepare_lut, }, +#else // __aarch64__ + { + "neon_qasymm8_signed_elementwise_unary", + [](const DataTypeISASelectorData & data) + { + return data.dt == DataType::QASYMM8_SIGNED; + }, + REGISTER_QASYMM8_NEON(neon_qasymm8_signed_elementwise_unary), + nullptr, + }, + { + "neon_qasymm8_elementwise_unary", + [](const DataTypeISASelectorData & data) + { + return data.dt == DataType::QASYMM8; + }, + REGISTER_QASYMM8_NEON(neon_qasymm8_elementwise_unary), + nullptr, + }, #endif // __aarch64__ }; |