ArmNN
 23.02
ClBatchMatMulWorkload Class Reference

#include <ClBatchMatMulWorkload.hpp>

Inheritance diagram for ClBatchMatMulWorkload:
ClBaseWorkload< BatchMatMulQueueDescriptor > BaseWorkload< BatchMatMulQueueDescriptor > IWorkload

Public Member Functions

 ClBatchMatMulWorkload (const BatchMatMulQueueDescriptor &descriptor, const WorkloadInfo &info, const arm_compute::CLCompileContext &clCompileContext)
 
virtual void Execute () const override
 
- Public Member Functions inherited from ClBaseWorkload< BatchMatMulQueueDescriptor >
 ClBaseWorkload (const BatchMatMulQueueDescriptor &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< BatchMatMulQueueDescriptor >
 BaseWorkload (const BatchMatMulQueueDescriptor &descriptor, const WorkloadInfo &info)
 
void ExecuteAsync (ExecutionData &executionData) override
 
void PostAllocationConfigure () override
 
const BatchMatMulQueueDescriptorGetData () const
 
arm::pipe::ProfilingGuid GetGuid () const final
 
virtual bool SupportsTensorHandleReplacement () const override
 
- Public Member Functions inherited from IWorkload
virtual ~IWorkload ()
 
virtual arm::pipe::ProfilingGuid GetGuid () const =0
 
virtual bool SupportsTensorHandleReplacement () const =0
 
virtual void RegisterDebugCallback (const DebugCallbackFunction &)
 
virtual armnn::Optional< armnn::MemoryRequirementsGetMemoryRequirements ()
 

Additional Inherited Members

- Protected Member Functions inherited from ClBaseWorkload< BatchMatMulQueueDescriptor >
virtual void Reconfigure ()
 
- Protected Attributes inherited from BaseWorkload< BatchMatMulQueueDescriptor >
BatchMatMulQueueDescriptor m_Data
 
const arm::pipe::ProfilingGuid m_Guid
 

Detailed Description

Definition at line 21 of file ClBatchMatMulWorkload.hpp.

Constructor & Destructor Documentation

◆ ClBatchMatMulWorkload()

ClBatchMatMulWorkload ( const BatchMatMulQueueDescriptor descriptor,
const WorkloadInfo info,
const arm_compute::CLCompileContext &  clCompileContext 
)

Definition at line 115 of file ClBatchMatMulWorkload.cpp.

118  : ClBaseWorkload<BatchMatMulQueueDescriptor>(descriptor, info)
119 {
120  // Report Profiling Details
121  ARMNN_REPORT_PROFILING_WORKLOAD_DESC("ClBatchMatMulWorkload_Construct",
122  descriptor.m_Parameters,
123  info,
124  this->GetGuid());
125 
126  if (descriptor.m_Parameters.m_AdjointX || descriptor.m_Parameters.m_AdjointY )
127  {
128  throw Exception("Support for adjoint not implemented.");
129  }
130  if (descriptor.m_Parameters.m_DataLayoutX != armnn::DataLayout::NCHW ||
131  descriptor.m_Parameters.m_DataLayoutY != armnn::DataLayout::NCHW )
132  {
133  throw Exception("Only supported the MatMul in the last 2 dimensions");
134  }
135 
136  m_Data.ValidateInputsOutputs("ClBatchMatMulWorkload", 2, 1);
137 
138  const arm_compute::ICLTensor& inputX = PolymorphicDowncast<ClTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
139  const arm_compute::ICLTensor& inputY = PolymorphicDowncast<ClTensorHandle*>(m_Data.m_Inputs[1])->GetTensor();
140  arm_compute::ICLTensor& output = PolymorphicDowncast<ClTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
141 
142  inputX.info()->set_data_layout(armcomputetensorutils::ConvertDataLayout(m_Data.m_Parameters.m_DataLayoutX));
143  arm_compute::TensorShape inputXTensorInfo = armcomputetensorutils::BuildArmComputeTensorShape(
144  info.m_InputTensorInfos[0].GetShape(), 3);
145  inputX.info()->set_tensor_shape(inputXTensorInfo);
146  inputY.info()->set_data_layout(armcomputetensorutils::ConvertDataLayout(m_Data.m_Parameters.m_DataLayoutY));
147  arm_compute::TensorShape inputYTensorInfo = armcomputetensorutils::BuildArmComputeTensorShape(
148  info.m_InputTensorInfos[1].GetShape(), 3);
149  inputY.info()->set_tensor_shape(inputYTensorInfo);
150 
151  arm_compute::TensorInfo aclPermutedXInfo = arm_compute::TensorInfo();
152  arm_compute::TensorInfo aclPermutedYInfo = arm_compute::TensorInfo();
153 
154  if (descriptor.m_Parameters.m_TransposeX == true)
155  {
156  armnn::TensorInfo strippedInfo = armnnUtils::ReduceDims(info.m_InputTensorInfos[0], 3);
157 
158  armnn::PermutationVector permutationXVector
160  const TensorInfo permutedXInfo = armnnUtils::Permuted(strippedInfo, permutationXVector);
161  const auto aclPermutationXVector = armcomputetensorutils::BuildArmComputePermutationVector(permutationXVector);
162  armcomputetensorutils::BuildArmComputeTensor(m_PermutedTensorX, permutedXInfo);
163  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_PermutedTensorX);
164 
165  auto permuteLayerX = std::make_unique<arm_compute::CLPermute>();
166  permuteLayerX->configure(clCompileContext,
167  &inputX,
168  &m_PermutedTensorX,
169  aclPermutationXVector);
170  m_PermuteLayerX.reset(permuteLayerX.release());
171  }
172 
173  if (descriptor.m_Parameters.m_TransposeY == true)
174  {
175  armnn::TensorInfo strippedInfo = armnnUtils::ReduceDims(info.m_InputTensorInfos[1], 3);
176 
177  armnn::PermutationVector permutationYVector
179  const TensorInfo permutedYInfo = armnnUtils::Permuted(strippedInfo, permutationYVector);
180  const auto aclPermutationYVector = armcomputetensorutils::BuildArmComputePermutationVector(permutationYVector);
181  armcomputetensorutils::BuildArmComputeTensor(m_PermutedTensorY, permutedYInfo);
182  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_PermutedTensorY);
183 
184  auto permuteLayerY = std::make_unique<arm_compute::CLPermute>();
185  permuteLayerY->configure(clCompileContext,
186  &inputY,
187  &m_PermutedTensorY,
188  aclPermutationYVector);
189  m_PermuteLayerY.reset(permuteLayerY.release());
190  }
191 
192  const arm_compute::GEMMInfo& gemm_info = arm_compute::GEMMInfo(false, // is inputX reshaped
193  false, // is inputY reshaped
194  false); // is inputY reshaped only 1st run
195  auto gemmLayer = std::make_unique<arm_compute::CLGEMM>();
196  gemmLayer->configure(clCompileContext,
197  descriptor.m_Parameters.m_TransposeX ? &m_PermutedTensorX : &inputX,
198  descriptor.m_Parameters.m_TransposeY ? &m_PermutedTensorY : &inputY,
199  nullptr,
200  &output,
201  1.0,
202  0,
203  gemm_info);
204  m_GEMMLayer.reset(gemmLayer.release());
205 }

