diff options
author | Georgios Pinitas <georgios.pinitas@arm.com> | 2020-11-12 15:05:01 +0000 |
---|---|---|
committer | Georgios Pinitas <georgios.pinitas@arm.com> | 2020-11-12 17:35:53 +0000 |
commit | d7341fb9e3b24b904edf7ac9d83e1e063bc77765 (patch) | |
tree | dccf043327c4ec57e2909bd50512d5bd0b9c0e8e /src/core/NEON/kernels/NEPixelWiseMultiplicationKernel.cpp | |
parent | c0b6f76561580414f08633a804fc548ccad65659 (diff) | |
download | ComputeLibrary-d7341fb9e3b24b904edf7ac9d83e1e063bc77765.tar.gz |
COMPMID-3960: Mismatch on NEArithmeticSubtraction
Corner-case failure when both input shapes had unit shape on the X axis.
Broadcasting was enabled leading to invalid window execution.
Check is updated to cross-validate the presence of broadcasting by
checking the X dimension in both input shapes.
Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com>
Change-Id: I0b79542279e8d155d2661fddff9691d94a1f6855
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/4391
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/core/NEON/kernels/NEPixelWiseMultiplicationKernel.cpp')
-rw-r--r-- | src/core/NEON/kernels/NEPixelWiseMultiplicationKernel.cpp | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/core/NEON/kernels/NEPixelWiseMultiplicationKernel.cpp b/src/core/NEON/kernels/NEPixelWiseMultiplicationKernel.cpp index f646ea5db7..39517f6ff6 100644 --- a/src/core/NEON/kernels/NEPixelWiseMultiplicationKernel.cpp +++ b/src/core/NEON/kernels/NEPixelWiseMultiplicationKernel.cpp @@ -156,7 +156,7 @@ void mul_saturate_quantized_8(const ITensor *in1, const ITensor *in2, ITensor *o const int window_step_x = 16 / sizeof(T); const auto window_start_x = static_cast<int>(window.x().start()); const auto window_end_x = static_cast<int>(window.x().end()); - const bool is_broadcast_across_x = (input1_win.x().step() == 0) || (input2_win.x().step() == 0); + const bool is_broadcast_across_x = in1->info()->tensor_shape().x() != in2->info()->tensor_shape().x(); const UniformQuantizationInfo output_qua_info = out->info()->quantization_info().uniform(); const UniformQuantizationInfo tmp_qua_info = { output_qua_info.scale / scale, output_qua_info.offset }; @@ -785,7 +785,7 @@ void mul_S32_S32_S32(const ITensor *in1, const ITensor *in2, ITensor *out, const const int window_step_x = 8; const auto window_start_x = static_cast<int>(window.x().start()); const auto window_end_x = static_cast<int>(window.x().end()); - const bool is_broadcast_across_x = (input1_win.x().step() == 0) || (input2_win.x().step() == 0); + const bool is_broadcast_across_x = in1->info()->tensor_shape().x() != in2->info()->tensor_shape().x(); if(is_broadcast_across_x) { @@ -935,7 +935,7 @@ void mul_F32_F32_F32(const ITensor *in1, const ITensor *in2, ITensor *out, const constexpr int window_step_x = 16 / sizeof(float); const auto window_start_x = static_cast<int>(window.x().start()); const auto window_end_x = static_cast<int>(window.x().end()); - const bool is_broadcast_across_x = (input1_win.x().step() == 0) || (input2_win.x().step() == 0); + const bool is_broadcast_across_x = in1->info()->tensor_shape().x() != in2->info()->tensor_shape().x(); using ExactTagType = typename wrapper::traits::neon_vector<float, window_step_x>::tag_type; @@ -1033,7 +1033,7 @@ void c_mul_F32_F32_F32_n(const ITensor *in1, const ITensor *in2, ITensor *out, c constexpr int window_step_x = 8 / sizeof(float); const auto window_start_x = static_cast<int>(window.x().start()); const auto window_end_x = static_cast<int>(window.x().end()); - const bool is_broadcast_across_x = (input1_win.x().step() == 0) || (input2_win.x().step() == 0); + const bool is_broadcast_across_x = in1->info()->tensor_shape().x() != in2->info()->tensor_shape().x(); using ExactTagType = typename wrapper::traits::neon_vector<float, 2>::tag_type; |