xref: /aosp_15_r20/external/armnn/src/armnn/optimizations/OptimizeInverseConversions.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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