ArmNN
 25.11
Loading...
Searching...
No Matches
ClFloorDivWorkload Class Reference

#include <ClFloorDivWorkload.hpp>

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

Public Member Functions

 ClFloorDivWorkload (const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info, const arm_compute::CLCompileContext &clCompileContext)
virtual void Execute () const override
Public Member Functions inherited from ClBaseWorkload< DivisionQueueDescriptor >
 ClBaseWorkload (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< DivisionQueueDescriptor >
 BaseWorkload (const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info)
virtual const std::string & GetName () const override
void PostAllocationConfigure () override
const DivisionQueueDescriptorGetData () 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 ClBaseWorkload< DivisionQueueDescriptor >
virtual void Reconfigure ()
Protected Attributes inherited from BaseWorkload< DivisionQueueDescriptor >
DivisionQueueDescriptor m_Data
const arm::pipe::ProfilingGuid m_Guid
const std::string m_Name

Detailed Description

Definition at line 24 of file ClFloorDivWorkload.hpp.

Constructor & Destructor Documentation

◆ ClFloorDivWorkload()

ClFloorDivWorkload ( const DivisionQueueDescriptor & descriptor,
const WorkloadInfo & info,
const arm_compute::CLCompileContext & clCompileContext )

Definition at line 132 of file ClFloorDivWorkload.cpp.

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

References ClBaseWorkload< DivisionQueueDescriptor >::ClBaseWorkload(), armnn::ConvertAdditionalInfoToAclActivationLayerInfo(), armnn::ConvertTensorToFloat32(), armnn::info, BaseWorkload< DivisionQueueDescriptor >::m_Data, and armnn::PolymorphicDowncast().

Member Function Documentation

◆ Execute()

void Execute ( ) const
overridevirtual

Implements IWorkload.

Definition at line 215 of file ClFloorDivWorkload.cpp.

216{
217 ARMNN_SCOPED_PROFILING_EVENT_CL_NAME_GUID("ClFloorDivWorkload_Execute");
218 // Only run Cast Layers if needed. e.g. if it exists
219 if(m_CastLayer0 && m_CastLayer1)
220 {
221 m_CastLayer0->run();
222 m_CastLayer1->run();
223
224 // Delete objects after running layer
225 m_CastLayer0.reset();
226 m_CastLayer1.reset();
227 }
228 RunClFunction(m_DivLayer, CHECK_LOCATION());
229 RunClFunction(m_FloorLayer, CHECK_LOCATION());
230 if(m_CastLayer2)
231 {
232 m_CastLayer2->run();
233
234 // Delete object after running layer
235 m_CastLayer2.reset();
236 }
237}
#define ARMNN_SCOPED_PROFILING_EVENT_CL_NAME_GUID(label)
Creates a profiling event that uses GetGuid() and GetName() from the calling class.
#define CHECK_LOCATION()
void RunClFunction(arm_compute::IFunction &function, const CheckLocation &location)

References ARMNN_SCOPED_PROFILING_EVENT_CL_NAME_GUID, CHECK_LOCATION, and armnn::RunClFunction().


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