blob: e66e4bf5265b885c18a4dd3271ca6d6283f5c651 [file] [log] [blame]
giuros01164a2722018-11-20 18:34:46 +00001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2018-2020 Arm Limited.
giuros01164a2722018-11-20 18:34:46 +00003 *
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 */
giuros011e6e1b82019-05-14 16:12:53 +010024#include "arm_compute/runtime/CL/functions/CLElementwiseOperations.h"
25
giuros01164a2722018-11-20 18:34:46 +000026#include "arm_compute/core/CL/ICLTensor.h"
27#include "arm_compute/core/CL/kernels/CLElementwiseOperationKernel.h"
Michalis Spyrouad7515d2020-07-24 00:02:23 +010028#include "arm_compute/runtime/CL/CLScheduler.h"
Matthew Bentham92046462020-03-07 22:15:55 +000029#include "support/MemorySupport.h"
giuros01164a2722018-11-20 18:34:46 +000030
31#include <utility>
32
33namespace arm_compute
34{
35namespace
36{
Michalis Spyrouad7515d2020-07-24 00:02:23 +010037void configure_border_handler(const CLCompileContext &compile_context, CLFillBorderKernel &border_handler, BorderSize border_size, ITensorInfo *input1, ITensorInfo *input2, const ITensorInfo *output)
giuros01164a2722018-11-20 18:34:46 +000038{
Michalis Spyrouad7515d2020-07-24 00:02:23 +010039 if(output->dimension(0) > 1)
giuros01164a2722018-11-20 18:34:46 +000040 {
Michalis Spyrouad7515d2020-07-24 00:02:23 +010041 ITensorInfo *broadcasted_info = (input1->dimension(0) == 1) ? input1 : input2;
giuros01164a2722018-11-20 18:34:46 +000042
Michalis Spyrouad7515d2020-07-24 00:02:23 +010043 if(broadcasted_info->dimension(0) == 1)
giuros01164a2722018-11-20 18:34:46 +000044 {
Manuel Bottini2b84be52020-04-08 10:15:51 +010045 border_handler.configure(compile_context, broadcasted_info, border_size, BorderMode::REPLICATE);
giuros01164a2722018-11-20 18:34:46 +000046 }
47 }
48}
Michalis Spyrouad7515d2020-07-24 00:02:23 +010049
50void select_border_input(InputTensorMap &tensor_map, InputTensorMap &inputs, OutputTensorMap &outputs)
51{
52 if(outputs.at(TensorType::ACL_DST)->info()->dimension(0) > 1)
53 {
54 if(inputs.at(TensorType::ACL_SRC_1)->info()->dimension(0) == 1)
55 {
56 tensor_map[TensorType::ACL_SRC] = inputs.at(TensorType::ACL_SRC_1);
57 }
58 else
59 {
60 tensor_map[TensorType::ACL_SRC] = inputs.at(TensorType::ACL_SRC_0);
61 }
62 }
63}
giuros01164a2722018-11-20 18:34:46 +000064} // namespace
65
Michalis Spyrouad7515d2020-07-24 00:02:23 +010066namespace experimental
giuros01164a2722018-11-20 18:34:46 +000067{
Michalis Spyrouad7515d2020-07-24 00:02:23 +010068CLArithmeticAddition::CLArithmeticAddition()
69 : _border_handler()
70{
Manuel Bottini2b84be52020-04-08 10:15:51 +010071}
72
Michalis Spyrouad7515d2020-07-24 00:02:23 +010073void CLArithmeticAddition::configure(const CLCompileContext &compile_context, ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info)
Manuel Bottini2b84be52020-04-08 10:15:51 +010074{
giuros01164a2722018-11-20 18:34:46 +000075 auto k = arm_compute::support::cpp14::make_unique<CLSaturatedArithmeticOperationKernel>();
Manuel Bottini2b84be52020-04-08 10:15:51 +010076 k->configure(compile_context, ArithmeticOperation::ADD, input1, input2, output, policy, act_info);
giuros01164a2722018-11-20 18:34:46 +000077 _kernel = std::move(k);
Manuel Bottini2b84be52020-04-08 10:15:51 +010078 configure_border_handler(compile_context, _border_handler, _kernel->border_size(), input1, input2, output);
giuros01164a2722018-11-20 18:34:46 +000079}
80
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000081Status CLArithmeticAddition::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info)
giuros01164a2722018-11-20 18:34:46 +000082{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000083 return CLSaturatedArithmeticOperationKernel::validate(ArithmeticOperation::ADD, input1, input2, output, policy, act_info);
giuros01164a2722018-11-20 18:34:46 +000084}
85
Michalis Spyrouad7515d2020-07-24 00:02:23 +010086void CLArithmeticAddition::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace)
giuros01164a2722018-11-20 18:34:46 +000087{
Michalis Spyrouad7515d2020-07-24 00:02:23 +010088 InputTensorMap src;
89 select_border_input(src, inputs, outputs);
90 CLScheduler::get().enqueue_op(_border_handler, src, {});
91 ICLOperator::run(inputs, outputs, workspace);
Manuel Bottini2b84be52020-04-08 10:15:51 +010092}
93
Michalis Spyrouad7515d2020-07-24 00:02:23 +010094CLArithmeticSubtraction::CLArithmeticSubtraction()
95 : _border_handler()
96{
97}
98void CLArithmeticSubtraction::configure(const CLCompileContext &compile_context, ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, ConvertPolicy policy,
99 const ActivationLayerInfo &act_info)
Manuel Bottini2b84be52020-04-08 10:15:51 +0100100{
giuros01164a2722018-11-20 18:34:46 +0000101 auto k = arm_compute::support::cpp14::make_unique<CLSaturatedArithmeticOperationKernel>();
Manuel Bottini2b84be52020-04-08 10:15:51 +0100102 k->configure(compile_context, ArithmeticOperation::SUB, input1, input2, output, policy, act_info);
giuros01164a2722018-11-20 18:34:46 +0000103 _kernel = std::move(k);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100104 configure_border_handler(compile_context, _border_handler, _kernel->border_size(), input1, input2, output);
giuros01164a2722018-11-20 18:34:46 +0000105}
106
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000107Status CLArithmeticSubtraction::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info)
giuros01164a2722018-11-20 18:34:46 +0000108{
109 ARM_COMPUTE_UNUSED(policy);
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000110 return CLSaturatedArithmeticOperationKernel::validate(ArithmeticOperation::SUB, input1, input2, output, policy, act_info);
giuros01164a2722018-11-20 18:34:46 +0000111}
112
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100113void CLArithmeticSubtraction::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace)
giuros01164a2722018-11-20 18:34:46 +0000114{
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100115 InputTensorMap src;
116 select_border_input(src, inputs, outputs);
117 CLScheduler::get().enqueue_op(_border_handler, src, {});
118 ICLOperator::run(inputs, outputs, workspace);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100119}
120
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100121CLArithmeticDivision::CLArithmeticDivision()
122 : _border_handler()
123{
124}
125
126void CLArithmeticDivision::configure(const CLCompileContext &compile_context, ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info)
Manuel Bottini2b84be52020-04-08 10:15:51 +0100127{
giuros01164a2722018-11-20 18:34:46 +0000128 auto k = arm_compute::support::cpp14::make_unique<CLArithmeticOperationKernel>();
Manuel Bottini2b84be52020-04-08 10:15:51 +0100129 k->configure(compile_context, ArithmeticOperation::DIV, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000130 _kernel = std::move(k);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100131 configure_border_handler(compile_context, _border_handler, _kernel->border_size(), input1, input2, output);
giuros01164a2722018-11-20 18:34:46 +0000132}
133
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000134Status CLArithmeticDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
giuros01164a2722018-11-20 18:34:46 +0000135{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000136 return CLArithmeticOperationKernel::validate(ArithmeticOperation::DIV, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000137}
138
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100139void CLArithmeticDivision::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace)
giuros01164a2722018-11-20 18:34:46 +0000140{
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100141 InputTensorMap src;
142 select_border_input(src, inputs, outputs);
143 CLScheduler::get().enqueue_op(_border_handler, src, {});
144 ICLOperator::run(inputs, outputs, workspace);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100145}
146
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100147CLElementwiseMax::CLElementwiseMax()
148 : _border_handler()
149{
150}
151
152void CLElementwiseMax::configure(const CLCompileContext &compile_context, ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info)
Manuel Bottini2b84be52020-04-08 10:15:51 +0100153{
giuros01164a2722018-11-20 18:34:46 +0000154 auto k = arm_compute::support::cpp14::make_unique<CLArithmeticOperationKernel>();
Manuel Bottini2b84be52020-04-08 10:15:51 +0100155 k->configure(compile_context, ArithmeticOperation::MAX, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000156 _kernel = std::move(k);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100157 configure_border_handler(compile_context, _border_handler, _kernel->border_size(), input1, input2, output);
giuros01164a2722018-11-20 18:34:46 +0000158}
159
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000160Status CLElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
giuros01164a2722018-11-20 18:34:46 +0000161{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000162 return CLArithmeticOperationKernel::validate(ArithmeticOperation::MAX, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000163}
164
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100165void CLElementwiseMax::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace)
giuros01164a2722018-11-20 18:34:46 +0000166{
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100167 InputTensorMap src;
168 select_border_input(src, inputs, outputs);
169 CLScheduler::get().enqueue_op(_border_handler, src, {});
170 ICLOperator::run(inputs, outputs, workspace);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100171}
172
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100173CLElementwiseMin::CLElementwiseMin()
174 : _border_handler()
175{
176}
177
178void CLElementwiseMin::configure(const CLCompileContext &compile_context, ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info)
Manuel Bottini2b84be52020-04-08 10:15:51 +0100179{
giuros01164a2722018-11-20 18:34:46 +0000180 auto k = arm_compute::support::cpp14::make_unique<CLArithmeticOperationKernel>();
Manuel Bottini2b84be52020-04-08 10:15:51 +0100181 k->configure(compile_context, ArithmeticOperation::MIN, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000182 _kernel = std::move(k);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100183 configure_border_handler(compile_context, _border_handler, _kernel->border_size(), input1, input2, output);
giuros01164a2722018-11-20 18:34:46 +0000184}
185
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000186Status CLElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
giuros01164a2722018-11-20 18:34:46 +0000187{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000188 return CLArithmeticOperationKernel::validate(ArithmeticOperation::MIN, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000189}
190
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100191void CLElementwiseMin::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace)
giuros01164a2722018-11-20 18:34:46 +0000192{
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100193 InputTensorMap src;
194 select_border_input(src, inputs, outputs);
195 CLScheduler::get().enqueue_op(_border_handler, src, {});
196 ICLOperator::run(inputs, outputs, workspace);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100197}
198
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100199CLElementwiseSquaredDiff::CLElementwiseSquaredDiff()
200 : _border_handler()
201{
202}
203
204void CLElementwiseSquaredDiff::configure(const CLCompileContext &compile_context, ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info)
Manuel Bottini2b84be52020-04-08 10:15:51 +0100205{
giuros01164a2722018-11-20 18:34:46 +0000206 auto k = arm_compute::support::cpp14::make_unique<CLArithmeticOperationKernel>();
Manuel Bottini2b84be52020-04-08 10:15:51 +0100207 k->configure(compile_context, ArithmeticOperation::SQUARED_DIFF, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000208 _kernel = std::move(k);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100209 configure_border_handler(compile_context, _border_handler, _kernel->border_size(), input1, input2, output);
giuros01164a2722018-11-20 18:34:46 +0000210}
211
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000212Status CLElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
giuros01164a2722018-11-20 18:34:46 +0000213{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000214 return CLArithmeticOperationKernel::validate(ArithmeticOperation::SQUARED_DIFF, input1, input2, output, act_info);
giuros01164a2722018-11-20 18:34:46 +0000215}
Usama Arif52c54f62019-05-14 10:22:36 +0100216
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100217void CLElementwiseSquaredDiff::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace)
Usama Arif52c54f62019-05-14 10:22:36 +0100218{
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100219 InputTensorMap src;
220 select_border_input(src, inputs, outputs);
221 CLScheduler::get().enqueue_op(_border_handler, src, {});
222 ICLOperator::run(inputs, outputs, workspace);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100223}
224
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100225CLElementwisePower::CLElementwisePower()
226 : _border_handler()
227{
228}
229
230void CLElementwisePower::configure(const CLCompileContext &compile_context, ITensorInfo *input1, ITensorInfo *input2, ITensorInfo *output, const ActivationLayerInfo &act_info)
Manuel Bottini2b84be52020-04-08 10:15:51 +0100231{
Usama Arif52c54f62019-05-14 10:22:36 +0100232 auto k = arm_compute::support::cpp14::make_unique<CLArithmeticOperationKernel>();
Manuel Bottini2b84be52020-04-08 10:15:51 +0100233 k->configure(compile_context, ArithmeticOperation::POWER, input1, input2, output, act_info);
Usama Arif52c54f62019-05-14 10:22:36 +0100234 _kernel = std::move(k);
Manuel Bottini2b84be52020-04-08 10:15:51 +0100235 configure_border_handler(compile_context, _border_handler, _kernel->border_size(), input1, input2, output);
Usama Arif52c54f62019-05-14 10:22:36 +0100236}
237
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000238Status CLElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
Usama Arif52c54f62019-05-14 10:22:36 +0100239{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000240 return CLArithmeticOperationKernel::validate(ArithmeticOperation::POWER, input1, input2, output, act_info);
Usama Arif52c54f62019-05-14 10:22:36 +0100241}
242
Michalis Spyrouad7515d2020-07-24 00:02:23 +0100243void CLElementwisePower::run(InputTensorMap inputs, OutputTensorMap outputs, OperatorTensorMap workspace)
244{
245 InputTensorMap src;
246 select_border_input(src, inputs, outputs);
247 CLScheduler::get().enqueue_op(_border_handler, src, {});
248 ICLOperator::run(inputs, outputs, workspace);
249}
250} // namespace experimental
251
252struct CLArithmeticAddition::Impl
253{
254 const ICLTensor *src_0{ nullptr };
255 const ICLTensor *src_1{ nullptr };
256 ICLTensor *dst{ nullptr };
257 std::unique_ptr<experimental::CLArithmeticAddition> op{ nullptr };
258};
259
260CLArithmeticAddition::CLArithmeticAddition()
261 : _impl(support::cpp14::make_unique<Impl>())
262{
263}
264CLArithmeticAddition::CLArithmeticAddition(CLArithmeticAddition &&) = default;
265CLArithmeticAddition &CLArithmeticAddition::operator=(CLArithmeticAddition &&) = default;
266CLArithmeticAddition::~CLArithmeticAddition() = default;
267
268void CLArithmeticAddition::configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, ConvertPolicy policy, const ActivationLayerInfo &act_info)
269{
270 configure(CLKernelLibrary::get().get_compile_context(), input1, input2, output, policy, act_info);
271}
272
273void CLArithmeticAddition::configure(const CLCompileContext &compile_context, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, ConvertPolicy policy,
274 const ActivationLayerInfo &act_info)
275{
276 _impl->src_0 = input1;
277 _impl->src_1 = input2;
278 _impl->dst = output;
279 _impl->op = arm_compute::support::cpp14::make_unique<experimental::CLArithmeticAddition>();
280 _impl->op->configure(compile_context, input1->info(), input2->info(), output->info(), policy, act_info);
281}
282
283Status CLArithmeticAddition::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info)
284{
285 return experimental::CLArithmeticAddition::validate(input1, input2, output, policy, act_info);
286}
287
288void CLArithmeticAddition::run()
289{
290 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
291 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
292
293 _impl->op->run(src, dst, {});
294}
295
296struct CLArithmeticSubtraction::Impl
297{
298 const ICLTensor *src_0{ nullptr };
299 const ICLTensor *src_1{ nullptr };
300 ICLTensor *dst{ nullptr };
301 std::unique_ptr<experimental::CLArithmeticSubtraction> op{ nullptr };
302};
303
304CLArithmeticSubtraction::CLArithmeticSubtraction()
305 : _impl(support::cpp14::make_unique<Impl>())
306{
307}
308CLArithmeticSubtraction::CLArithmeticSubtraction(CLArithmeticSubtraction &&) = default;
309CLArithmeticSubtraction &CLArithmeticSubtraction::operator=(CLArithmeticSubtraction &&) = default;
310CLArithmeticSubtraction::~CLArithmeticSubtraction() = default;
311
312void CLArithmeticSubtraction::configure(const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, ConvertPolicy policy, const ActivationLayerInfo &act_info)
313{
314 configure(CLKernelLibrary::get().get_compile_context(), input1, input2, output, policy, act_info);
315}
316
317void CLArithmeticSubtraction::configure(const CLCompileContext &compile_context, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, ConvertPolicy policy,
318 const ActivationLayerInfo &act_info)
319{
320 _impl->src_0 = input1;
321 _impl->src_1 = input2;
322 _impl->dst = output;
323 _impl->op = arm_compute::support::cpp14::make_unique<experimental::CLArithmeticSubtraction>();
324 _impl->op->configure(compile_context, input1->info(), input2->info(), output->info(), policy, act_info);
325}
326
327Status CLArithmeticSubtraction::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info)
328{
329 return experimental::CLArithmeticSubtraction::validate(input1, input2, output, policy, act_info);
330}
331
332void CLArithmeticSubtraction::run()
333{
334 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
335 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
336
337 _impl->op->run(src, dst, {});
338}
339
340struct CLArithmeticDivision::Impl
341{
342 const ICLTensor *src_0{ nullptr };
343 const ICLTensor *src_1{ nullptr };
344 ICLTensor *dst{ nullptr };
345 std::unique_ptr<experimental::CLArithmeticDivision> op{ nullptr };
346};
347
348CLArithmeticDivision::CLArithmeticDivision()
349 : _impl(support::cpp14::make_unique<Impl>())
350{
351}
352CLArithmeticDivision::CLArithmeticDivision(CLArithmeticDivision &&) = default;
353CLArithmeticDivision &CLArithmeticDivision::operator=(CLArithmeticDivision &&) = default;
354CLArithmeticDivision::~CLArithmeticDivision() = default;
355
356void CLArithmeticDivision::configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
357{
358 configure(CLKernelLibrary::get().get_compile_context(), input1, input2, output, act_info);
359}
360
361void CLArithmeticDivision::configure(const CLCompileContext &compile_context, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
362{
363 _impl->src_0 = input1;
364 _impl->src_1 = input2;
365 _impl->dst = output;
366 _impl->op = arm_compute::support::cpp14::make_unique<experimental::CLArithmeticDivision>();
367 _impl->op->configure(compile_context, input1->info(), input2->info(), output->info(), act_info);
368}
369
370Status CLArithmeticDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
371{
372 return experimental::CLArithmeticDivision::validate(input1, input2, output, act_info);
373}
374
375void CLArithmeticDivision::run()
376{
377 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
378 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
379
380 _impl->op->run(src, dst, {});
381}
382
383struct CLElementwiseMax::Impl
384{
385 const ICLTensor *src_0{ nullptr };
386 const ICLTensor *src_1{ nullptr };
387 ICLTensor *dst{ nullptr };
388 std::unique_ptr<experimental::CLElementwiseMax> op{ nullptr };
389};
390
391CLElementwiseMax::CLElementwiseMax()
392 : _impl(support::cpp14::make_unique<Impl>())
393{
394}
395CLElementwiseMax::CLElementwiseMax(CLElementwiseMax &&) = default;
396CLElementwiseMax &CLElementwiseMax::operator=(CLElementwiseMax &&) = default;
397CLElementwiseMax::~CLElementwiseMax() = default;
398
399void CLElementwiseMax::configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
400{
401 configure(CLKernelLibrary::get().get_compile_context(), input1, input2, output, act_info);
402}
403
404void CLElementwiseMax::configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
405{
406 _impl->src_0 = input1;
407 _impl->src_1 = input2;
408 _impl->dst = output;
409 _impl->op = arm_compute::support::cpp14::make_unique<experimental::CLElementwiseMax>();
410 _impl->op->configure(compile_context, input1->info(), input2->info(), output->info(), act_info);
411}
412
413Status CLElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
414{
415 return experimental::CLElementwiseMax::validate(input1, input2, output, act_info);
416}
417
418void CLElementwiseMax::run()
419{
420 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
421 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
422
423 _impl->op->run(src, dst, {});
424}
425
426struct CLElementwiseMin::Impl
427{
428 const ICLTensor *src_0{ nullptr };
429 const ICLTensor *src_1{ nullptr };
430 ICLTensor *dst{ nullptr };
431 std::unique_ptr<experimental::CLElementwiseMin> op{ nullptr };
432};
433
434CLElementwiseMin::CLElementwiseMin()
435 : _impl(support::cpp14::make_unique<Impl>())
436{
437}
438CLElementwiseMin::CLElementwiseMin(CLElementwiseMin &&) = default;
439CLElementwiseMin &CLElementwiseMin::operator=(CLElementwiseMin &&) = default;
440CLElementwiseMin::~CLElementwiseMin() = default;
441
442void CLElementwiseMin::configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
443{
444 configure(CLKernelLibrary::get().get_compile_context(), input1, input2, output, act_info);
445}
446
447void CLElementwiseMin::configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
448{
449 _impl->src_0 = input1;
450 _impl->src_1 = input2;
451 _impl->dst = output;
452 _impl->op = arm_compute::support::cpp14::make_unique<experimental::CLElementwiseMin>();
453 _impl->op->configure(compile_context, input1->info(), input2->info(), output->info(), act_info);
454}
455
456Status CLElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
457{
458 return experimental::CLElementwiseMin::validate(input1, input2, output, act_info);
459}
460
461void CLElementwiseMin::run()
462{
463 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
464 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
465
466 _impl->op->run(src, dst, {});
467}
468
469struct CLElementwiseSquaredDiff::Impl
470{
471 const ICLTensor *src_0{ nullptr };
472 const ICLTensor *src_1{ nullptr };
473 ICLTensor *dst{ nullptr };
474 std::unique_ptr<experimental::CLElementwiseSquaredDiff> op{ nullptr };
475 std::unique_ptr<CLFillBorderKernel> _border_handler{ nullptr };
476};
477
478CLElementwiseSquaredDiff::CLElementwiseSquaredDiff()
479 : _impl(support::cpp14::make_unique<Impl>())
480{
481}
482CLElementwiseSquaredDiff::CLElementwiseSquaredDiff(CLElementwiseSquaredDiff &&) = default;
483CLElementwiseSquaredDiff &CLElementwiseSquaredDiff::operator=(CLElementwiseSquaredDiff &&) = default;
484CLElementwiseSquaredDiff::~CLElementwiseSquaredDiff() = default;
485
486void CLElementwiseSquaredDiff::configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
487{
488 configure(CLKernelLibrary::get().get_compile_context(), input1, input2, output, act_info);
489}
490
491void CLElementwiseSquaredDiff::configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
492{
493 _impl->src_0 = input1;
494 _impl->src_1 = input2;
495 _impl->dst = output;
496 _impl->op = arm_compute::support::cpp14::make_unique<experimental::CLElementwiseSquaredDiff>();
497 _impl->op->configure(compile_context, input1->info(), input2->info(), output->info(), act_info);
498}
499
500Status CLElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
501{
502 return experimental::CLElementwiseSquaredDiff::validate(input1, input2, output, act_info);
503}
504
505void CLElementwiseSquaredDiff::run()
506{
507 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
508 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
509
510 _impl->op->run(src, dst, {});
511}
512
513struct CLElementwisePower::Impl
514{
515 const ICLTensor *src_0{ nullptr };
516 const ICLTensor *src_1{ nullptr };
517 ICLTensor *dst{ nullptr };
518 std::unique_ptr<experimental::CLElementwisePower> op{ nullptr };
519};
520
521CLElementwisePower::CLElementwisePower()
522 : _impl(support::cpp14::make_unique<Impl>())
523{
524}
525CLElementwisePower::CLElementwisePower(CLElementwisePower &&) = default;
526CLElementwisePower &CLElementwisePower::operator=(CLElementwisePower &&) = default;
527CLElementwisePower::~CLElementwisePower() = default;
528
529void CLElementwisePower::configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
530{
531 configure(CLKernelLibrary::get().get_compile_context(), input1, input2, output, act_info);
532}
533
534void CLElementwisePower::configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info)
535{
536 _impl->src_0 = input1;
537 _impl->src_1 = input2;
538 _impl->dst = output;
539 _impl->op = arm_compute::support::cpp14::make_unique<experimental::CLElementwisePower>();
540 _impl->op->configure(compile_context, input1->info(), input2->info(), output->info(), act_info);
541}
542
543Status CLElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
544{
545 return experimental::CLElementwisePower::validate(input1, input2, output, act_info);
546}
547
548void CLElementwisePower::run()
549{
550 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
551 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
552
553 _impl->op->run(src, dst, {});
554}
giuros01164a2722018-11-20 18:34:46 +0000555} // namespace arm_compute