aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/NetworkUtils.cpp
diff options
context:
space:
mode:
authorAron Virginas-Tar <Aron.Virginas-Tar@arm.com>2018-11-21 13:14:42 +0000
committerAron Virginas-Tar <Aron.Virginas-Tar@arm.com>2018-11-22 13:51:52 +0000
commit5fdfe823b993c2f3089fe621aed028c7be3c0fcc (patch)
tree5994262b0829d291dd2f4ec6d66fabb7f37aae6f /src/armnn/NetworkUtils.cpp
parent574bf0a7f1b6bbaf2e6fa8e9dd87b9fcf6ff9c5a (diff)
downloadarmnn-5fdfe823b993c2f3089fe621aed028c7be3c0fcc.tar.gz
Refactor inlined utility functions in NetworkUtils
Change-Id: I26fb13717f64c942b2648702c52be18be856042d
Diffstat (limited to 'src/armnn/NetworkUtils.cpp')
-rw-r--r--src/armnn/NetworkUtils.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/armnn/NetworkUtils.cpp b/src/armnn/NetworkUtils.cpp
new file mode 100644
index 0000000000..1e3add6301
--- /dev/null
+++ b/src/armnn/NetworkUtils.cpp
@@ -0,0 +1,77 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "NetworkUtils.hpp"
+
+namespace armnn
+{
+
+std::vector<ConvertFp16ToFp32Layer*> InsertConvertFp16ToFp32LayersBefore(Graph& graph, Layer& layer)
+{
+ std::vector<ConvertFp16ToFp32Layer*> convertLayers;
+ convertLayers.reserve(layer.GetNumInputSlots());
+
+ for (auto&& inputSlot = layer.BeginInputSlots(); inputSlot != layer.EndInputSlots(); ++inputSlot)
+ {
+ // Insert FP16 to FP32 converter layer before the layer
+ const std::string name =
+ std::string("convert_fp16_to_fp32-" + std::to_string(inputSlot->GetSlotIndex()) + "-") + layer.GetName();
+ ConvertFp16ToFp32Layer* convertLayer =
+ graph.InsertNewLayer<ConvertFp16ToFp32Layer>(*inputSlot, name.c_str());
+
+ // Sets output tensor info for the convert layer
+ TensorInfo convertInfo = convertLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo();
+ convertInfo.SetDataType(DataType::Float32);
+
+ convertLayer->GetOutputSlot().SetTensorInfo(convertInfo);
+
+ convertLayers.emplace_back(convertLayer);
+ }
+
+ // Sets the output tensor info for the unsupported layer
+ auto UpdateTensorInfo = [](auto& outputSlot)
+ {
+ // Copy original tensor info and change data type to FP32
+ TensorInfo newTensorInfo = outputSlot.GetTensorInfo();
+ newTensorInfo.SetDataType(DataType::Float32);
+
+ outputSlot.SetTensorInfo(newTensorInfo);
+ };
+
+ std::for_each(layer.BeginOutputSlots(), layer.EndOutputSlots(), UpdateTensorInfo);
+
+ return convertLayers;
+}
+
+std::vector<ConvertFp32ToFp16Layer*> InsertConvertFp32ToFp16LayersAfter(Graph& graph, Layer& layer)
+{
+ std::vector<ConvertFp32ToFp16Layer*> convertLayers;
+ convertLayers.reserve(layer.GetNumOutputSlots());
+
+ int index = 0;
+ // Change outputs to DataType::Float16
+ for (auto&& outputSlot = layer.BeginOutputSlots(); outputSlot != layer.EndOutputSlots(); ++outputSlot)
+ {
+ BOOST_ASSERT(outputSlot->GetTensorInfo().GetDataType() == DataType::Float32);
+
+ // Insert FP32 to FP16 converter layer after the layer
+ const std::string name =
+ std::string("convert_fp32_to_fp16-" + std::to_string(index++) + "-") + layer.GetName();
+ ConvertFp32ToFp16Layer* convertLayer =
+ graph.InsertNewLayer<ConvertFp32ToFp16Layer>(*outputSlot, name.c_str());
+
+ // Sets output tensor info for the convert layer.
+ TensorInfo convertInfo = convertLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo();
+ convertInfo.SetDataType(DataType::Float16);
+
+ convertLayer->GetOutputSlot().SetTensorInfo(convertInfo);
+
+ convertLayers.emplace_back(convertLayer);
+ }
+
+ return convertLayers;
+}
+
+} // namespace armnn