blob: d1f60c71e1d6336292d185dbc265dce09061b258 [file] [log] [blame]
giuros0192fd9432018-12-03 17:30:00 +00001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2018-2020 Arm Limited.
giuros0192fd9432018-12-03 17:30:00 +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
George Wortd88590f2018-12-12 17:39:58 +000017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
giuros0192fd9432018-12-03 17:30:00 +000018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
George Wortd88590f2018-12-12 17:39:58 +000019 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
giuros0192fd9432018-12-03 17:30:00 +000020 * 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 */
morgolock781d7272020-01-10 10:11:14 +000024#include "arm_compute/core/Validate.h"
giuros0192fd9432018-12-03 17:30:00 +000025#include "arm_compute/runtime/NEON/functions/NEElementwiseOperations.h"
26#include <arm_compute/core/NEON/kernels/NEElementwiseOperationKernel.h>
27
28#include "arm_compute/core/ITensor.h"
Matthew Bentham758b5ba2020-03-05 23:37:48 +000029#include "support/MemorySupport.h"
giuros0192fd9432018-12-03 17:30:00 +000030
31#include <utility>
32
33namespace arm_compute
34{
Michalis Spyrouce0c6752020-06-18 10:14:57 +010035namespace experimental
36{
Georgios Pinitas09cad722020-07-22 12:11:20 +010037void NEElementwiseMax::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output)
giuros0192fd9432018-12-03 17:30:00 +000038{
39 auto k = arm_compute::support::cpp14::make_unique<NEArithmeticOperationKernel>();
40 k->configure(ArithmeticOperation::MAX, input1, input2, output);
41 _kernel = std::move(k);
42}
43
Georgios Pinitas09cad722020-07-22 12:11:20 +010044Status NEElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
giuros0192fd9432018-12-03 17:30:00 +000045{
46 return NEArithmeticOperationKernel::validate(ArithmeticOperation::MAX, input1, input2, output);
47}
48
Georgios Pinitas09cad722020-07-22 12:11:20 +010049void NEElementwiseMin::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output)
Michalis Spyrouce0c6752020-06-18 10:14:57 +010050{
giuros0192fd9432018-12-03 17:30:00 +000051 auto k = arm_compute::support::cpp14::make_unique<NEArithmeticOperationKernel>();
52 k->configure(ArithmeticOperation::MIN, input1, input2, output);
53 _kernel = std::move(k);
54}
55
Georgios Pinitas09cad722020-07-22 12:11:20 +010056Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
giuros0192fd9432018-12-03 17:30:00 +000057{
58 return NEArithmeticOperationKernel::validate(ArithmeticOperation::MIN, input1, input2, output);
59}
60
Georgios Pinitas09cad722020-07-22 12:11:20 +010061void NEElementwiseSquaredDiff::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output)
Michalis Spyrouce0c6752020-06-18 10:14:57 +010062{
giuros0192fd9432018-12-03 17:30:00 +000063 auto k = arm_compute::support::cpp14::make_unique<NEArithmeticOperationKernel>();
64 k->configure(ArithmeticOperation::SQUARED_DIFF, input1, input2, output);
65 _kernel = std::move(k);
66}
67
Georgios Pinitas09cad722020-07-22 12:11:20 +010068Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
giuros0192fd9432018-12-03 17:30:00 +000069{
70 return NEArithmeticOperationKernel::validate(ArithmeticOperation::SQUARED_DIFF, input1, input2, output);
71}
George Wortd88590f2018-12-12 17:39:58 +000072
Georgios Pinitas09cad722020-07-22 12:11:20 +010073void NEElementwiseDivision::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output)
Michalis Spyrouce0c6752020-06-18 10:14:57 +010074{
George Worta1e7e282019-01-15 11:00:29 +000075 auto k = arm_compute::support::cpp14::make_unique<NEDivisionOperationKernel>();
76 k->configure(input1, input2, output);
77 _kernel = std::move(k);
78}
79
Georgios Pinitas09cad722020-07-22 12:11:20 +010080Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
George Worta1e7e282019-01-15 11:00:29 +000081{
82 return NEDivisionOperationKernel::validate(input1, input2, output);
83}
84
Georgios Pinitas09cad722020-07-22 12:11:20 +010085void NEElementwisePower::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output)
Michalis Spyrouce0c6752020-06-18 10:14:57 +010086{
Usama Arif81e671e2019-05-13 13:33:14 +010087 auto k = arm_compute::support::cpp14::make_unique<NEPowerOperationKernel>();
88 k->configure(input1, input2, output);
89 _kernel = std::move(k);
90}
91
Georgios Pinitas09cad722020-07-22 12:11:20 +010092Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
Usama Arif81e671e2019-05-13 13:33:14 +010093{
94 return NEPowerOperationKernel::validate(input1, input2, output);
95}
96
George Wortd88590f2018-12-12 17:39:58 +000097template <ComparisonOperation COP>
Michalis Spyrouce0c6752020-06-18 10:14:57 +010098void NEElementwiseComparisonStatic<COP>::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output)
George Wortd88590f2018-12-12 17:39:58 +000099{
100 auto k = arm_compute::support::cpp14::make_unique<NEComparisonOperationKernel>();
101 k->configure(COP, input1, input2, output);
102 _kernel = std::move(k);
103}
104
105template <ComparisonOperation COP>
106Status NEElementwiseComparisonStatic<COP>::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
107{
108 return NEComparisonOperationKernel::validate(COP, input1, input2, output);
109}
110
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100111void NEElementwiseComparison::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, ComparisonOperation op)
George Wortd88590f2018-12-12 17:39:58 +0000112{
113 auto k = arm_compute::support::cpp14::make_unique<NEComparisonOperationKernel>();
114 k->configure(op, input1, input2, output);
115 _kernel = std::move(k);
116}
117
118Status NEElementwiseComparison::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op)
119{
120 return NEComparisonOperationKernel::validate(op, input1, input2, output);
121}
Georgios Pinitas83bbf772019-01-25 16:44:07 +0000122
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100123// Supported Specializations
124template class NEElementwiseComparisonStatic<ComparisonOperation::Equal>;
125template class NEElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
126template class NEElementwiseComparisonStatic<ComparisonOperation::Greater>;
127template class NEElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
128template class NEElementwiseComparisonStatic<ComparisonOperation::Less>;
129template class NEElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
130} // namespace experimental
131
132struct NEElementwiseMax::Impl
133{
134 const ITensor *src_0{ nullptr };
135 const ITensor *src_1{ nullptr };
136 ITensor *dst{ nullptr };
137 std::unique_ptr<experimental::NEElementwiseMax> op{ nullptr };
138};
139
140NEElementwiseMax::NEElementwiseMax()
141 : _impl(support::cpp14::make_unique<Impl>())
142{
143}
144NEElementwiseMax::NEElementwiseMax(NEElementwiseMax &&) = default;
145NEElementwiseMax &NEElementwiseMax::operator=(NEElementwiseMax &&) = default;
146NEElementwiseMax::~NEElementwiseMax() = default;
147
148void NEElementwiseMax::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
149{
Georgios Pinitas09cad722020-07-22 12:11:20 +0100150 ARM_COMPUTE_UNUSED(act_info);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100151 _impl->src_0 = input1;
152 _impl->src_1 = input2;
153 _impl->dst = output;
154 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseMax>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100155 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100156}
157
158Status NEElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
159{
160 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100161 return experimental::NEElementwiseMax::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100162}
163
164void NEElementwiseMax::run()
165{
Georgios Pinitas0499dff2020-07-31 22:21:38 +0100166 ITensorPack pack;
167 pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
168 pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
169 pack.add_tensor(TensorType::ACL_DST, _impl->dst);
170 _impl->op->run(pack);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100171}
172
173struct NEElementwiseMin::Impl
174{
175 const ITensor *src_0{ nullptr };
176 const ITensor *src_1{ nullptr };
177 ITensor *dst{ nullptr };
178 std::unique_ptr<experimental::NEElementwiseMin> op{ nullptr };
179};
180
181NEElementwiseMin::NEElementwiseMin()
182 : _impl(support::cpp14::make_unique<Impl>())
183{
184}
185NEElementwiseMin::NEElementwiseMin(NEElementwiseMin &&) = default;
186NEElementwiseMin &NEElementwiseMin::operator=(NEElementwiseMin &&) = default;
187NEElementwiseMin::~NEElementwiseMin() = default;
188
189void NEElementwiseMin::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
190{
Georgios Pinitas09cad722020-07-22 12:11:20 +0100191 ARM_COMPUTE_UNUSED(act_info);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100192 _impl->src_0 = input1;
193 _impl->src_1 = input2;
194 _impl->dst = output;
195 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseMin>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100196 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100197}
198
199Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
200{
201 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100202 return experimental::NEElementwiseMin::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100203}
204
205void NEElementwiseMin::run()
206{
Georgios Pinitas0499dff2020-07-31 22:21:38 +0100207 ITensorPack pack;
208 pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
209 pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
210 pack.add_tensor(TensorType::ACL_DST, _impl->dst);
211 _impl->op->run(pack);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100212}
213
214struct NEElementwiseSquaredDiff::Impl
215{
216 const ITensor *src_0{ nullptr };
217 const ITensor *src_1{ nullptr };
218 ITensor *dst{ nullptr };
219 std::unique_ptr<experimental::NEElementwiseSquaredDiff> op{ nullptr };
220};
221
222NEElementwiseSquaredDiff::NEElementwiseSquaredDiff()
223 : _impl(support::cpp14::make_unique<Impl>())
224{
225}
226NEElementwiseSquaredDiff::NEElementwiseSquaredDiff(NEElementwiseSquaredDiff &&) = default;
227NEElementwiseSquaredDiff &NEElementwiseSquaredDiff::operator=(NEElementwiseSquaredDiff &&) = default;
228NEElementwiseSquaredDiff::~NEElementwiseSquaredDiff() = default;
229
230void NEElementwiseSquaredDiff::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
231{
Georgios Pinitas09cad722020-07-22 12:11:20 +0100232 ARM_COMPUTE_UNUSED(act_info);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100233 _impl->src_0 = input1;
234 _impl->src_1 = input2;
235 _impl->dst = output;
236 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseSquaredDiff>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100237 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100238}
239
240Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
241{
242 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100243 return experimental::NEElementwiseSquaredDiff::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100244}
245
246void NEElementwiseSquaredDiff::run()
247{
Georgios Pinitas0499dff2020-07-31 22:21:38 +0100248 ITensorPack pack;
249 pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
250 pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
251 pack.add_tensor(TensorType::ACL_DST, _impl->dst);
252 _impl->op->run(pack);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100253}
254
255struct NEElementwiseDivision::Impl
256{
257 const ITensor *src_0{ nullptr };
258 const ITensor *src_1{ nullptr };
259 ITensor *dst{ nullptr };
260 std::unique_ptr<experimental::NEElementwiseDivision> op{ nullptr };
261};
262
263NEElementwiseDivision::NEElementwiseDivision()
264 : _impl(support::cpp14::make_unique<Impl>())
265{
266}
267NEElementwiseDivision::NEElementwiseDivision(NEElementwiseDivision &&) = default;
268NEElementwiseDivision &NEElementwiseDivision::operator=(NEElementwiseDivision &&) = default;
269NEElementwiseDivision::~NEElementwiseDivision() = default;
270
271void NEElementwiseDivision::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
272{
273 ARM_COMPUTE_UNUSED(act_info);
274 _impl->src_0 = input1;
275 _impl->src_1 = input2;
276 _impl->dst = output;
277 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseDivision>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100278 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100279}
280
281Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
282{
283 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100284 return experimental::NEElementwiseDivision::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100285}
286
287void NEElementwiseDivision::run()
288{
Georgios Pinitas0499dff2020-07-31 22:21:38 +0100289 ITensorPack pack;
290 pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
291 pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
292 pack.add_tensor(TensorType::ACL_DST, _impl->dst);
293 _impl->op->run(pack);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100294}
295
296struct NEElementwisePower::Impl
297{
298 const ITensor *src_0{ nullptr };
299 const ITensor *src_1{ nullptr };
300 ITensor *dst{ nullptr };
301 std::unique_ptr<experimental::NEElementwisePower> op{ nullptr };
302};
303
304NEElementwisePower::NEElementwisePower()
305 : _impl(support::cpp14::make_unique<Impl>())
306{
307}
308NEElementwisePower::NEElementwisePower(NEElementwisePower &&) = default;
309NEElementwisePower &NEElementwisePower::operator=(NEElementwisePower &&) = default;
310NEElementwisePower::~NEElementwisePower() = default;
311
312void NEElementwisePower::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
313{
314 ARM_COMPUTE_UNUSED(act_info);
315 _impl->src_0 = input1;
316 _impl->src_1 = input2;
317 _impl->dst = output;
318 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwisePower>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100319 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100320}
321
322Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
323{
324 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100325 return experimental::NEElementwisePower::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100326}
327
328void NEElementwisePower::run()
329{
Georgios Pinitas0499dff2020-07-31 22:21:38 +0100330 ITensorPack pack;
331 pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
332 pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
333 pack.add_tensor(TensorType::ACL_DST, _impl->dst);
334 _impl->op->run(pack);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100335}
336
337template <ComparisonOperation COP>
338struct NEElementwiseComparisonStatic<COP>::Impl
339{
340 const ITensor *src_0{ nullptr };
341 const ITensor *src_1{ nullptr };
342 ITensor *dst{ nullptr };
343 std::unique_ptr<experimental::NEElementwiseComparisonStatic<COP>> op{ nullptr };
344};
345
346template <ComparisonOperation COP>
347NEElementwiseComparisonStatic<COP>::NEElementwiseComparisonStatic()
348 : _impl(support::cpp14::make_unique<Impl>())
349{
350}
351template <ComparisonOperation COP>
352NEElementwiseComparisonStatic<COP>::NEElementwiseComparisonStatic(NEElementwiseComparisonStatic &&) = default;
353template <ComparisonOperation COP>
354NEElementwiseComparisonStatic<COP> &NEElementwiseComparisonStatic<COP>::operator=(NEElementwiseComparisonStatic &&) = default;
355template <ComparisonOperation COP>
356NEElementwiseComparisonStatic<COP>::~NEElementwiseComparisonStatic() = default;
357
358template <ComparisonOperation COP>
359void NEElementwiseComparisonStatic<COP>::configure(ITensor *input1, ITensor *input2, ITensor *output)
360{
361 _impl->src_0 = input1;
362 _impl->src_1 = input2;
363 _impl->dst = output;
364 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseComparisonStatic<COP>>();
365 _impl->op->configure(input1->info(), input2->info(), output->info());
366}
367
368template <ComparisonOperation COP>
369Status NEElementwiseComparisonStatic<COP>::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
370{
371 return experimental::NEElementwiseComparisonStatic<COP>::validate(input1, input2, output);
372}
373
374template <ComparisonOperation COP>
375void NEElementwiseComparisonStatic<COP>::run()
376{
Georgios Pinitas0499dff2020-07-31 22:21:38 +0100377 ITensorPack pack;
378 pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
379 pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
380 pack.add_tensor(TensorType::ACL_DST, _impl->dst);
381 _impl->op->run(pack);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100382}
383
384struct NEElementwiseComparison::Impl
385{
386 const ITensor *src_0{ nullptr };
387 const ITensor *src_1{ nullptr };
388 ITensor *dst{ nullptr };
389 std::unique_ptr<experimental::NEElementwiseComparison> op{ nullptr };
390};
391
392NEElementwiseComparison::NEElementwiseComparison()
393 : _impl(support::cpp14::make_unique<Impl>())
394{
395}
396NEElementwiseComparison::NEElementwiseComparison(NEElementwiseComparison &&) = default;
397NEElementwiseComparison &NEElementwiseComparison::operator=(NEElementwiseComparison &&) = default;
398NEElementwiseComparison::~NEElementwiseComparison() = default;
399
400void NEElementwiseComparison::configure(ITensor *input1, ITensor *input2, ITensor *output, ComparisonOperation op)
401{
402 _impl->src_0 = input1;
403 _impl->src_1 = input2;
404 _impl->dst = output;
405 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseComparison>();
406 _impl->op->configure(input1->info(), input2->info(), output->info(), op);
407}
408
409Status NEElementwiseComparison::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op)
410{
411 return experimental::NEElementwiseComparison::validate(input1, input2, output, op);
412}
413
414void NEElementwiseComparison::run()
415{
Georgios Pinitas0499dff2020-07-31 22:21:38 +0100416 ITensorPack pack;
417 pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
418 pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
419 pack.add_tensor(TensorType::ACL_DST, _impl->dst);
420 _impl->op->run(pack);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100421}
422
Georgios Pinitas83bbf772019-01-25 16:44:07 +0000423// Supported Specializations
424template class NEElementwiseComparisonStatic<ComparisonOperation::Equal>;
425template class NEElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
426template class NEElementwiseComparisonStatic<ComparisonOperation::Greater>;
427template class NEElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
428template class NEElementwiseComparisonStatic<ComparisonOperation::Less>;
429template class NEElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
giuros0192fd9432018-12-03 17:30:00 +0000430} // namespace arm_compute