aboutsummaryrefslogtreecommitdiff
path: root/src/backends
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends')
-rw-r--r--src/backends/backendsCommon/WorkloadData.cpp33
-rw-r--r--src/backends/reference/RefLayerSupport.cpp32
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 =
{