aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon
diff options
context:
space:
mode:
authorNarumol Prangnawarat <narumol.prangnawarat@arm.com>2020-03-26 09:20:43 +0000
committerNarumol Prangnawarat <narumol.prangnawarat@arm.com>2020-03-26 16:16:55 +0000
commit57ef0088d20dd708ff92222d244ea02f1e1e5216 (patch)
treeae11f55f6bac939a51d5182eae441d322efb3e0e /src/backends/backendsCommon
parent9272f8b9050096f39796227c5d89ed7b9905146d (diff)
downloadarmnn-57ef0088d20dd708ff92222d244ea02f1e1e5216.tar.gz
IVGCVSW-4597 Modify BF16 optimizer to Convert only inputs and weights of
Convolution2d and FullyConnected layers * Add InsertConvertFp32ToBf16LayersBefore * Add ConvertWeight to ConvertFp32NetworkToBf16Impl for Conv2d and FullyConnected * Allow different input and output when input is BF16 and output is FP32 Conv2d and FullyConnected layers * Unit tests Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com> Change-Id: Ic8f92ff28edcae08a72a3114a28f50c4619f919b
Diffstat (limited to 'src/backends/backendsCommon')
-rw-r--r--src/backends/backendsCommon/WorkloadData.cpp33
1 files changed, 29 insertions, 4 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