aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/Network.cpp
diff options
context:
space:
mode:
authorNarumol Prangnawarat <narumol.prangnawarat@arm.com>2020-03-30 16:11:04 +0100
committerNarumol Prangnawarat <narumol.prangnawarat@arm.com>2020-03-31 09:29:40 +0100
commit250d3927b16abe4d6932cd5dce1184bd7026a2b7 (patch)
treef73603873c0fbd692fbcbbd242d2a45cef6dc890 /src/armnn/Network.cpp
parente2062cdf1eb31b87860f9889f0e799e89f0dfa30 (diff)
downloadarmnn-250d3927b16abe4d6932cd5dce1184bd7026a2b7.tar.gz
IVGCVSW-4633 Add conversion of BF16 support to Neon
* Add NeonConvertBf16ToFp32Workload * Add NeonConvertFp32ToBf16Workload * Add BFloat16 type support to NeonConstantWorkload and NeonTensorHandle * Add ConvertBf16ToFp32Weight when ConvertBf16ToFp32Layer is added * Unit tests Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com> Change-Id: Id5b44a203add5e0c98c1ca4e2162115741b56644
Diffstat (limited to 'src/armnn/Network.cpp')
-rw-r--r--src/armnn/Network.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index c2da4da41e..a443721a45 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -146,6 +146,30 @@ bool CheckScaleSetOnQuantizedType(Layer* layer, Optional<std::vector<std::string
return noErrors;
}
+template <typename LayerT>
+LayerT* ConvertBf16ToFp32Weight(Layer* l)
+{
+ LayerT* layer = boost::polymorphic_downcast<LayerT*>(l);
+ if ((layer->GetType() == LayerType::Convolution2d || layer->GetType() == LayerType::FullyConnected)
+ && layer->m_Weight)
+ {
+ const TensorInfo& info = layer->m_Weight->GetTensorInfo();
+
+ if (info.GetDataType() == DataType::BFloat16)
+ {
+ std::vector<float> newValues(info.GetNumElements());
+
+ armnnUtils::FloatingPointConverter::ConvertBFloat16ToFloat32(
+ layer->m_Weight->template GetTensor<armnn::BFloat16>(), info.GetNumElements(), newValues.data());
+
+ TensorInfo newInfo(info.GetShape(), DataType::Float32);
+ ConstTensor newInput(newInfo, newValues);
+ layer->m_Weight.reset(new ScopedCpuTensorHandle(newInput));
+ }
+ }
+ return layer;
+}
+
OptimizationResult AttemptBackendAssignment(BackendSettings& backendSettings,
Graph& graph,
Layer* layer,
@@ -260,6 +284,14 @@ OptimizationResult AttemptBackendAssignment(BackendSettings& backendSettings,
{
convertBf16ToFp32Layers =
InsertConvertBf16ToFp32LayersBefore(graph, *layer);
+ if (layer->GetType() == LayerType::Convolution2d)
+ {
+ ConvertBf16ToFp32Weight<Convolution2dLayer>(layer);
+ }
+ else if (layer->GetType() == LayerType::FullyConnected)
+ {
+ ConvertBf16ToFp32Weight<FullyConnectedLayer>(layer);
+ }
}
// Insert FP32 -> BF16 conversion layer after current layer