From c577f2c6a3b4ddb6ba87a882723c53a248afbeba Mon Sep 17 00:00:00 2001 From: telsoa01 Date: Fri, 31 Aug 2018 09:22:23 +0100 Subject: Release 18.08 --- src/armnn/NetworkUtils.hpp | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/armnn/NetworkUtils.hpp (limited to 'src/armnn/NetworkUtils.hpp') diff --git a/src/armnn/NetworkUtils.hpp b/src/armnn/NetworkUtils.hpp new file mode 100644 index 0000000000..0228813a25 --- /dev/null +++ b/src/armnn/NetworkUtils.hpp @@ -0,0 +1,79 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// See LICENSE file in the project root for full license information. +// + +#pragma once + +#include "Graph.hpp" + +namespace armnn +{ + +inline std::vector InsertConvertFp16ToFp32LayersBefore(Graph& graph, Layer& layer) +{ + std::vector 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(*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; +} + +inline std::vector InsertConvertFp32ToFp16LayersAfter(Graph& graph, Layer& layer) +{ + std::vector 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(*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 \ No newline at end of file -- cgit v1.2.1