diff options
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.cpp | 33 | ||||
-rw-r--r-- | src/backends/reference/RefLayerSupport.cpp | 32 |
2 files changed, 57 insertions, 8 deletions
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 85c074a500..f968ad78f7 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -26,10 +26,9 @@ DataType GetBiasDataType(DataType inputDataType) { switch (inputDataType) { - case DataType::BFloat16: - return DataType::BFloat16; case DataType::Float16: return DataType::Float16; + case DataType::BFloat16: case DataType::Float32: return DataType::Float32; case DataType::QAsymmS8: @@ -1009,7 +1008,20 @@ void FullyConnectedQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) c }; ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); - ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + + // For FullyConnected, we allow to have BFloat16 input with Float32 output for optimization. + if (inputTensorInfo.GetDataType() == DataType::BFloat16) + { + if (outputTensorInfo.GetDataType() != DataType::BFloat16 && outputTensorInfo.GetDataType() != DataType::Float32) + { + throw InvalidArgumentException(descriptorName + ": " + " Output tensor type must be BFloat16 or Float32 " + "for BFloat16 input."); + } + } + else + { + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + } } void NormalizationQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const @@ -1206,7 +1218,20 @@ void Convolution2dQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) co }; ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); - ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + + // For Convolution2d, we allow to have BFloat16 input with Float32 output for optimization. + if (inputTensorInfo.GetDataType() == DataType::BFloat16) + { + if (outputTensorInfo.GetDataType() != DataType::BFloat16 && outputTensorInfo.GetDataType() != DataType::Float32) + { + throw InvalidArgumentException(descriptorName + ": " + " Output tensor type must be BFloat16 or Float32 " + "for BFloat16 input."); + } + } + else + { + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + } } void DepthwiseConvolution2dQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 551a7b5867..7b25a436e9 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -474,8 +474,20 @@ bool RefLayerSupport::IsConvolution2dSupported(const TensorInfo& input, supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, "Reference Convolution2d: output is not a supported type."); - supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, + // For Convolution2d, we allow to have BFloat16 input with Float32 output for optimization. + if (input.GetDataType() == DataType::BFloat16) + { + if (output.GetDataType() != DataType::BFloat16 && output.GetDataType() != DataType::Float32) + { + reasonIfUnsupported.value() += "Output tensor type must be BFloat16 or Float32 for BFloat16 input.\n"; + supported = false; + } + } + else + { + supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, "Reference Convolution2d: input and output types mismatched."); + } const DataType inputType = input.GetDataType(); if (IsQuantized8BitType(inputType)) @@ -882,12 +894,24 @@ bool RefLayerSupport::IsFullyConnectedSupported(const TensorInfo& input, supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, "Reference Fully Connected: output type not supported."); - supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, - "Reference Fully Connected: input and output types mismatched."); - supported &= CheckSupportRule(TypeAnyOf(weights, supportedTypes), reasonIfUnsupported, "Reference Fully Connected: weights type not supported."); + // For FullyConnected, we allow to have BFloat16 input with Float32 output for optimization. + if (input.GetDataType() == DataType::BFloat16) + { + if (output.GetDataType() != DataType::BFloat16 && output.GetDataType() != DataType::Float32) + { + reasonIfUnsupported.value() += "Output tensor type must be BFloat16 or Float32 for BFloat16 input.\n"; + supported = false; + } + } + else + { + supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, + "Reference Fully Connected: input and output types mismatched."); + } + ARMNN_NO_DEPRECATE_WARN_BEGIN std::array<DataType, 3> supportedWeightTypes = { |