blob: 5457825bd5120b81e21d37e9f0574976f9164db8 [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
47void CpuElementwiseMax::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000048{
49 auto k = std::make_unique<kernels::CpuArithmeticKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000050 k->configure(ArithmeticOperation::MAX, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000051 _kernel = std::move(k);
52}
53
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000054Status CpuElementwiseMax::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000055{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000056 return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::MAX, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000057}
58
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000059void CpuElementwiseMin::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000060{
61 auto k = std::make_unique<kernels::CpuArithmeticKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000062 k->configure(ArithmeticOperation::MIN, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000063 _kernel = std::move(k);
64}
65
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000066Status CpuElementwiseMin::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000067{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000068 return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::MIN, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000069}
70
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000071void CpuElementwiseSquaredDiff::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000072{
73 auto k = std::make_unique<kernels::CpuArithmeticKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000074 k->configure(ArithmeticOperation::SQUARED_DIFF, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000075 _kernel = std::move(k);
76}
77
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000078Status CpuElementwiseSquaredDiff::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000079{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000080 return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::SQUARED_DIFF, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000081}
82
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000083void CpuElementwiseDivision::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000084{
85 auto k = std::make_unique<kernels::CpuDivisionKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000086 k->configure(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000087 _kernel = std::move(k);
88}
89
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000090Status CpuElementwiseDivision::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000091{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000092 return kernels::CpuDivisionKernel::validate(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000093}
94
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000095void CpuElementwisePower::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000096{
97 auto k = std::make_unique<kernels::CpuPowerKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000098 k->configure(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000099 _kernel = std::move(k);
100}
101
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000102Status CpuElementwisePower::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000103{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000104 return kernels::CpuPowerKernel::validate(src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000105}
106
107template <ComparisonOperation COP>
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000108void CpuElementwiseComparisonStatic<COP>::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000109{
110 auto k = std::make_unique<kernels::CpuComparisonKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000111 k->configure(COP, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000112 _kernel = std::move(k);
113}
114
115template <ComparisonOperation COP>
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000116Status CpuElementwiseComparisonStatic<COP>::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000117{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000118 return kernels::CpuComparisonKernel::validate(COP, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000119}
120
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000121void CpuElementwiseComparison::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst, ComparisonOperation op)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000122{
123 auto k = std::make_unique<kernels::CpuComparisonKernel>();
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000124 k->configure(op, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000125 _kernel = std::move(k);
126}
127
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000128Status CpuElementwiseComparison::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst, ComparisonOperation op)
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000129{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000130 return kernels::CpuComparisonKernel::validate(op, src0, src1, dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000131}
132
133// Supported Specializations
134template class CpuElementwiseComparisonStatic<ComparisonOperation::Equal>;
135template class CpuElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
136template class CpuElementwiseComparisonStatic<ComparisonOperation::Greater>;
137template class CpuElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
138template class CpuElementwiseComparisonStatic<ComparisonOperation::Less>;
139template class CpuElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
140} // namespace cpu
141} // namespace arm_compute