aboutsummaryrefslogtreecommitdiff
path: root/src/core/NEON/kernels/NEReductionOperationKernel.cpp
diff options
context:
space:
mode:
authorUsama Arif <usama.arif@arm.com>2019-05-20 13:44:34 +0100
committerUsama Arif <usama.arif@arm.com>2019-05-22 15:13:21 +0000
commit28f0dd99fba11ed9b7165eca17d801bdfb421576 (patch)
treecb8bb464cdcea9946179ccf8add3158e50eefa48 /src/core/NEON/kernels/NEReductionOperationKernel.cpp
parenta4a08ad5e33867f9938a3fbaf9b6dcc56ad8f7b5 (diff)
downloadComputeLibrary-28f0dd99fba11ed9b7165eca17d801bdfb421576.tar.gz
COMPMID-2279: Implement REDUCE_MAX operator for NEON
Change-Id: Iccd25b8aab1dd871c0d86ec3816b1cbf48370066 Signed-off-by: Usama Arif <usama.arif@arm.com> Reviewed-on: https://review.mlplatform.org/c/1193 Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Pablo Marquez <pablo.tello@arm.com>
Diffstat (limited to 'src/core/NEON/kernels/NEReductionOperationKernel.cpp')
-rw-r--r--src/core/NEON/kernels/NEReductionOperationKernel.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/core/NEON/kernels/NEReductionOperationKernel.cpp b/src/core/NEON/kernels/NEReductionOperationKernel.cpp
index b51d4b311f..e6edf22083 100644
--- a/src/core/NEON/kernels/NEReductionOperationKernel.cpp
+++ b/src/core/NEON/kernels/NEReductionOperationKernel.cpp
@@ -417,6 +417,7 @@ struct RedOpX
case ReductionOperation::ARG_IDX_MAX:
case ReductionOperation::ARG_IDX_MIN:
case ReductionOperation::MIN:
+ case ReductionOperation::MAX:
{
init_res_value = *reinterpret_cast<T *>(input.ptr());
break;
@@ -468,6 +469,11 @@ struct RedOpX
vec_res_value = wrapper::vmin(vec_elements, vec_res_value);
break;
}
+ case ReductionOperation::MAX:
+ {
+ vec_res_value = wrapper::vmax(vec_elements, vec_res_value);
+ break;
+ }
default:
ARM_COMPUTE_ERROR("Not supported");
}
@@ -518,6 +524,11 @@ struct RedOpX
*(reinterpret_cast<T *>(output.ptr())) = wrapper::vgetlane(calculate_min(vec_res_value), 0);
break;
}
+ case ReductionOperation::MAX:
+ {
+ *(reinterpret_cast<T *>(output.ptr())) = wrapper::vgetlane(calculate_max(vec_res_value), 0);
+ break;
+ }
default:
ARM_COMPUTE_ERROR("Not supported");
}
@@ -541,7 +552,7 @@ struct RedOpX_qasymm8
uint8x16_t vec_res_value = { 0 };
- if(op == ReductionOperation::ARG_IDX_MAX || op == ReductionOperation::ARG_IDX_MIN || op == ReductionOperation::MIN)
+ if(op == ReductionOperation::ARG_IDX_MAX || op == ReductionOperation::ARG_IDX_MIN || op == ReductionOperation::MIN || op == ReductionOperation::MAX)
{
vec_res_value = wrapper::vdup_n(*input.ptr(), wrapper::traits::vector_128_tag{});
}
@@ -618,6 +629,11 @@ struct RedOpX_qasymm8
vec_res_value = wrapper::vmin(vec_elements, vec_res_value);
break;
}
+ case ReductionOperation::MAX:
+ {
+ vec_res_value = wrapper::vmax(vec_elements, vec_res_value);
+ break;
+ }
default:
ARM_COMPUTE_ERROR("Not supported");
}
@@ -638,6 +654,11 @@ struct RedOpX_qasymm8
*(output.ptr()) = static_cast<uint8_t>(wrapper::vgetlane(calculate_min(vec_res_value), 0));
break;
}
+ case ReductionOperation::MAX:
+ {
+ *(output.ptr()) = static_cast<uint8_t>(wrapper::vgetlane(calculate_max(vec_res_value), 0));
+ break;
+ }
case ReductionOperation::PROD:
{
auto carry_res = wrapper::vmul(vec_res_value1_f, vec_res_value2_f);
@@ -694,6 +715,7 @@ struct RedOpYZW
case ReductionOperation::ARG_IDX_MAX:
case ReductionOperation::ARG_IDX_MIN:
case ReductionOperation::MIN:
+ case ReductionOperation::MAX:
{
vec_res_value = wrapper::vloadq(reinterpret_cast<T *>(input.ptr()));
break;
@@ -761,6 +783,11 @@ struct RedOpYZW
vec_res_value = wrapper::vmin(vec_elements, vec_res_value);
break;
}
+ case ReductionOperation::MAX:
+ {
+ vec_res_value = wrapper::vmax(vec_elements, vec_res_value);
+ break;
+ }
default:
ARM_COMPUTE_ERROR("Not supported");
}
@@ -950,6 +977,11 @@ struct RedOpYZW_qasymm8
vec_res_value = wrapper::vmin(vec_elements, vec_res_value);
break;
}
+ case ReductionOperation::MAX:
+ {
+ vec_res_value = wrapper::vmax(vec_elements, vec_res_value);
+ break;
+ }
default:
ARM_COMPUTE_ERROR("Not supported");
}