ArmNN
 20.02
ConvertFp32NetworkToFp16Impl Class Reference

#include <ConvertFp32NetworkToFp16.hpp>

Public Member Functions

void Run (Graph &graph, Layer &layer) const
 

Protected Member Functions

 ConvertFp32NetworkToFp16Impl ()=default
 
 ~ConvertFp32NetworkToFp16Impl ()=default
 

Detailed Description

Definition at line 15 of file ConvertFp32NetworkToFp16.hpp.

Constructor & Destructor Documentation

◆ ConvertFp32NetworkToFp16Impl()

◆ ~ConvertFp32NetworkToFp16Impl()

Member Function Documentation

◆ Run()

void Run ( Graph graph,
Layer layer 
) const
inline

Definition at line 18 of file ConvertFp32NetworkToFp16.hpp.

References Layer::BeginInputSlots(), Layer::BeginOutputSlots(), armnn::ConvertFp16ToFp32, ConvertFp32NetworkToFp16Impl::ConvertFp32NetworkToFp16Impl(), armnn::ConvertFp32ToFp16, Layer::EndInputSlots(), Layer::EndOutputSlots(), armnn::Float16, armnn::Float32, TensorInfo::GetDataType(), Layer::GetDataType(), Layer::GetType(), armnn::Input, armnn::InsertConvertFp16ToFp32LayersBefore(), armnn::InsertConvertFp32ToFp16LayersAfter(), armnn::Output, TensorInfo::SetDataType(), and ConvertFp32NetworkToFp16Impl::~ConvertFp32NetworkToFp16Impl().

19  {
20  if(layer.GetType() == LayerType::Input)
21  {
22  // if the outputs of this layer are DataType::Float32
23  // add a ConvertFloat32ToFloat16 layer after each of the outputs
24  if (layer.GetDataType() == DataType::Float32)
25  {
27  }
28  }
29  else if (layer.GetType() == LayerType::Output)
30  {
31  // if the inputs of this layer are DataType::Float32
32  // add a ConvertFloat16ToFloat32 layer before each of the inputs
33  if (layer.GetDataType() == DataType::Float32)
34  {
35  // NOTE: We need to call InsertConvertFp16ToFp32LayersBefore with expectCorrectInputType = false
36  // here, otherwise it will expect the inputs to be DataType::Float16
37  InsertConvertFp16ToFp32LayersBefore(graph, layer, false);
38  }
39  }
40  else if (layer.GetType() != LayerType::ConvertFp32ToFp16 && layer.GetType() != LayerType::ConvertFp16ToFp32)
41  {
42  // if the inputs/outputs of this layer are DataType::Float32
43  // change the data type for all inputs and outputs to DataType::Float16
44  for (auto&& input = layer.BeginInputSlots(); input != layer.EndInputSlots(); ++input)
45  {
46  // if it is connected to OutputSlot of the InputLayer do not change the DataType of connection
47  // InputSlots of the current layer will be updated when conversion layer is inserted after InputLayer
48  Layer& base = input->GetConnectedOutputSlot()->GetOwningLayer();
49  if (base.GetType() != LayerType::Input)
50  {
51  TensorInfo convertInfo = input->GetConnection()->GetTensorInfo();
52  if (convertInfo.GetDataType() == DataType::Float32)
53  {
54  convertInfo.SetDataType(DataType::Float16);
55  input->GetConnection()->SetTensorInfo(convertInfo);
56  }
57  }
58  }
59 
60  // change outputs to DataType::Float16
61  for (auto&& output = layer.BeginOutputSlots(); output != layer.EndOutputSlots(); ++output)
62  {
63  TensorInfo convertInfo = output->GetTensorInfo();
64  if (convertInfo.GetDataType() == DataType::Float32)
65  {
66  convertInfo.SetDataType(DataType::Float16);
67  output->SetTensorInfo(convertInfo);
68  }
69  }
70  }
71  }
std::vector< ConvertFp32ToFp16Layer * > InsertConvertFp32ToFp16LayersAfter(Graph &graph, Layer &layer)
std::vector< ConvertFp16ToFp32Layer * > InsertConvertFp16ToFp32LayersBefore(Graph &graph, Layer &layer, bool expectCorrectInputType)

The documentation for this class was generated from the following file: