1 // 2 // Copyright © 2017 Arm Ltd. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #pragma once 6 7 #include "Optimization.hpp" 8 9 #include <armnn/utility/IgnoreUnused.hpp> 10 11 namespace armnn 12 { 13 namespace optimizations 14 { 15 16 class OptimizeInverseConversionsImpl 17 { 18 public: 19 /// Run for every connection between two inverse data type conversion layers, i.e. 20 /// Fp16ToFp32 followed by Fp32ToFp16 or vice-versa. Run(Graph & graph,InputSlot & connection) const21 void Run(Graph& graph, InputSlot& connection) const 22 { 23 IgnoreUnused(graph); 24 Layer& base = connection.GetConnectedOutputSlot()->GetOwningLayer(); 25 Layer& child = connection.GetOwningLayer(); 26 27 ARMNN_ASSERT((base.GetType() == LayerType::ConvertFp16ToFp32 && 28 child.GetType() == LayerType::ConvertFp32ToFp16) || 29 (base.GetType() == LayerType::ConvertFp32ToFp16 && 30 child.GetType() == LayerType::ConvertFp16ToFp32)); 31 32 // Bypass both conversion layers 33 child.GetOutputSlot().MoveAllConnections(*base.GetInputSlot(0).GetConnectedOutputSlot()); 34 } 35 36 protected: 37 OptimizeInverseConversionsImpl() = default; 38 ~OptimizeInverseConversionsImpl() = default; 39 }; 40 41 using OptimizeInverseConversionsFp16 = 42 OptimizeForConnection<ConvertFp16ToFp32Layer, ConvertFp32ToFp16Layer, OptimizeInverseConversionsImpl>; 43 using OptimizeInverseConversionsFp32 = 44 OptimizeForConnection<ConvertFp32ToFp16Layer, ConvertFp16ToFp32Layer, OptimizeInverseConversionsImpl>; 45 46 } // namespace optimizations 47 } // namespace armnn 48