blob: 9340cc09d41546046f1f37d3943f6d5cdc8e9ed0 [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{
166 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
167 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
168 _impl->op->run(src, dst, {});
169}
170
171struct NEElementwiseMin::Impl
172{
173 const ITensor *src_0{ nullptr };
174 const ITensor *src_1{ nullptr };
175 ITensor *dst{ nullptr };
176 std::unique_ptr<experimental::NEElementwiseMin> op{ nullptr };
177};
178
179NEElementwiseMin::NEElementwiseMin()
180 : _impl(support::cpp14::make_unique<Impl>())
181{
182}
183NEElementwiseMin::NEElementwiseMin(NEElementwiseMin &&) = default;
184NEElementwiseMin &NEElementwiseMin::operator=(NEElementwiseMin &&) = default;
185NEElementwiseMin::~NEElementwiseMin() = default;
186
187void NEElementwiseMin::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
188{
Georgios Pinitas09cad722020-07-22 12:11:20 +0100189 ARM_COMPUTE_UNUSED(act_info);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100190 _impl->src_0 = input1;
191 _impl->src_1 = input2;
192 _impl->dst = output;
193 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseMin>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100194 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100195}
196
197Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
198{
199 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100200 return experimental::NEElementwiseMin::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100201}
202
203void NEElementwiseMin::run()
204{
205 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
206 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
207 _impl->op->run(src, dst, {});
208}
209
210struct NEElementwiseSquaredDiff::Impl
211{
212 const ITensor *src_0{ nullptr };
213 const ITensor *src_1{ nullptr };
214 ITensor *dst{ nullptr };
215 std::unique_ptr<experimental::NEElementwiseSquaredDiff> op{ nullptr };
216};
217
218NEElementwiseSquaredDiff::NEElementwiseSquaredDiff()
219 : _impl(support::cpp14::make_unique<Impl>())
220{
221}
222NEElementwiseSquaredDiff::NEElementwiseSquaredDiff(NEElementwiseSquaredDiff &&) = default;
223NEElementwiseSquaredDiff &NEElementwiseSquaredDiff::operator=(NEElementwiseSquaredDiff &&) = default;
224NEElementwiseSquaredDiff::~NEElementwiseSquaredDiff() = default;
225
226void NEElementwiseSquaredDiff::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
227{
Georgios Pinitas09cad722020-07-22 12:11:20 +0100228 ARM_COMPUTE_UNUSED(act_info);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100229 _impl->src_0 = input1;
230 _impl->src_1 = input2;
231 _impl->dst = output;
232 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseSquaredDiff>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100233 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100234}
235
236Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
237{
238 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100239 return experimental::NEElementwiseSquaredDiff::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100240}
241
242void NEElementwiseSquaredDiff::run()
243{
244 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
245 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
246 _impl->op->run(src, dst, {});
247}
248
249struct NEElementwiseDivision::Impl
250{
251 const ITensor *src_0{ nullptr };
252 const ITensor *src_1{ nullptr };
253 ITensor *dst{ nullptr };
254 std::unique_ptr<experimental::NEElementwiseDivision> op{ nullptr };
255};
256
257NEElementwiseDivision::NEElementwiseDivision()
258 : _impl(support::cpp14::make_unique<Impl>())
259{
260}
261NEElementwiseDivision::NEElementwiseDivision(NEElementwiseDivision &&) = default;
262NEElementwiseDivision &NEElementwiseDivision::operator=(NEElementwiseDivision &&) = default;
263NEElementwiseDivision::~NEElementwiseDivision() = default;
264
265void NEElementwiseDivision::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
266{
267 ARM_COMPUTE_UNUSED(act_info);
268 _impl->src_0 = input1;
269 _impl->src_1 = input2;
270 _impl->dst = output;
271 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseDivision>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100272 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100273}
274
275Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
276{
277 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100278 return experimental::NEElementwiseDivision::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100279}
280
281void NEElementwiseDivision::run()
282{
283 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
284 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
285 _impl->op->run(src, dst, {});
286}
287
288struct NEElementwisePower::Impl
289{
290 const ITensor *src_0{ nullptr };
291 const ITensor *src_1{ nullptr };
292 ITensor *dst{ nullptr };
293 std::unique_ptr<experimental::NEElementwisePower> op{ nullptr };
294};
295
296NEElementwisePower::NEElementwisePower()
297 : _impl(support::cpp14::make_unique<Impl>())
298{
299}
300NEElementwisePower::NEElementwisePower(NEElementwisePower &&) = default;
301NEElementwisePower &NEElementwisePower::operator=(NEElementwisePower &&) = default;
302NEElementwisePower::~NEElementwisePower() = default;
303
304void NEElementwisePower::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
305{
306 ARM_COMPUTE_UNUSED(act_info);
307 _impl->src_0 = input1;
308 _impl->src_1 = input2;
309 _impl->dst = output;
310 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwisePower>();
Georgios Pinitas09cad722020-07-22 12:11:20 +0100311 _impl->op->configure(input1->info(), input2->info(), output->info());
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100312}
313
314Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
315{
316 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Georgios Pinitas09cad722020-07-22 12:11:20 +0100317 return experimental::NEElementwisePower::validate(input1, input2, output);
Michalis Spyrouce0c6752020-06-18 10:14:57 +0100318}
319
320void NEElementwisePower::run()
321{
322 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
323 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
324 _impl->op->run(src, dst, {});
325}
326
327template <ComparisonOperation COP>
328struct NEElementwiseComparisonStatic<COP>::Impl
329{
330 const ITensor *src_0{ nullptr };
331 const ITensor *src_1{ nullptr };
332 ITensor *dst{ nullptr };
333 std::unique_ptr<experimental::NEElementwiseComparisonStatic<COP>> op{ nullptr };
334};
335
336template <ComparisonOperation COP>
337NEElementwiseComparisonStatic<COP>::NEElementwiseComparisonStatic()
338 : _impl(support::cpp14::make_unique<Impl>())
339{
340}
341template <ComparisonOperation COP>
342NEElementwiseComparisonStatic<COP>::NEElementwiseComparisonStatic(NEElementwiseComparisonStatic &&) = default;
343template <ComparisonOperation COP>
344NEElementwiseComparisonStatic<COP> &NEElementwiseComparisonStatic<COP>::operator=(NEElementwiseComparisonStatic &&) = default;
345template <ComparisonOperation COP>
346NEElementwiseComparisonStatic<COP>::~NEElementwiseComparisonStatic() = default;
347
348template <ComparisonOperation COP>
349void NEElementwiseComparisonStatic<COP>::configure(ITensor *input1, ITensor *input2, ITensor *output)
350{
351 _impl->src_0 = input1;
352 _impl->src_1 = input2;
353 _impl->dst = output;
354 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseComparisonStatic<COP>>();
355 _impl->op->configure(input1->info(), input2->info(), output->info());
356}
357
358template <ComparisonOperation COP>
359Status NEElementwiseComparisonStatic<COP>::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
360{
361 return experimental::NEElementwiseComparisonStatic<COP>::validate(input1, input2, output);
362}
363
364template <ComparisonOperation COP>
365void NEElementwiseComparisonStatic<COP>::run()
366{
367 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
368 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
369 _impl->op->run(src, dst, {});
370}
371
372struct NEElementwiseComparison::Impl
373{
374 const ITensor *src_0{ nullptr };
375 const ITensor *src_1{ nullptr };
376 ITensor *dst{ nullptr };
377 std::unique_ptr<experimental::NEElementwiseComparison> op{ nullptr };
378};
379
380NEElementwiseComparison::NEElementwiseComparison()
381 : _impl(support::cpp14::make_unique<Impl>())
382{
383}
384NEElementwiseComparison::NEElementwiseComparison(NEElementwiseComparison &&) = default;
385NEElementwiseComparison &NEElementwiseComparison::operator=(NEElementwiseComparison &&) = default;
386NEElementwiseComparison::~NEElementwiseComparison() = default;
387
388void NEElementwiseComparison::configure(ITensor *input1, ITensor *input2, ITensor *output, ComparisonOperation op)
389{
390 _impl->src_0 = input1;
391 _impl->src_1 = input2;
392 _impl->dst = output;
393 _impl->op = arm_compute::support::cpp14::make_unique<experimental::NEElementwiseComparison>();
394 _impl->op->configure(input1->info(), input2->info(), output->info(), op);
395}
396
397Status NEElementwiseComparison::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op)
398{
399 return experimental::NEElementwiseComparison::validate(input1, input2, output, op);
400}
401
402void NEElementwiseComparison::run()
403{
404 const InputTensorMap src{ { TensorType::ACL_SRC_0, _impl->src_0 }, { TensorType::ACL_SRC_1, _impl->src_1 } };
405 const OutputTensorMap dst{ { TensorType::ACL_DST, _impl->dst } };
406 _impl->op->run(src, dst, {});
407}
408
Georgios Pinitas83bbf772019-01-25 16:44:07 +0000409// Supported Specializations
410template class NEElementwiseComparisonStatic<ComparisonOperation::Equal>;
411template class NEElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
412template class NEElementwiseComparisonStatic<ComparisonOperation::Greater>;
413template class NEElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
414template class NEElementwiseComparisonStatic<ComparisonOperation::Less>;
415template class NEElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
giuros0192fd9432018-12-03 17:30:00 +0000416} // namespace arm_compute