24 template <
typename F32Workload,
typename U8Workload,
typename QueueDescriptorType>
25 std::unique_ptr<IWorkload> RefWorkloadFactory::MakeWorkload(
const QueueDescriptorType& descriptor,
26 const WorkloadInfo& info)
const 28 return MakeWorkloadHelper<NullWorkload, F32Workload, U8Workload, NullWorkload, NullWorkload, NullWorkload>
32 template <DataType ArmnnType>
35 auto checkType = [](
const TensorInfo& tensorInfo) {
return tensorInfo.GetDataType() == ArmnnType;};
51 return IsDataType<DataType::Signed32>(
info);
56 return IsDataType<DataType::BFloat16>(
info);
61 return IsDataType<DataType::Float16>(
info);
66 return IsDataType<DataType::QSymmS16>(
info);
71 return IsDataType<DataType::QSymmS8>(
info);
76 return IsDataType<DataType::QAsymmS8>(
info);
81 return IsDataType<DataType::QAsymmU8>(
info);
85 : m_MemoryManager(memoryManager)
101 std::string& outReasonIfUnsupported)
108 std::string& outReasonIfUnsupported,
115 const bool isMemoryManaged)
const 120 return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
125 const bool isMemoryManaged)
const 130 return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
146 return std::make_unique<RefActivationWorkload>(descriptor,
info);
154 return std::make_unique<RefAdditionWorkload<int32_t>>(descriptor,
info);
158 return std::make_unique<RefAdditionWorkload<float>>(descriptor,
info);
165 return std::make_unique<RefArgMinMaxWorkload>(descriptor,
info);
172 return std::make_unique<RefBatchNormalizationWorkload>(descriptor,
info);
178 return std::make_unique<RefBatchToSpaceNdWorkload>(descriptor,
info);
184 return std::make_unique<RefCastWorkload>(descriptor,
info);
190 return std::make_unique<RefComparisonWorkload>(descriptor,
info);
196 return std::make_unique<RefConcatWorkload>(descriptor,
info);
202 return std::make_unique<RefConstantWorkload>(descriptor,
info);
209 return std::make_unique<RefConvertBf16ToFp32Workload>(descriptor,
info);
216 return std::make_unique<RefConvertFp16ToFp32Workload>(descriptor,
info);
223 return std::make_unique<RefConvertFp32ToBf16Workload>(descriptor,
info);
230 return std::make_unique<RefConvertFp32ToFp16Workload>(descriptor,
info);
236 return std::make_unique<RefConvolution2dWorkload>(descriptor,
info);
244 return std::make_unique<RefDebugBFloat16Workload>(descriptor,
info);
248 return std::make_unique<RefDebugFloat16Workload>(descriptor,
info);
252 return std::make_unique<RefDebugQSymmS16Workload>(descriptor,
info);
256 return std::make_unique<RefDebugQSymmS8Workload>(descriptor,
info);
260 return std::make_unique<RefDebugQAsymmU8Workload>(descriptor,
info);
264 return std::make_unique<RefDebugQAsymmS8Workload>(descriptor,
info);
268 return std::make_unique<RefDebugSigned32Workload>(descriptor,
info);
271 return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymmU8Workload>(descriptor,
info);
277 return std::make_unique<RefDepthToSpaceWorkload>(descriptor,
info);
284 return std::make_unique<RefDepthwiseConvolution2dWorkload>(descriptor,
info);
290 return std::make_unique<RefDequantizeWorkload>(descriptor,
info);
297 return std::make_unique<RefDetectionPostProcessWorkload>(descriptor,
info);
305 return std::make_unique<RefDivisionWorkload<int32_t>>(descriptor,
info);
309 return std::make_unique<RefDivisionWorkload<float>>(descriptor,
info);
318 return std::make_unique<RefLogicalUnaryWorkload>(descriptor,
info);
320 return std::make_unique<RefElementwiseUnaryWorkload>(descriptor,
info);
336 return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor,
info);
342 return std::make_unique<RefFillWorkload>(descriptor,
info);
354 return std::make_unique<RefFloorWorkload>(descriptor,
info);
362 return std::make_unique<RefFullyConnectedWorkload>(descriptor,
info);
368 return std::make_unique<RefGatherWorkload>(descriptor,
info);
398 return std::make_unique<CopyMemGenericWorkload>(descriptor,
info);
405 return std::make_unique<RefInstanceNormalizationWorkload>(descriptor,
info);
411 return std::make_unique<RefL2NormalizationWorkload>(descriptor,
info);
417 return std::make_unique<RefLogicalBinaryWorkload>(descriptor,
info);
423 return std::make_unique<RefLogSoftmaxWorkload>(descriptor,
info);
429 return std::make_unique<RefLstmWorkload>(descriptor,
info);
437 return std::make_unique<RefMaximumWorkload<int32_t>>(descriptor,
info);
441 return std::make_unique<RefMaximumWorkload<float>>(descriptor,
info);
448 return std::make_unique<RefMeanWorkload>(descriptor,
info);
458 return std::make_unique<CopyMemGenericWorkload>(descriptor,
info);
468 return std::make_unique<ImportMemGenericWorkload>(descriptor,
info);
482 return std::make_unique<RefMinimumWorkload<int32_t>>(descriptor,
info);
486 return std::make_unique<RefMinimumWorkload<float>>(descriptor,
info);
495 return std::make_unique<RefMultiplicationWorkload<int32_t>>(descriptor,
info);
499 return std::make_unique<RefMultiplicationWorkload<float>>(descriptor,
info);
506 return std::make_unique<RefNormalizationWorkload>(descriptor,
info);
525 return std::make_unique<CopyMemGenericWorkload>(descriptor,
info);
531 return std::make_unique<RefPadWorkload>(descriptor,
info);
539 return std::make_unique<RefPermuteQSymm16Workload>(descriptor,
info);
543 return std::make_unique<RefPermuteBFloat16Workload>(descriptor,
info);
547 return std::make_unique<RefPermuteQAsymmS8Workload>(descriptor,
info);
556 return std::make_unique<RefPooling2dWorkload>(descriptor,
info);
568 return std::make_unique<RefPreluWorkload>(descriptor,
info);
574 return std::make_unique<RefQLstmWorkload>(descriptor,
info);
580 return std::make_unique<RefQuantizeWorkload>(descriptor,
info);
586 return std::make_unique<RefRankWorkload>(descriptor,
info);
592 return std::make_unique<RefReduceWorkload>(descriptor,
info);
598 return std::make_unique<RefReshapeWorkload>(descriptor,
info);
604 return std::make_unique<RefResizeWorkload>(descriptor,
info);
632 return std::make_unique<RefSliceWorkload>(descriptor,
info);
638 return std::make_unique<RefSoftmaxWorkload>(descriptor,
info);
644 return std::make_unique<RefSpaceToBatchNdWorkload>(descriptor,
info);
650 return std::make_unique<RefSpaceToDepthWorkload>(descriptor,
info);
656 return std::make_unique<RefSplitterWorkload>(descriptor,
info);
662 return std::make_unique<RefStackWorkload>(descriptor,
info);
668 return std::make_unique<RefStridedSliceWorkload>(descriptor,
info);
676 return std::make_unique<RefSubtractionWorkload<int32_t>>(descriptor,
info);
680 return std::make_unique<RefSubtractionWorkload<float>>(descriptor,
info);
689 return std::make_unique<RefTransposeQSymm16Workload>(descriptor,
info);
693 return std::make_unique<RefTransposeBFloat16Workload>(descriptor,
info);
697 return std::make_unique<RefTransposeQAsymmS8Workload>(descriptor,
info);
707 return std::make_unique<RefTransposeConvolution2dWorkload>(descriptor,
info);
std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateRsqrt(const RsqrtQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateNormalization(const NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateArgMinMax(const ArgMinMaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateResize(const ResizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFakeQuantization(const FakeQuantizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
std::unique_ptr< IWorkload > CreateConstant(const ConstantQueueDescriptor &descriptor, const WorkloadInfo &info) const override
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
std::unique_ptr< IWorkload > CreateEqual(const EqualQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateInput(const InputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMaximum(const MaximumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateGather(const GatherQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQuantize(const QuantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
constexpr bool IsQuantizedType()
std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStridedSlice(const StridedSliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToBf16(const ConvertFp32ToBf16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSoftmax(const SoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetWidth
Target width value.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
constexpr const char * RefBackendId()
std::vector< BackendOptions > ModelOptions
std::unique_ptr< IWorkload > CreateMultiplication(const MultiplicationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const override
ResizeMethod m_Method
The Interpolation method to use (Bilinear, NearestNeighbor).
std::unique_ptr< IWorkload > CreatePad(const PadQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefPermuteWorkload< DataType::Float16 > RefPermuteFloat16Workload
RefTransposeWorkload< DataType::Float16 > RefTransposeFloat16Workload
std::unique_ptr< IWorkload > CreateMerger(const MergerQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateComparison(const ComparisonQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsQAsymmS8(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateLogSoftmax(const LogSoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefPermuteWorkload< DataType::Float32 > RefPermuteFloat32Workload
std::unique_ptr< IWorkload > CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< IWorkload > CreateRank(const RankQueueDescriptor &descriptor, const WorkloadInfo &info) const override
void IgnoreUnused(Ts &&...)
bool IsQAsymmU8(const WorkloadInfo &info)
bool IsQSymmS8(const WorkloadInfo &info)
bool IsDataType(const WorkloadInfo &info)
bool IsBFloat16(const WorkloadInfo &info)
LayerDescriptor m_Parameters
std::unique_ptr< IWorkload > CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFill(const FillQueueDescriptor &descriptor, const WorkloadInfo &info) const override
const BackendId & GetBackendId() const override
std::unique_ptr< IWorkload > CreateBatchNormalization(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateL2Normalization(const L2NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConcat(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< TensorInfo > m_InputTensorInfos
bool IsFloat16(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateSubtraction(const SubtractionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefTransposeWorkload< DataType::Float32 > RefTransposeFloat32Workload
std::unique_ptr< IWorkload > CreateReduce(const ReduceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefTransposeWorkload< DataType::QAsymmU8 > RefTransposeQAsymm8Workload
static bool IsLayerSupported(const Layer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateAddition(const AdditionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetWidth
Target width value.
bool IsSigned32(const WorkloadInfo &info)
std::vector< TensorInfo > m_OutputTensorInfos
static bool IsLayerSupported(const BackendId &backendId, const IConnectableLayer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreatePooling2d(const Pooling2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetHeight
Target height value.
uint32_t m_TargetHeight
Target height value.
std::unique_ptr< IWorkload > CreatePrelu(const PreluQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSplitter(const SplitterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDequantize(const DequantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFloor(const FloorQueueDescriptor &descriptor, const WorkloadInfo &info) const override
ComparisonOperation m_Operation
Specifies the comparison operation to execute.
std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFullyConnected(const FullyConnectedQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMean(const MeanQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateConvertBf16ToFp32(const ConvertBf16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStack(const StackQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDivision(const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateGreater(const GreaterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const override
std::unique_ptr< IWorkload > CreateLogicalBinary(const LogicalBinaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateAbs(const AbsQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const override
Contains information about inputs and outputs to a layer.
std::unique_ptr< IWorkload > CreatePermute(const PermuteQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateActivation(const ActivationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateCast(const CastQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< ITensorHandle * > m_Inputs
RefPermuteWorkload< DataType::QAsymmU8 > RefPermuteQAsymm8Workload
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::unique_ptr< IWorkload > CreateMinimum(const MinimumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateOutput(const OutputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePreCompiled(const PreCompiledQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTranspose(const TransposeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDetectionPostProcess(const DetectionPostProcessQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsQSymmS16(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQLstm(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemImport(const MemImportQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const override