blob: 8953d4769c0a2a4f2d582fa67da5ce4f9ce485e2 [file] [log] [blame]
Sang-Hoon Park63001ac2021-01-18 14:20:27 +00001/*
2 * Copyright (c) 2021 Arm Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "src/runtime/cpu/operators/CpuElementwise.h"
25#include "src/core/cpu/kernels/CpuElementwiseKernel.h"
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000026#include "src/core/helpers/WindowHelpers.h"
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000027
28namespace arm_compute
29{
30namespace cpu
31{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000032void CpuElementwiseBase::run(ITensorPack &tensors)
33{
34 // If the kernel has been configured, use the window from the kernel.
35 if(_kernel->is_window_configured())
36 {
37 ICpuOperator::run(tensors);
38 return;
39 }
40
41 auto src0_info = tensors.get_const_tensor(TensorType::ACL_SRC_0)->info();
42 auto src1_info = tensors.get_const_tensor(TensorType::ACL_SRC_1)->info();
Sang-Hoon Parkd0b7b4b2021-03-09 10:47:30 +000043 auto shape_and_window = compute_output_shape_and_window(src0_info->tensor_shape(), src1_info->tensor_shape());
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000044 ICpuOperator::run(tensors, shape_and_window.second);
45}
46
Sang-Hoon Park6b0bf992021-02-17 13:12:53 +000047template <ArithmeticOperation op>
48void CpuElementwiseArithmetic<op>::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000049{
50 auto k = std::make_unique<kernels::CpuArithmeticKernel>();
Sang-Hoon Park6b0bf992021-02-17 13:12:53 +000051 k->configure(op, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000052 _kernel = std::move(k);
53}
54
Sang-Hoon Park6b0bf992021-02-17 13:12:53 +000055template <ArithmeticOperation op>
56Status CpuElementwiseArithmetic<op>::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000057{
Sang-Hoon Park6b0bf992021-02-17 13:12:53 +000058 return kernels::CpuArithmeticKernel::validate(op, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000059}
60
Sang-Hoon Park6b0bf992021-02-17 13:12:53 +000061template class CpuElementwiseArithmetic<ArithmeticOperation::MAX>;
62template class CpuElementwiseArithmetic<ArithmeticOperation::MIN>;
63template class CpuElementwiseArithmetic<ArithmeticOperation::SQUARED_DIFF>;
64template class CpuElementwiseArithmetic<ArithmeticOperation::PRELU>;
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000065
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000066void CpuElementwiseDivision::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000067{
68 auto k = std::make_unique<kernels::CpuDivisionKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000069 k->configure(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000070 _kernel = std::move(k);
71}
72
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000073Status CpuElementwiseDivision::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000074{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000075 return kernels::CpuDivisionKernel::validate(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000076}
77
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000078void CpuElementwisePower::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000079{
80 auto k = std::make_unique<kernels::CpuPowerKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000081 k->configure(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000082 _kernel = std::move(k);
83}
84
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000085Status CpuElementwisePower::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000086{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000087 return kernels::CpuPowerKernel::validate(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000088}
89
90template <ComparisonOperation COP>
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000091void CpuElementwiseComparisonStatic<COP>::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000092{
93 auto k = std::make_unique<kernels::CpuComparisonKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000094 k->configure(COP, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000095 _kernel = std::move(k);
96}
97
98template <ComparisonOperation COP>
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000099Status CpuElementwiseComparisonStatic<COP>::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000100{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000101 return kernels::CpuComparisonKernel::validate(COP, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000102}
103
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000104void CpuElementwiseComparison::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst, ComparisonOperation op)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000105{
106 auto k = std::make_unique<kernels::CpuComparisonKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000107 k->configure(op, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000108 _kernel = std::move(k);
109}
110
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000111Status CpuElementwiseComparison::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst, ComparisonOperation op)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000112{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000113 return kernels::CpuComparisonKernel::validate(op, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000114}
115
116// Supported Specializations
117template class CpuElementwiseComparisonStatic<ComparisonOperation::Equal>;
118template class CpuElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
119template class CpuElementwiseComparisonStatic<ComparisonOperation::Greater>;
120template class CpuElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
121template class CpuElementwiseComparisonStatic<ComparisonOperation::Less>;
122template class CpuElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
123} // namespace cpu
124} // namespace arm_compute