aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorUsama Arif <usama.arif@arm.com>2019-05-24 14:53:59 +0100
committerUsama Arif <usama.arif@arm.com>2019-05-24 16:36:10 +0000
commit6a4d5426637b6cc967665e0455609535938c211d (patch)
tree4bcd6a9c4b05f0f979c46074f309f27a3355f907 /src
parent0a5a57a3f794de851408bae1c63b1660b4c5cbe7 (diff)
downloadComputeLibrary-6a4d5426637b6cc967665e0455609535938c211d.tar.gz
COMPMID-2159 Implement Round for CL
Change-Id: I9d3ed4bb3cf7bef39bd0e71b3c6f266ff8187290 Signed-off-by: Usama Arif <usama.arif@arm.com> Reviewed-on: https://review.mlplatform.org/c/1226 Reviewed-by: Pablo Marquez <pablo.tello@arm.com> Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/CL/cl_kernels/elementwise_unary.cl6
-rw-r--r--src/core/CL/kernels/CLElementWiseUnaryLayerKernel.cpp3
-rw-r--r--src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp11
3 files changed, 20 insertions, 0 deletions
diff --git a/src/core/CL/cl_kernels/elementwise_unary.cl b/src/core/CL/cl_kernels/elementwise_unary.cl
index 866b7ee2b0..b496fcf562 100644
--- a/src/core/CL/cl_kernels/elementwise_unary.cl
+++ b/src/core/CL/cl_kernels/elementwise_unary.cl
@@ -38,6 +38,12 @@
#define fabs_op(input) fabs(input)
// Calculate natural_log
#define natural_log_op(input) log(input)
+// Calculate round (Cannot use round function as it rounds halfway cases away from zero).
+#if defined(VEC_SIZE)
+#define round_op(input) CONVERT(CONVERT_SAT_ROUND(input, VEC_DATA_TYPE(int, VEC_SIZE), rte), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))
+#else // defined(VEC_SIZE
+#define round_op(input) CONVERT(CONVERT_SAT_ROUND(input, int, rte), DATA_TYPE)
+#endif // defined(VEC_SIZE
/** Applies element wise unary operator in a tensor.
*
diff --git a/src/core/CL/kernels/CLElementWiseUnaryLayerKernel.cpp b/src/core/CL/kernels/CLElementWiseUnaryLayerKernel.cpp
index 8b8d2965df..03edcef781 100644
--- a/src/core/CL/kernels/CLElementWiseUnaryLayerKernel.cpp
+++ b/src/core/CL/kernels/CLElementWiseUnaryLayerKernel.cpp
@@ -96,6 +96,9 @@ void CLElementWiseUnaryLayerKernel::configure(const ICLTensor *input, ICLTensor
case ElementWiseUnary::LOG:
build_opts.add_option("-DOPERATION=natural_log_op");
break;
+ case ElementWiseUnary::ROUND:
+ build_opts.add_option("-DOPERATION=round_op");
+ break;
default:
ARM_COMPUTE_ERROR("Not implemented");
}
diff --git a/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp b/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp
index b1e18ecd7e..b9ebf6972e 100644
--- a/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp
+++ b/src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp
@@ -95,4 +95,15 @@ Status CLLogLayer::validate(const ITensorInfo *input, const ITensorInfo *output)
return CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::LOG);
}
+void CLRoundLayer::configure(const ICLTensor *input, ICLTensor *output)
+{
+ auto k = arm_compute::support::cpp14::make_unique<CLElementWiseUnaryLayerKernel>();
+ k->configure(input, output, ElementWiseUnary::ROUND);
+ _kernel = std::move(k);
+}
+Status CLRoundLayer::validate(const ITensorInfo *input, const ITensorInfo *output)
+{
+ return CLElementWiseUnaryLayerKernel::validate(input, output, ElementWiseUnary::ROUND);
+}
+
} // namespace arm_compute