// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include "CpuTensorHandleFwd.hpp" #include #include #include #include #include #include #include #include namespace armnn { //A helper function that returns the bias data type required for given input data type. DataType GetBiasDataType(DataType inputDataType); struct WorkloadInfo; struct QueueDescriptor { std::vector m_Inputs; std::vector m_Outputs; void ValidateInputsOutputs(const std::string& descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const; protected: ~QueueDescriptor() = default; QueueDescriptor() = default; QueueDescriptor(QueueDescriptor const&) = default; QueueDescriptor& operator=(QueueDescriptor const&) = default; }; // Base class for queue descriptors which contain parameters. template struct QueueDescriptorWithParameters : public QueueDescriptor { LayerDescriptor m_Parameters; protected: ~QueueDescriptorWithParameters() = default; QueueDescriptorWithParameters() = default; QueueDescriptorWithParameters(QueueDescriptorWithParameters const&) = default; QueueDescriptorWithParameters& operator=(QueueDescriptorWithParameters const&) = default; }; struct MemCopyQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; using InputQueueDescriptor = MemCopyQueueDescriptor; using OutputQueueDescriptor = MemCopyQueueDescriptor; struct MemImportQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct MemSyncQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Softmax layer workload data. struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Splitter layer workload data. struct SplitterQueueDescriptor : QueueDescriptorWithParameters { struct ViewOrigin { ViewOrigin() {} ViewOrigin(std::vector const& origin) : m_Origin(origin) {} //View origin (size of the vector is the same as number of dimensions of the view). std::vector m_Origin; }; //View defines a tensor that will be carved from the input tensor. //View origins are stored here, the extents are defined by sizes of the output tensors. std::vector m_ViewOrigins; void Validate(const WorkloadInfo& workloadInfo) const; }; // Concat layer workload data. struct ConcatQueueDescriptor : QueueDescriptorWithParameters { struct ViewOrigin { ViewOrigin() {} ViewOrigin(const std::vector& origin) : m_Origin(origin) {} //View origin (size of the vector is the same as number of dimensions of the view). std::vector m_Origin; }; //View defines a sub-area of the output tensor that will be filled with the corresponding input tensor. //View origins are stored here, the extents are defined by sizes of the input tensors. std::vector m_ViewOrigins; void Validate(const WorkloadInfo& workloadInfo) const; }; // Deprecated. Use ConcatQueueDescriptor instead using MergerQueueDescriptor = ConcatQueueDescriptor; // Stack layer workload data. struct StackQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Activation layer workload data. struct ActivationQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct ArgMinMaxQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Fully connected layer workload data. struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters { FullyConnectedQueueDescriptor() : m_Weight(nullptr) , m_Bias(nullptr) { } const ConstCpuTensorHandle* m_Weight; const ConstCpuTensorHandle* m_Bias; void Validate(const WorkloadInfo& workloadInfo) const; }; // Permute layer workload data. struct PermuteQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Pooling 2D layer workload data. struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Convolution 2D layer workload data. struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters { Convolution2dQueueDescriptor() : m_Weight(nullptr) , m_Bias(nullptr) { } const ConstCpuTensorHandle* m_Weight; const ConstCpuTensorHandle* m_Bias; void Validate(const WorkloadInfo& workloadInfo) const; }; // Depthwise Convolution 2D layer workload data. struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters { DepthwiseConvolution2dQueueDescriptor() : m_Weight(nullptr) , m_Bias(nullptr) { } const ConstCpuTensorHandle* m_Weight; const ConstCpuTensorHandle* m_Bias; void Validate(const WorkloadInfo& workloadInfo) const; }; struct DetectionPostProcessQueueDescriptor : QueueDescriptorWithParameters { DetectionPostProcessQueueDescriptor() : m_Anchors(nullptr) { } const ConstCpuTensorHandle* m_Anchors; void Validate(const WorkloadInfo& workloadInfo) const; }; // Normalization layer workload data. struct NormalizationQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Add layer workload data. struct AdditionQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Multiplication layer workload data. struct MultiplicationQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Division layer workload data. struct DivisionQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Subtraction layer workload data. struct SubtractionQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Maximum layer workload data. struct MaximumQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Mean layer workload data. struct MeanQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Pad layer workload data struct PadQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct QuantizeQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Equal layer workload data struct EqualQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; // Batch norm layer workload data. struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters { BatchNormalizationQueueDescriptor() : m_Mean(nullptr) , m_Variance(nullptr) , m_Beta(nullptr) , m_Gamma(nullptr) { } const ConstCpuTensorHandle* m_Mean; const ConstCpuTensorHandle* m_Variance; const ConstCpuTensorHandle* m_Beta; const ConstCpuTensorHandle* m_Gamma; void Validate(const WorkloadInfo& workloadInfo) const; }; struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct ResizeQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters { FakeQuantizationQueueDescriptor() : m_Min(nullptr) , m_Max(nullptr) { } const ConstCpuTensorHandle* m_Min; const ConstCpuTensorHandle* m_Max; void Validate(const WorkloadInfo& workloadInfo) const; }; struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct ConstantQueueDescriptor : QueueDescriptor { ConstantQueueDescriptor() : m_LayerOutput(nullptr) { } const ConstCpuTensorHandle* m_LayerOutput; void Validate(const WorkloadInfo& workloadInfo) const; }; struct ReshapeQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct SpaceToDepthQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct FloorQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct LstmQueueDescriptor : QueueDescriptorWithParameters { LstmQueueDescriptor() : m_InputToInputWeights(nullptr) , m_InputToForgetWeights(nullptr) , m_InputToCellWeights(nullptr) , m_InputToOutputWeights(nullptr) , m_RecurrentToInputWeights(nullptr) , m_RecurrentToForgetWeights(nullptr) , m_RecurrentToCellWeights(nullptr) , m_RecurrentToOutputWeights(nullptr) , m_CellToInputWeights(nullptr) , m_CellToForgetWeights(nullptr) , m_CellToOutputWeights(nullptr) , m_InputGateBias(nullptr) , m_ForgetGateBias(nullptr) , m_CellBias(nullptr) , m_OutputGateBias(nullptr) , m_ProjectionWeights(nullptr) , m_ProjectionBias(nullptr) , m_InputLayerNormWeights(nullptr) , m_ForgetLayerNormWeights(nullptr) , m_CellLayerNormWeights(nullptr) , m_OutputLayerNormWeights(nullptr) { } const ConstCpuTensorHandle* m_InputToInputWeights; const ConstCpuTensorHandle* m_InputToForgetWeights; const ConstCpuTensorHandle* m_InputToCellWeights; const ConstCpuTensorHandle* m_InputToOutputWeights; const ConstCpuTensorHandle* m_RecurrentToInputWeights; const ConstCpuTensorHandle* m_RecurrentToForgetWeights; const ConstCpuTensorHandle* m_RecurrentToCellWeights; const ConstCpuTensorHandle* m_RecurrentToOutputWeights; const ConstCpuTensorHandle* m_CellToInputWeights; const ConstCpuTensorHandle* m_CellToForgetWeights; const ConstCpuTensorHandle* m_CellToOutputWeights; const ConstCpuTensorHandle* m_InputGateBias; const ConstCpuTensorHandle* m_ForgetGateBias; const ConstCpuTensorHandle* m_CellBias; const ConstCpuTensorHandle* m_OutputGateBias; const ConstCpuTensorHandle* m_ProjectionWeights; const ConstCpuTensorHandle* m_ProjectionBias; const ConstCpuTensorHandle* m_InputLayerNormWeights; const ConstCpuTensorHandle* m_ForgetLayerNormWeights; const ConstCpuTensorHandle* m_CellLayerNormWeights; const ConstCpuTensorHandle* m_OutputLayerNormWeights; void Validate(const WorkloadInfo& workloadInfo) const; }; struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct BatchToSpaceNdQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; struct StridedSliceQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; // Minimum layer workload data. struct MinimumQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct GreaterQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct DebugQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; LayerGuid m_Guid; std::string m_LayerName; unsigned int m_SlotIndex; }; struct RsqrtQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct GatherQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct PreCompiledQueueDescriptor : QueueDescriptorWithParameters { PreCompiledQueueDescriptor() : m_PreCompiledObject(nullptr) { } void* m_PreCompiledObject; void Validate(const WorkloadInfo& workloadInfo) const; }; struct DequantizeQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct MergeQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct SwitchQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct PreluQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct TransposeConvolution2dQueueDescriptor : QueueDescriptorWithParameters { TransposeConvolution2dQueueDescriptor() : m_Weight(nullptr), m_Bias(nullptr) {} const ConstCpuTensorHandle* m_Weight; const ConstCpuTensorHandle* m_Bias; void Validate(const WorkloadInfo& workloadInfo) const; }; struct QuantizedLstmQueueDescriptor : QueueDescriptor { QuantizedLstmQueueDescriptor() : m_InputToInputWeights(nullptr) , m_InputToForgetWeights(nullptr) , m_InputToCellWeights(nullptr) , m_InputToOutputWeights(nullptr) , m_RecurrentToInputWeights(nullptr) , m_RecurrentToForgetWeights(nullptr) , m_RecurrentToCellWeights(nullptr) , m_RecurrentToOutputWeights(nullptr) , m_InputGateBias(nullptr) , m_ForgetGateBias(nullptr) , m_CellBias(nullptr) , m_OutputGateBias(nullptr) {} const ConstCpuTensorHandle* m_InputToInputWeights; const ConstCpuTensorHandle* m_InputToForgetWeights; const ConstCpuTensorHandle* m_InputToCellWeights; const ConstCpuTensorHandle* m_InputToOutputWeights; const ConstCpuTensorHandle* m_RecurrentToInputWeights; const ConstCpuTensorHandle* m_RecurrentToForgetWeights; const ConstCpuTensorHandle* m_RecurrentToCellWeights; const ConstCpuTensorHandle* m_RecurrentToOutputWeights; const ConstCpuTensorHandle* m_InputGateBias; const ConstCpuTensorHandle* m_ForgetGateBias; const ConstCpuTensorHandle* m_CellBias; const ConstCpuTensorHandle* m_OutputGateBias; void Validate(const WorkloadInfo& workloadInfo) const; }; struct AbsQueueDescriptor : QueueDescriptor { void Validate(const WorkloadInfo& workloadInfo) const; }; struct SliceQueueDescriptor : QueueDescriptorWithParameters { void Validate(const WorkloadInfo& workloadInfo) const; }; } // namespace armnn