aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Eilers <jan.eilers@arm.com>2021-08-20 16:42:58 +0100
committerMatthew Sloyan <matthew.sloyan@arm.com>2021-08-20 19:30:19 +0100
commit6d2eb3403f5ad4d3c7d489777bada3b71c0f520b (patch)
tree2833465257e94d7e71e1934cae32d78324e48f71
parent2650556a8f1bdc4ade0855df2b9c21d420b9dad2 (diff)
downloadarmnn-6d2eb3403f5ad4d3c7d489777bada3b71c0f520b.tar.gz
IVGCVSW-6294 Detect and remove extraneous fp16 conversion layers
Signed-off-by: Jan Eilers <jan.eilers@arm.com> Change-Id: I69a6ceda0d3e8d39947df71a2ad0d365ac7767d8 Signed-off-by: Finn Williams <Finn.Williams@arm.com>
-rw-r--r--src/armnn/Network.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index 42d7ae33ac..db7b4c9bb3 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -709,12 +709,54 @@ OptimizationResult AttemptBackendAssignment(BackendSettings& backendSettings,
&& layer->GetType() != LayerType::ConvertFp32ToFp16
&& layer->GetType() != LayerType::ConvertFp16ToFp32)
{
+ auto ConstantLayerFromFp16ToFp32 = [](Layer& layer)
+ {
+ if (layer.GetType() == LayerType::Constant)
+ {
+ ConstantLayer* constantLayer = PolymorphicDowncast<ConstantLayer*>(&layer);
+
+ auto& info = constantLayer->m_LayerOutput->GetTensorInfo();
+
+ if (info.GetDataType() == DataType::Float16)
+ {
+ std::vector<float> newValues(info.GetNumElements());
+
+ armnnUtils::FloatingPointConverter::ConvertFloat16To32(
+ constantLayer->m_LayerOutput->GetConstTensor<Half>(),
+ info.GetNumElements(),
+ newValues.data());
+
+ TensorInfo newInfo(info);
+ newInfo.SetDataType(DataType::Float32);
+ ConstTensor newInput(newInfo, newValues);
+ constantLayer->m_LayerOutput.reset(new ScopedTensorHandle(newInput));
+
+ layer.GetOutputSlot(0).SetTensorInfo(newInfo);
+ }
+ }
+ };
+
+ bool checkType = false;
+
+ for (auto inputSlot : layer->GetInputSlots())
+ {
+ auto connectedOutputSlot = inputSlot.GetConnectedOutputSlot();
+ if (connectedOutputSlot->GetOwningLayer().GetType() == LayerType::Constant)
+ {
+ if (connectedOutputSlot->GetNumConnections() == 1)
+ {
+ checkType = true;
+ ConstantLayerFromFp16ToFp32(connectedOutputSlot->GetOwningLayer());
+ }
+ }
+ }
+
// Insert FP16 -> FP32 conversion layer before current layer
std::vector<ConvertFp16ToFp32Layer*> convertFp16ToFp32Layers;
if (dataTypeIn == DataType::Float16)
{
convertFp16ToFp32Layers =
- InsertConvertFp16ToFp32LayersBefore(graph, *layer);
+ InsertConvertFp16ToFp32LayersBefore(graph, *layer, checkType);
}
// Insert FP32 -> FP16 conversion layer after current layer