diff options
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.cpp | 12 | ||||
-rw-r--r-- | src/backends/reference/RefWorkloadFactory.cpp | 32 |
2 files changed, 40 insertions, 4 deletions
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 528e1faefc..ec163b59c3 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -494,7 +494,8 @@ void AdditionQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const std::vector<DataType> supportedTypes = { DataType::Float32, DataType::QuantisedAsymm8, - DataType::QuantisedSymm16 + DataType::QuantisedSymm16, + DataType::Float16 }; ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], @@ -526,7 +527,8 @@ void MultiplicationQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) c std::vector<DataType> supportedTypes = { DataType::Float32, DataType::QuantisedAsymm8, - DataType::QuantisedSymm16 + DataType::QuantisedSymm16, + DataType::Float16 }; ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], @@ -895,7 +897,8 @@ void DivisionQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const std::vector<DataType> supportedTypes = { DataType::Float32, DataType::QuantisedAsymm8, - DataType::QuantisedSymm16 + DataType::QuantisedSymm16, + DataType::Float16 }; ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], @@ -926,7 +929,8 @@ void SubtractionQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) cons std::vector<DataType> supportedTypes = { DataType::Float32, DataType::QuantisedAsymm8, - DataType::QuantisedSymm16 + DataType::QuantisedSymm16, + DataType::Float16 }; ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 8ea923d599..b1c3ad79ac 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -27,6 +27,22 @@ std::unique_ptr<IWorkload> RefWorkloadFactory::MakeWorkload(const QueueDescripto info); } +bool IsFloat16(const WorkloadInfo& info) +{ + auto checkFloat16 = [](const TensorInfo& tensorInfo) {return tensorInfo.GetDataType() == DataType::Float16;}; + auto it = std::find_if(std::begin(info.m_InputTensorInfos), std::end(info.m_InputTensorInfos), checkFloat16); + if (it != std::end(info.m_InputTensorInfos)) + { + return true; + } + it = std::find_if(std::begin(info.m_OutputTensorInfos), std::end(info.m_OutputTensorInfos), checkFloat16); + if (it != std::end(info.m_OutputTensorInfos)) + { + return true; + } + return false; +} + RefWorkloadFactory::RefWorkloadFactory() { } @@ -174,12 +190,20 @@ std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateNormalization( std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor, const WorkloadInfo& info) const { + if (IsFloat16(info)) + { + return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info); + } return std::make_unique<RefAdditionWorkload>(descriptor, info); } std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMultiplication( const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const { + if (IsFloat16(info)) + { + return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info); + } return std::make_unique<RefMultiplicationWorkload>(descriptor, info); } @@ -266,12 +290,20 @@ std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp32ToFp16( std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateDivision( const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const { + if (IsFloat16(info)) + { + return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info); + } return std::make_unique<RefDivisionWorkload>(descriptor, info); } std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateSubtraction( const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const { + if (IsFloat16(info)) + { + return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info); + } return std::make_unique<RefSubtractionWorkload>(descriptor, info); } |