blob: ccc2bfe58bb8fe88c68a7e3df7badabde12d858f [file] [log] [blame]
David Beckbc392452018-09-10 14:47:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Conor Kennedyb99480b2019-03-08 08:24:41 +00006#include "NeonSubtractionWorkload.hpp"
Matthew Benthamd80a7122019-01-08 17:52:37 +00007
8#include "NeonWorkloadUtils.hpp"
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <aclCommon/ArmComputeTensorUtils.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +010010#include <armnn/utility/PolymorphicDowncast.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000011#include <backendsCommon/CpuTensorHandle.hpp>
David Beckbc392452018-09-10 14:47:28 +010012
Matthew Benthamd80a7122019-01-08 17:52:37 +000013#include <arm_compute/runtime/NEON/functions/NEArithmeticSubtraction.h>
14
David Beckbc392452018-09-10 14:47:28 +010015namespace armnn
16{
17
18arm_compute::Status NeonSubtractionWorkloadValidate(const TensorInfo& input0,
19 const TensorInfo& input1,
20 const TensorInfo& output)
21{
22 const arm_compute::TensorInfo aclInput0 = armcomputetensorutils::BuildArmComputeTensorInfo(input0);
23 const arm_compute::TensorInfo aclInput1 = armcomputetensorutils::BuildArmComputeTensorInfo(input1);
24 const arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output);
25
26 return arm_compute::NEArithmeticSubtraction::validate(&aclInput0,
27 &aclInput1,
28 &aclOutput,
29 arm_compute::ConvertPolicy::SATURATE);
30}
31
Conor Kennedyb99480b2019-03-08 08:24:41 +000032NeonSubtractionWorkload::NeonSubtractionWorkload(const SubtractionQueueDescriptor& descriptor,
33 const WorkloadInfo& info)
34 : BaseWorkload<SubtractionQueueDescriptor>(descriptor, info)
David Beckbc392452018-09-10 14:47:28 +010035{
Conor Kennedyb99480b2019-03-08 08:24:41 +000036 m_Data.ValidateInputsOutputs("NeonSubtractionWorkload", 2, 1);
David Beckbc392452018-09-10 14:47:28 +010037
Jan Eilersbb446e52020-04-02 13:56:54 +010038 arm_compute::ITensor& input1 = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
39 arm_compute::ITensor& input2 = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[1])->GetTensor();
40 arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
David Beckbc392452018-09-10 14:47:28 +010041
Matthew Benthamd80a7122019-01-08 17:52:37 +000042 auto layer = std::make_unique<arm_compute::NEArithmeticSubtraction>();
43 layer->configure(&input1, &input2, &output, arm_compute::ConvertPolicy::SATURATE);
44 m_SubLayer.reset(layer.release());
David Beckbc392452018-09-10 14:47:28 +010045}
46
Conor Kennedyb99480b2019-03-08 08:24:41 +000047void NeonSubtractionWorkload::Execute() const
David Beckbc392452018-09-10 14:47:28 +010048{
Conor Kennedyb99480b2019-03-08 08:24:41 +000049 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonSubtractionWorkload_Execute");
Matthew Benthamd80a7122019-01-08 17:52:37 +000050 m_SubLayer->run();
David Beckbc392452018-09-10 14:47:28 +010051}
52
53} //namespace armnn