Compute Library
 23.11
NEElementwiseOperations.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-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  */
25 
28 
30 
31 #include <utility>
32 
33 namespace arm_compute
34 {
35 struct NEElementwiseMax::Impl
36 {
37  const ITensor *src_0{nullptr};
38  const ITensor *src_1{nullptr};
39  ITensor *dst{nullptr};
40  std::unique_ptr<cpu::CpuElementwiseMax> op{nullptr};
41 };
42 
43 NEElementwiseMax::NEElementwiseMax() : _impl(std::make_unique<Impl>())
44 {
45 }
49 
51 {
53  _impl->src_0 = input1;
54  _impl->src_1 = input2;
55  _impl->dst = output;
56  _impl->op = std::make_unique<cpu::CpuElementwiseMax>();
57  _impl->op->configure(input1->info(), input2->info(), output->info());
58 }
59 
61  const ITensorInfo *input2,
62  const ITensorInfo *output,
64 {
66  return cpu::CpuElementwiseMax::validate(input1, input2, output);
67 }
68 
70 {
72  pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
73  pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
74  pack.add_tensor(TensorType::ACL_DST, _impl->dst);
75  _impl->op->run(pack);
76 }
77 
78 struct NEElementwiseMin::Impl
79 {
80  const ITensor *src_0{nullptr};
81  const ITensor *src_1{nullptr};
82  ITensor *dst{nullptr};
83  std::unique_ptr<cpu::CpuElementwiseMin> op{nullptr};
84 };
85 
86 NEElementwiseMin::NEElementwiseMin() : _impl(std::make_unique<Impl>())
87 {
88 }
92 
94 {
96  _impl->src_0 = input1;
97  _impl->src_1 = input2;
98  _impl->dst = output;
99  _impl->op = std::make_unique<cpu::CpuElementwiseMin>();
100  _impl->op->configure(input1->info(), input2->info(), output->info());
101 }
102 
104  const ITensorInfo *input2,
105  const ITensorInfo *output,
107 {
109  return cpu::CpuElementwiseMin::validate(input1, input2, output);
110 }
111 
113 {
115  pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
116  pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
117  pack.add_tensor(TensorType::ACL_DST, _impl->dst);
118  _impl->op->run(pack);
119 }
120 
121 struct NEElementwiseSquaredDiff::Impl
122 {
123  const ITensor *src_0{nullptr};
124  const ITensor *src_1{nullptr};
125  ITensor *dst{nullptr};
126  std::unique_ptr<cpu::CpuElementwiseSquaredDiff> op{nullptr};
127 };
128 
129 NEElementwiseSquaredDiff::NEElementwiseSquaredDiff() : _impl(std::make_unique<Impl>())
130 {
131 }
135 
137  ITensor *input2,
138  ITensor *output,
140 {
142  _impl->src_0 = input1;
143  _impl->src_1 = input2;
144  _impl->dst = output;
145  _impl->op = std::make_unique<cpu::CpuElementwiseSquaredDiff>();
146  _impl->op->configure(input1->info(), input2->info(), output->info());
147 }
148 
150  const ITensorInfo *input2,
151  const ITensorInfo *output,
153 {
155  return cpu::CpuElementwiseSquaredDiff::validate(input1, input2, output);
156 }
157 
159 {
161  pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
162  pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
163  pack.add_tensor(TensorType::ACL_DST, _impl->dst);
164  _impl->op->run(pack);
165 }
166 
167 struct NEElementwiseDivision::Impl
168 {
169  const ITensor *src_0{nullptr};
170  const ITensor *src_1{nullptr};
171  ITensor *dst{nullptr};
172  std::unique_ptr<cpu::CpuElementwiseDivision> op{nullptr};
173 };
174 
175 NEElementwiseDivision::NEElementwiseDivision() : _impl(std::make_unique<Impl>())
176 {
177 }
181 
183  ITensor *input2,
184  ITensor *output,
186 {
188  _impl->src_0 = input1;
189  _impl->src_1 = input2;
190  _impl->dst = output;
191  _impl->op = std::make_unique<cpu::CpuElementwiseDivision>();
192  _impl->op->configure(input1->info(), input2->info(), output->info());
193 }
194 
196  const ITensorInfo *input2,
197  const ITensorInfo *output,
199 {
201  return cpu::CpuElementwiseDivision::validate(input1, input2, output);
202 }
203 
205 {
207  pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
208  pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
209  pack.add_tensor(TensorType::ACL_DST, _impl->dst);
210  _impl->op->run(pack);
211 }
212 
213 struct NEElementwisePower::Impl
214 {
215  const ITensor *src_0{nullptr};
216  const ITensor *src_1{nullptr};
217  ITensor *dst{nullptr};
218  std::unique_ptr<cpu::CpuElementwisePower> op{nullptr};
219 };
220 
221 NEElementwisePower::NEElementwisePower() : _impl(std::make_unique<Impl>())
222 {
223 }
227 
229  ITensor *input2,
230  ITensor *output,
232 {
234  _impl->src_0 = input1;
235  _impl->src_1 = input2;
236  _impl->dst = output;
237  _impl->op = std::make_unique<cpu::CpuElementwisePower>();
238  _impl->op->configure(input1->info(), input2->info(), output->info());
239 }
240 
242  const ITensorInfo *input2,
243  const ITensorInfo *output,
245 {
247  return cpu::CpuElementwisePower::validate(input1, input2, output);
248 }
249 
251 {
253  pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
254  pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
255  pack.add_tensor(TensorType::ACL_DST, _impl->dst);
256  _impl->op->run(pack);
257 }
258 
259 template <ComparisonOperation COP>
260 struct NEElementwiseComparisonStatic<COP>::Impl
261 {
262  const ITensor *src_0{nullptr};
263  const ITensor *src_1{nullptr};
264  ITensor *dst{nullptr};
265  std::unique_ptr<cpu::CpuElementwiseComparisonStatic<COP>> op{nullptr};
266 };
267 
268 template <ComparisonOperation COP>
270 {
271 }
272 template <ComparisonOperation COP>
274 template <ComparisonOperation COP>
277 template <ComparisonOperation COP>
279 
280 template <ComparisonOperation COP>
282 {
283  _impl->src_0 = input1;
284  _impl->src_1 = input2;
285  _impl->dst = output;
286  _impl->op = std::make_unique<cpu::CpuElementwiseComparisonStatic<COP>>();
287  _impl->op->configure(input1->info(), input2->info(), output->info());
288 }
289 
290 template <ComparisonOperation COP>
292  const ITensorInfo *input2,
293  const ITensorInfo *output)
294 {
295  return cpu::CpuElementwiseComparisonStatic<COP>::validate(input1, input2, output);
296 }
297 
298 template <ComparisonOperation COP>
300 {
302  pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
303  pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
304  pack.add_tensor(TensorType::ACL_DST, _impl->dst);
305  _impl->op->run(pack);
306 }
307 
308 struct NEElementwiseComparison::Impl
309 {
310  const ITensor *src_0{nullptr};
311  const ITensor *src_1{nullptr};
312  ITensor *dst{nullptr};
313  std::unique_ptr<cpu::CpuElementwiseComparison> op{nullptr};
314 };
315 
316 NEElementwiseComparison::NEElementwiseComparison() : _impl(std::make_unique<Impl>())
317 {
318 }
322 
324 {
325  _impl->src_0 = input1;
326  _impl->src_1 = input2;
327  _impl->dst = output;
328  _impl->op = std::make_unique<cpu::CpuElementwiseComparison>();
329  _impl->op->configure(input1->info(), input2->info(), output->info(), op);
330 }
331 
333  const ITensorInfo *input2,
334  const ITensorInfo *output,
336 {
337  return cpu::CpuElementwiseComparison::validate(input1, input2, output, op);
338 }
339 
341 {
343  pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
344  pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
345  pack.add_tensor(TensorType::ACL_DST, _impl->dst);
346  _impl->op->run(pack);
347 }
348 
349 // Supported Specializations
356 } // namespace arm_compute
arm_compute::NEElementwiseDivision::configure
void configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Initialise the kernel's inputs, output and conversion policy.
Definition: NEElementwiseOperations.cpp:182
arm_compute::NEElementwiseComparison::~NEElementwiseComparison
~NEElementwiseComparison()
Default Destructor.
arm_compute::NEElementwiseComparison
Basic function to run cpu::kernels::CpuComparisonKernel.
Definition: NEElementwiseOperations.h:364
arm_compute::NEElementwiseSquaredDiff::~NEElementwiseSquaredDiff
~NEElementwiseSquaredDiff()
Default Destructor.
arm_compute::test::validation::dst
auto dst
Definition: DFT.cpp:170
arm_compute::NEElementwisePower::run
void run() override
Run the kernels contained in the function.
Definition: NEElementwiseOperations.cpp:250
arm_compute::NEElementwisePower::NEElementwisePower
NEElementwisePower()
Default Constructor.
Definition: NEElementwiseOperations.cpp:221
arm_compute::NEElementwiseMax::run
void run() override
Run the kernels contained in the function.
Definition: NEElementwiseOperations.cpp:69
arm_compute::NEElementwiseMin::~NEElementwiseMin
~NEElementwiseMin()
Default Destructor.
arm_compute::NEElementwiseMax::configure
void configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Initialise the kernel's inputs, output and conversion policy.
Definition: NEElementwiseOperations.cpp:50
arm_compute::ITensor
Interface for CPU tensor.
Definition: ITensor.h:36
arm_compute::NEElementwiseSquaredDiff::run
void run() override
Run the kernels contained in the function.
Definition: NEElementwiseOperations.cpp:158
arm_compute::ITensorPack::add_tensor
void add_tensor(int id, ITensor *tensor)
Add tensor to the pack.
Definition: ITensorPack.cpp:38
CpuElementwise.h
arm_compute::NEElementwiseMin::NEElementwiseMin
NEElementwiseMin()
Default Constructor.
Definition: NEElementwiseOperations.cpp:86
arm_compute::cpu::CpuElementwiseArithmetic::validate
static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Static function to check if given info will lead to a valid configuration.
Definition: CpuElementwise.cpp:59
arm_compute::ACL_SRC_0
@ ACL_SRC_0
Definition: Types.h:45
arm_compute::NEElementwiseComparison::operator=
NEElementwiseComparison & operator=(const NEElementwiseComparison &)=delete
Prevent instances of this class from being copied (As this class contains pointers)
arm_compute::NEElementwiseMax
Basic function to run cpu::kernels::CpuArithmeticKernel for max.
Definition: NEElementwiseOperations.h:41
arm_compute::NEElementwiseSquaredDiff::NEElementwiseSquaredDiff
NEElementwiseSquaredDiff()
Default Constructor.
Definition: NEElementwiseOperations.cpp:129
arm_compute::ACL_SRC_1
@ ACL_SRC_1
Definition: Types.h:46
arm_compute::NEElementwiseMax::~NEElementwiseMax
~NEElementwiseMax()
Default Destructor.
arm_compute::ActivationLayerInfo
Activation Layer Information class.
Definition: ActivationLayerInfo.h:55
arm_compute::NEElementwiseDivision::~NEElementwiseDivision
~NEElementwiseDivision()
Default Destructor.
arm_compute::test::validation::act_info
act_info
Definition: DirectConvolutionLayer.cpp:547
arm_compute::NEElementwiseComparison::run
void run() override
Run the kernels contained in the function.
Definition: NEElementwiseOperations.cpp:340
arm_compute::NEElementwiseMin::operator=
NEElementwiseMin & operator=(const NEElementwiseMin &)=delete
Prevent instances of this class from being copied (As this class contains pointers)
arm_compute::NEElementwiseComparisonStatic
Basic function to run cpu::kernels::CpuComparisonKernel.
Definition: NEElementwiseOperations.h:427
arm_compute::ITensor::info
virtual ITensorInfo * info() const =0
Interface to be implemented by the child class to return the tensor's metadata.
arm_compute::ITensorPack
Tensor packing service.
Definition: ITensorPack.h:39
arm_compute::ComparisonOperation
ComparisonOperation
Supported comparison operations.
Definition: Types.h:132
arm_compute::NEElementwiseDivision::validate
static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Static function to check if given info will lead to a valid configuration of cpu::kernels::CpuArithme...
Definition: NEElementwiseOperations.cpp:195
ARM_COMPUTE_RETURN_ERROR_ON
#define ARM_COMPUTE_RETURN_ERROR_ON(cond)
If the condition is true, an error is returned.
Definition: Error.h:298
arm_compute::NEElementwiseSquaredDiff
Basic function to run cpu::kernels::CpuArithmeticKernel for squared difference.
Definition: NEElementwiseOperations.h:173
arm_compute::ACL_DST
@ ACL_DST
Definition: Types.h:55
arm_compute::NEElementwiseSquaredDiff::configure
void configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Initialise the kernel's inputs, output and conversion policy.
Definition: NEElementwiseOperations.cpp:136
arm_compute::NEElementwiseMax::validate
static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Static function to check if given info will lead to a valid configuration of cpu::kernels::CpuArithme...
Definition: NEElementwiseOperations.cpp:60
arm_compute::Status
Status class.
Definition: Error.h:52
arm_compute::NEElementwiseComparisonStatic::run
void run() override
Run the kernels contained in the function.
Definition: NEElementwiseOperations.cpp:299
arm_compute::NEElementwisePower
Basic function to run cpu::kernels::CpuArithmeticKernel for power.
Definition: NEElementwiseOperations.h:302
NEElementwiseOperations.h
arm_compute::cpu::CpuElementwisePower::validate
static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Static function to check if given info will lead to a valid configuration.
Definition: CpuElementwise.cpp:90
arm_compute::NEElementwiseComparison::validate
static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op)
Static function to check if given info will lead to a valid configuration of cpu::kernels::CpuCompari...
Definition: NEElementwiseOperations.cpp:332
arm_compute::cpu::CpuElementwiseComparison::validate
static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst, ComparisonOperation op)
Static function to check if given info will lead to a valid configuration.
Definition: CpuElementwise.cpp:122
arm_compute::NEElementwiseMax::operator=
NEElementwiseMax & operator=(const NEElementwiseMax &)=delete
Prevent instances of this class from being copied (As this class contains pointers)
arm_compute::test::validation::pack
ITensorPack pack
Definition: Im2Col.cpp:188
ARM_COMPUTE_UNUSED
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
Definition: Error.h:151
arm_compute::NEElementwiseSquaredDiff::operator=
NEElementwiseSquaredDiff & operator=(const NEElementwiseSquaredDiff &)=delete
Prevent instances of this class from being copied (As this class contains pointers)
arm_compute::cpu::CpuElementwiseComparisonStatic::validate
static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Static function to check if given info will lead to a valid configuration.
Definition: CpuElementwise.cpp:106
arm_compute::NEElementwisePower::operator=
NEElementwisePower & operator=(const NEElementwisePower &)=delete
Prevent instances of this class from being copied (As this class contains pointers)
arm_compute::NEElementwiseSquaredDiff::validate
static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Static function to check if given info will lead to a valid configuration of cpu::kernels::CpuArithme...
Definition: NEElementwiseOperations.cpp:149
arm_compute::NEElementwisePower::configure
void configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Initialise the kernel's inputs, output and conversion policy.
Definition: NEElementwiseOperations.cpp:228
arm_compute::NEElementwiseComparisonStatic::NEElementwiseComparisonStatic
NEElementwiseComparisonStatic()
Default Constructor.
Definition: NEElementwiseOperations.cpp:269
arm_compute::NEElementwiseComparisonStatic::validate
static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
Static function to check if given info will lead to a valid configuration of cpu::kernels::CpuCompari...
Definition: NEElementwiseOperations.cpp:291
arm_compute::NEElementwiseComparison::configure
void configure(ITensor *input1, ITensor *input2, ITensor *output, ComparisonOperation op)
Initialise the kernel's inputs, output and conversion policy.
Definition: NEElementwiseOperations.cpp:323
arm_compute
Copyright (c) 2017-2023 Arm Limited.
Definition: introduction.dox:24
arm_compute::NEElementwiseDivision
Basic function to run cpu::kernels::CpuArithmeticKernel for division.
Definition: NEElementwiseOperations.h:239
arm_compute::NEElementwiseComparison::NEElementwiseComparison
NEElementwiseComparison()
Default Constructor.
Definition: NEElementwiseOperations.cpp:316
arm_compute::NEElementwiseDivision::NEElementwiseDivision
NEElementwiseDivision()
Default Constructor.
Definition: NEElementwiseOperations.cpp:175
arm_compute::NEElementwiseMin::configure
void configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Initialise the kernel's inputs, output and conversion policy.
Definition: NEElementwiseOperations.cpp:93
arm_compute::NEElementwiseMin::validate
static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Static function to check if given info will lead to a valid configuration of cpu::kernels::CpuArithme...
Definition: NEElementwiseOperations.cpp:103
arm_compute::NEElementwiseComparisonStatic::~NEElementwiseComparisonStatic
~NEElementwiseComparisonStatic()
Default Destructor.
arm_compute::ITensorInfo
Store the tensor's metadata.
Definition: ITensorInfo.h:44
arm_compute::NEElementwiseMin::run
void run() override
Run the kernels contained in the function.
Definition: NEElementwiseOperations.cpp:112
arm_compute::NEElementwiseDivision::run
void run() override
Run the kernels contained in the function.
Definition: NEElementwiseOperations.cpp:204
ITensor.h
arm_compute::NEElementwiseComparisonStatic::operator=
NEElementwiseComparisonStatic & operator=(const NEElementwiseComparisonStatic &)=delete
Prevent instances of this class from being copied (As this class contains pointers)
arm_compute::cpu::CpuElementwiseDivision::validate
static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst)
Static function to check if given info will lead to a valid configuration.
Definition: CpuElementwise.cpp:77
arm_compute::NEElementwiseDivision::operator=
NEElementwiseDivision & operator=(const NEElementwiseDivision &)=delete
Prevent instances of this class from being copied (As this class contains pointers)
Validate.h
arm_compute::NEElementwiseMax::NEElementwiseMax
NEElementwiseMax()
Default Constructor.
Definition: NEElementwiseOperations.cpp:43
arm_compute::NEElementwisePower::~NEElementwisePower
~NEElementwisePower()
Default Destructor.
arm_compute::NEElementwisePower::validate
static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Static function to check if given info will lead to a valid configuration of cpu::kernels::CpuArithme...
Definition: NEElementwiseOperations.cpp:241
arm_compute::NEElementwiseComparisonStatic::configure
void configure(ITensor *input1, ITensor *input2, ITensor *output)
Initialise the kernel's inputs, output and conversion policy.
Definition: NEElementwiseOperations.cpp:281
arm_compute::NEElementwiseMin
Basic function to run cpu::kernels::CpuArithmeticKernel for min.
Definition: NEElementwiseOperations.h:107