References ARMNN_REPORT_PROFILING_WORKLOAD_DESC, armnn::info, BatchMatMulDescriptor::m_AdjointX, BatchMatMulDescriptor::m_AdjointY, BaseWorkload< BatchMatMulQueueDescriptor >::m_Data, BatchMatMulDescriptor::m_DataLayoutX, BatchMatMulDescriptor::m_DataLayoutY, QueueDescriptor::m_Inputs, QueueDescriptor::m_Outputs, QueueDescriptorWithParameters< LayerDescriptor >::m_Parameters, armnn::NCHW, and QueueDescriptor::ValidateInputsOutputs().

Member Function Documentation

◆ Execute()

void Execute ( ) const
overridevirtual

Implements IWorkload.

Definition at line 207 of file ClBatchMatMulWorkload.cpp.

208 {
209  ARMNN_SCOPED_PROFILING_EVENT_CL_GUID("ClBatchMatMulWorkload_Execute", this->GetGuid());
210  if (m_PermuteLayerX)
211  {
212  m_PermuteLayerX->run();
213  }
214  if (m_PermuteLayerY)
215  {
216  m_PermuteLayerY->run();
217  }
218  m_GEMMLayer->run();
219 }

References ARMNN_SCOPED_PROFILING_EVENT_CL_GUID, and BaseWorkload< BatchMatMulQueueDescriptor >::GetGuid().


The documentation for this class was generated from the following files:
armnn::BaseWorkload< BatchMatMulQueueDescriptor >::GetGuid
arm::pipe::ProfilingGuid GetGuid() const final
Definition: Workload.hpp:61
armnn::QueueDescriptor::ValidateInputsOutputs
void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const
Definition: WorkloadData.cpp:475
armnn::BaseWorkload< BatchMatMulQueueDescriptor >::m_Data
BatchMatMulQueueDescriptor m_Data
Definition: Workload.hpp:83
armnnUtils::Permuted
armnn::TensorShape Permuted(const armnn::TensorShape &srcShape, const armnn::PermutationVector &mappings)
Definition: Permute.cpp:98
armnn::DataLayout::NCHW
@ NCHW
armnn::BatchMatMulDescriptor::m_DataLayoutX
DataLayout m_DataLayoutX
Data layout of each input tensor, such as NHWC/NDHWC (leave as default for arbitrary layout)
Definition: Descriptors.hpp:1568
armnn::TensorInfo::GetNumDimensions
unsigned int GetNumDimensions() const
Definition: Tensor.hpp:195
armnn::GeneratePermutationVectorOnLastTwoDimensions
armnn::PermutationVector GeneratePermutationVectorOnLastTwoDimensions(unsigned int rank)
Generates a permutation vector of size rank that permutes the 2 most right dimensions.
Definition: WorkloadUtils.cpp:344
armnn::TensorInfo
Definition: Tensor.hpp:152
armnnUtils::ReduceDims
armnn::TensorShape ReduceDims(const armnn::TensorShape &tensorInfo, unsigned int dimensions)
Definition: TensorUtils.cpp:106
armnn::PermutationVector
Definition: Types.hpp:295
armnn::QueueDescriptorWithParameters::m_Parameters
LayerDescriptor m_Parameters
Definition: WorkloadData.hpp:66
ARMNN_REPORT_PROFILING_WORKLOAD_DESC
#define ARMNN_REPORT_PROFILING_WORKLOAD_DESC(name, desc, infos, guid)
Definition: Profiling.hpp:227
armnn::BatchMatMulDescriptor::m_DataLayoutY
DataLayout m_DataLayoutY
Definition: Descriptors.hpp:1569
armnn::QueueDescriptor::m_Outputs
std::vector< ITensorHandle * > m_Outputs
Definition: WorkloadData.hpp:27
ARMNN_SCOPED_PROFILING_EVENT_CL_GUID
#define ARMNN_SCOPED_PROFILING_EVENT_CL_GUID(name, guid)
Definition: ClWorkloadUtils.hpp:28
armnn::QueueDescriptor::m_Inputs
std::vector< ITensorHandle * > m_Inputs
Definition: WorkloadData.hpp:26
armnn::BoostLogSeverityMapping::info
@ info