ArmNN
 25.02
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
NeonFloorDivWorkload Class Reference

#include <NeonFloorDivWorkload.hpp>

Inheritance diagram for NeonFloorDivWorkload:
[legend]
Collaboration diagram for NeonFloorDivWorkload:
[legend]

Public Member Functions

 NeonFloorDivWorkload (const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info)
 
virtual void Execute () const override
 
- Public Member Functions inherited from NeonBaseWorkload< DivisionQueueDescriptor >
 NeonBaseWorkload (const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info)
 
void ReplaceInputTensorHandle (ITensorHandle *tensorHandle, unsigned int slot) override
 
void ReplaceOutputTensorHandle (ITensorHandle *tensorHandle, unsigned int slot) override
 
- Public Member Functions inherited from BaseWorkload< QueueDescriptor >
 BaseWorkload (const QueueDescriptor &descriptor, const WorkloadInfo &info)
 
virtual const std::string & GetName () const override
 
void PostAllocationConfigure () override
 
const QueueDescriptorGetData () const
 
arm::pipe::ProfilingGuid GetGuid () const final
 
virtual bool SupportsTensorHandleReplacement () const override
 
- Public Member Functions inherited from IWorkload
virtual ~IWorkload ()
 
virtual void RegisterDebugCallback (const DebugCallbackFunction &)
 
virtual armnn::Optional< armnn::MemoryRequirementsGetMemoryRequirements ()
 

Additional Inherited Members

- Protected Member Functions inherited from NeonBaseWorkload< DivisionQueueDescriptor >
virtual void Reconfigure ()
 
- Protected Attributes inherited from BaseWorkload< QueueDescriptor >
QueueDescriptor m_Data
 
const arm::pipe::ProfilingGuid m_Guid
 
const std::string m_Name
 

Detailed Description

Definition at line 26 of file NeonFloorDivWorkload.hpp.

Constructor & Destructor Documentation

◆ NeonFloorDivWorkload()

NeonFloorDivWorkload ( const DivisionQueueDescriptor descriptor,
const WorkloadInfo info 
)

Definition at line 129 of file NeonFloorDivWorkload.cpp.

131  : NeonBaseWorkload<DivisionQueueDescriptor>(descriptor, info)
132 {
133  m_Data.ValidateInputsOutputs("NeonFloorDivWorkload", 2, 1);
134 
135  TensorInfo input0Info = info.m_InputTensorInfos[0];
136  TensorInfo input1Info = info.m_InputTensorInfos[1];
137  TensorInfo outputInfo = info.m_OutputTensorInfos[0];
138 
139  arm_compute::ITensor& input0 = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
140  arm_compute::ITensor& input1 = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[1])->GetTensor();
141  arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
142 
143  // Get data type of input and output
144  arm_compute::DataType inputDataType = PolymorphicDowncast<NeonTensorHandle*>(m_Data.m_Inputs[0])->GetDataType();
145  arm_compute::DataType outputDataType = PolymorphicDowncast<NeonTensorHandle*>(m_Data.m_Outputs[0])->GetDataType();
146 
147  const arm_compute::ActivationLayerInfo activationInfo =
149 
150  // If Tensors are Signed32 we need to Cast them to floats, this is to ensure we get the correct
151  // output if the result is a negative number, as we should floor towards -(infinity)
152  if(inputDataType == arm_compute::DataType::S32 && outputDataType == arm_compute::DataType::S32)
153  {
154  // Create new Cast layer pointers if type is S32
155  m_CastLayer0.reset(new arm_compute::NECast());
156  m_CastLayer1.reset(new arm_compute::NECast());
157  m_CastLayer2.reset(new arm_compute::NECast());
158 
159  // Cast Input 0 to type float32
160  TensorInfo outputCast0_Info = ConvertTensorToFloat32(input0Info);
161 
162  // Initialise output tensor based on Float32 type
163  BuildArmComputeTensor(m_OutputCast0, outputCast0_Info);
164  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputCast0);
165 
166  // Configure first Cast Layer
167  m_CastLayer0->configure(&input0, &m_OutputCast0, arm_compute::ConvertPolicy::WRAP);
168 
169  // Cast Input 1 to type Float32
170  TensorInfo outputCast1_Info = ConvertTensorToFloat32(input1Info);
171 
172  // Initialise Output tensor based on Float32 type
173  BuildArmComputeTensor(m_OutputCast1, outputCast1_Info);
174  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputCast1);
175 
176  // Configure second Cast Layer
177  m_CastLayer1->configure(&input1, &m_OutputCast1, arm_compute::ConvertPolicy::WRAP);
178 
179  // Create Div output tensor
180  TensorInfo outputDiv_Info = ConvertTensorToFloat32(outputInfo);
181  BuildArmComputeTensor(m_OutputDiv, outputDiv_Info);
182  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputDiv);
183 
184  // Configure Div Layer
185  m_DivLayer.configure(&m_OutputCast0, &m_OutputCast1, &m_OutputDiv, activationInfo);
186 
187  // Create Floor output tensor
188  BuildArmComputeTensor(m_OutputFloor, outputDiv_Info);
189  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputFloor);
190 
191  // Configure Floor Layer
192  m_FloorLayer.configure(&m_OutputDiv, &m_OutputFloor);
193 
194  // Configure third Cast Layer
195  m_CastLayer2->configure(&m_OutputFloor, &output, arm_compute::ConvertPolicy::WRAP);
196  }
197  else
198  {
199  // Create Div output tensor
200  BuildArmComputeTensor(m_OutputDiv, outputInfo);
201  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputDiv);
202 
203  // Configure Div Layer
204  m_DivLayer.configure(&input0, &input1, &m_OutputDiv, activationInfo);
205 
206  // Configure Floor Layer
207  m_FloorLayer.configure(&m_OutputDiv, &output);
208  }
209 }
QueueDescriptor m_Data
Definition: Workload.hpp:74
arm_compute::ActivationLayerInfo ConvertAdditionalInfoToAclActivationLayerInfo(const QueueDescriptor &queueDescriptor)
DataType
Definition: Types.hpp:49
TensorInfo ConvertTensorToFloat32(const TensorInfo &tensorInfo)
Utility function used for the two cast layer inputs to convert the output layer tensor types.
std::vector< ITensorHandle * > m_Inputs
std::vector< ITensorHandle * > m_Outputs
void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const

References armnn::ConvertAdditionalInfoToAclActivationLayerInfo(), armnn::ConvertTensorToFloat32(), armnn::info, BaseWorkload< QueueDescriptor >::m_Data, QueueDescriptor::m_Inputs, QueueDescriptor::m_Outputs, and QueueDescriptor::ValidateInputsOutputs().

Member Function Documentation

◆ Execute()

void Execute ( ) const
overridevirtual

Implements IWorkload.

Definition at line 211 of file NeonFloorDivWorkload.cpp.

212 {
213  ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID("NeonFloorDivWorkload_Execute");
214  // Only run Cast Layers if needed. e.g. if it exists
215  if(m_CastLayer0 && m_CastLayer1)
216  {
217  m_CastLayer0->run();
218  m_CastLayer1->run();
219 
220  // Delete objects after running
221  m_CastLayer0.reset();
222  m_CastLayer1.reset();
223  }
224  m_DivLayer.run();
225  m_FloorLayer.run();
226  if(m_CastLayer2)
227  {
228  m_CastLayer2->run();
229 
230  // Delete object after running layer
231  m_CastLayer2.reset();
232  }
233 }
#define ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID(label)
Creates a profiling event that uses GetGuid() and GetName() from the calling class.

References ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID.


The documentation for this class was generated from the following files: