2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
13 inline std::vector<ConvertFp16ToFp32Layer*> InsertConvertFp16ToFp32LayersBefore(Graph& graph, Layer& layer)
15 std::vector<ConvertFp16ToFp32Layer*> convertLayers;
16 convertLayers.reserve(layer.GetNumInputSlots());
18 for (auto&& inputSlot = layer.BeginInputSlots(); inputSlot != layer.EndInputSlots(); ++inputSlot)
20 // Insert FP16 to FP32 converter layer before the layer
21 const std::string name =
22 std::string("convert_fp16_to_fp32-" + std::to_string(inputSlot->GetSlotIndex()) + "-") + layer.GetName();
23 ConvertFp16ToFp32Layer* convertLayer =
24 graph.InsertNewLayer<ConvertFp16ToFp32Layer>(*inputSlot, name.c_str());
26 // Sets output tensor info for the convert layer
27 TensorInfo convertInfo = convertLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo();
28 convertInfo.SetDataType(DataType::Float32);
30 convertLayer->GetOutputSlot().SetTensorInfo(convertInfo);
32 convertLayers.emplace_back(convertLayer);
35 // Sets the output tensor info for the unsupported layer
36 auto UpdateTensorInfo = [](auto& outputSlot)
38 // Copy original tensor info and change data type to FP32
39 TensorInfo newTensorInfo = outputSlot.GetTensorInfo();
40 newTensorInfo.SetDataType(DataType::Float32);
42 outputSlot.SetTensorInfo(newTensorInfo);
45 std::for_each(layer.BeginOutputSlots(), layer.EndOutputSlots(), UpdateTensorInfo);
50 inline std::vector<ConvertFp32ToFp16Layer*> InsertConvertFp32ToFp16LayersAfter(Graph& graph, Layer& layer)
52 std::vector<ConvertFp32ToFp16Layer*> convertLayers;
53 convertLayers.reserve(layer.GetNumOutputSlots());
56 // Change outputs to DataType::Float16
57 for (auto&& outputSlot = layer.BeginOutputSlots(); outputSlot != layer.EndOutputSlots(); ++outputSlot)
59 BOOST_ASSERT(outputSlot->GetTensorInfo().GetDataType() == DataType::Float32);
61 // Insert FP32 to FP16 converter layer after the layer
62 const std::string name =
63 std::string("convert_fp32_to_fp16-" + std::to_string(index++) + "-") + layer.GetName();
64 ConvertFp32ToFp16Layer* convertLayer =
65 graph.InsertNewLayer<ConvertFp32ToFp16Layer>(*outputSlot, name.c_str());
67 // Sets output tensor info for the convert layer.
68 TensorInfo convertInfo = convertLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo();
69 convertInfo.SetDataType(DataType::Float16);
71 convertLayer->GetOutputSlot().SetTensorInfo(convertInfo);
73 convertLayers.emplace_back(convertLayer);