diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/CL/cl_kernels/elementwise_unary.cl | 6 | ||||
-rw-r--r-- | src/core/CL/kernels/CLElementWiseUnaryLayerKernel.cpp | 3 | ||||
-rw-r--r-- | src/runtime/CL/functions/CLElementWiseUnaryLayer.cpp | 11 |
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 |