ArmNN
 25.02
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TosaRefLayerSupport Class Reference

#include <TosaRefLayerSupport.hpp>

Inheritance diagram for TosaRefLayerSupport:
[legend]
Collaboration diagram for TosaRefLayerSupport:
[legend]

Public Member Functions

bool IsLayerSupported (const LayerType &type, const std::vector< TensorInfo > &infos, const BaseDescriptor &descriptor, const Optional< LstmInputParamsInfo > &lstmParamsInfo, const Optional< QuantizedLstmInputParamsInfo > &, Optional< std::string & > reasonIfUnsupported) const override
 Default implementation of the ILayerSupport interface, Backends should implement this as a switch statement for each of their LayerTypes calling their specific backend implementation of IsXXXLayerSupported. More...
 

Additional Inherited Members

- Protected Member Functions inherited from ILayerSupport
 ILayerSupport ()
 
virtual ~ILayerSupport ()
 

Detailed Description

Definition at line 12 of file TosaRefLayerSupport.hpp.

Member Function Documentation

◆ IsLayerSupported()

bool IsLayerSupported ( const LayerType type,
const std::vector< TensorInfo > &  infos,
const BaseDescriptor descriptor,
const Optional< LstmInputParamsInfo > &  lstmParamsInfo,
const Optional< QuantizedLstmInputParamsInfo > &  quantizedLstmParamsInfo,
Optional< std::string & >  reasonIfUnsupported 
) const
overridevirtual

Default implementation of the ILayerSupport interface, Backends should implement this as a switch statement for each of their LayerTypes calling their specific backend implementation of IsXXXLayerSupported.

Reimplemented from ILayerSupport.

Definition at line 21 of file TosaRefLayerSupport.cpp.

27 {
28  for (const auto& info : infos)
29  {
30  if (info.GetDataType() == DataType::Signed64 ||
31  info.GetDataType() == DataType::QAsymmU8)
32  {
33  reasonIfUnsupported.value() = "TOSA does not have INT64 or unsigned INT support for TOSARef backend";
34  return false;
35  }
36  }
37 
38  IgnoreUnused(lstmParamsInfo);
39  IgnoreUnused(quantizedLstmInputParamsInfo);
40  IgnoreUnused(reasonIfUnsupported);
41 
42  std::vector<const TensorInfo*> inputInfos;
43  std::vector<const TensorInfo*> outputInfos;
44 
45  switch (type)
46  {
47  case LayerType::Input:
48  case LayerType::Output:
49  return true;
53  case LayerType::Gather:
56  // Setup inputs and outputs
57  inputInfos.push_back(&infos[0]);
58  inputInfos.push_back(&infos[1]);
59  outputInfos.push_back(&infos[2]);
60  break;
61  case LayerType::Concat:
62  for (unsigned int i = 0; i < infos.size() - 1; ++i)
63  {
64  inputInfos.push_back(&infos[i]);
65  }
66  outputInfos.push_back(&infos.back());
67  break;
69  outputInfos.push_back(&infos[0]);
70  break;
72  {
73  inputInfos.push_back(&infos[0]); // input
74  outputInfos.push_back(&infos[1]); // output
75  inputInfos.push_back(&infos[2]); // weights
76 
77  auto conv2dDesc = PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor);
78  if(conv2dDesc->m_BiasEnabled)
79  {
80  inputInfos.push_back(&infos[3]); // bias
81  }
82  break;
83  }
85  {
86  inputInfos.push_back(&infos[0]); // input
87  outputInfos.push_back(&infos[1]); // output
88  inputInfos.push_back(&infos[2]); // weights
89 
90  auto conv3dDesc = PolymorphicDowncast<const Convolution3dDescriptor*>(&descriptor);
91  if(conv3dDesc->m_BiasEnabled)
92  {
93  inputInfos.push_back(&infos[3]); // bias
94  }
95  break;
96  }
98  {
99  inputInfos.push_back(&infos[0]); // input
100  outputInfos.push_back(&infos[1]); // output
101  inputInfos.push_back(&infos[2]); // weights
102 
103  auto conv2dDesc = PolymorphicDowncast<const DepthwiseConvolution2dDescriptor*>(&descriptor);
104  if(conv2dDesc->m_BiasEnabled)
105  {
106  inputInfos.push_back(&infos[3]); // bias
107  }
108  break;
109  }
111  {
112  inputInfos.push_back(&infos[0]); // input
113  outputInfos.push_back(&infos[1]); // output
114  inputInfos.push_back(&infos[2]); // weights
115  auto fullyConnectedDesc = PolymorphicDowncast<const FullyConnectedDescriptor*>(&descriptor);
116  if(fullyConnectedDesc->m_BiasEnabled)
117  {
118  inputInfos.push_back(&infos[3]); // bias
119  }
120  break;
121  }
126  case LayerType::Pad:
128  case LayerType::Mean:
129  case LayerType::Quantize:
130  case LayerType::Reduce:
131  case LayerType::Reshape:
132  case LayerType::Resize:
133  case LayerType::Slice:
134  case LayerType::Softmax:
137  {
138  inputInfos.push_back(&infos[0]);
139  outputInfos.push_back(&infos[1]);
140  break;
141  }
142  case LayerType::Splitter:
143  {
144  inputInfos.push_back(&infos[0]);
145  for (unsigned int i = 1; i < infos.size(); ++i)
146  {
147  outputInfos.push_back(&infos[i]);
148  }
149  break;
150  }
152  {
153  inputInfos.push_back(&infos[0]); // input
154  outputInfos.push_back(&infos[1]); // output
155  inputInfos.push_back(&infos[2]); // weights
156 
157  auto conv2dDesc = PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor);
158  if(conv2dDesc->m_BiasEnabled)
159  {
160  inputInfos.push_back(&infos[3]); // bias
161  }
162  break;
163  }
164  case LayerType::Stack:
165  {
166  auto stackDesc = PolymorphicDowncast<const StackDescriptor*>(&descriptor);
167  for (unsigned int i = 0; i < stackDesc->m_NumInputs; ++i)
168  {
169  inputInfos.emplace_back(&infos[i]);
170  }
171  outputInfos.emplace_back(&infos[stackDesc->m_NumInputs]);
172  break;
173  }
174  default:
175  // Default to false for all unsupported layers.
176  return false;
177  }
178 
179  auto mappings = GetTosaMapping(nullptr, type, inputInfos, outputInfos, descriptor);
180  if (mappings->GetName() == "")
181  {
182  // There currently isn't a TOSA mapping for this layer, as the default was returned.
183  return false;
184  }
185 
186  TosaSerializationHandler handler;
187 
188  // Add all mappings to main block.
189  auto* block = new TosaSerializationBasicBlock("main",
190  "main",
191  mappings->GetOperators(),
192  mappings->GetTensors(),
193  mappings->GetInputs(),
194  mappings->GetOutputs());
195 
196  std::vector<TosaSerializationBasicBlock*> blocks;
197  blocks.emplace_back(block);
198 
199  // Add blocks to the main region.
200  auto* region = new TosaSerializationRegion("main", blocks);
201  handler.GetRegions().emplace_back(region);
202 
203  GraphStatus status;
204  TosaReference::IModelRunner runner;
205 
206 #if !defined(TOSA_REFERENCE_MODEL_OUTPUT)
207  // There currently isn't a way to disable the output from the TOSA Reference Model, but it does have a file pointer
208  // to write debug output to, so set this to /dev/null (if it exists on the system) to hide the output.
209  func_debug_t funcDebug;
210 
211  FILE* file = fopen("/dev/null", "w");
212  funcDebug.func_debug_file = (file == nullptr) ? stderr : file;
213 
214  runner.setFuncDebug(funcDebug);
215 #endif
216 
217  // Initialise the model runner with the TosaSerializationHandler, which runs validation on the mapping.
218  status = runner.initialize(handler);
219 
220 #if !defined(TOSA_REFERENCE_MODEL_OUTPUT)
221  // Reset FuncDebug as they can persist across multiple IModelRunner instances.
222  funcDebug.func_debug_file = stderr;
223  runner.setFuncDebug(funcDebug);
224 #endif
225 
226  if(status == GraphStatus::TOSA_ERROR || status == GraphStatus::TOSA_UNPREDICTABLE)
227  {
228  return false;
229  }
230  else
231  {
232  return true;
233  }
234 }
TosaSerializationBasicBlock * GetTosaMapping(const Layer *layer, const LayerType type, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const BaseDescriptor &descriptor)
void IgnoreUnused(Ts &&...)

References armnn::Activation, armnn::Addition, armnn::BatchMatMul, armnn::Concat, armnn::Constant, armnn::Convolution2d, armnn::Convolution3d, armnn::DepthToSpace, armnn::DepthwiseConvolution2d, armnn::Dequantize, armnn::ElementwiseBinary, armnn::ElementwiseUnary, armnn::FullyConnected, armnn::Gather, GetTosaMapping(), armnn::IgnoreUnused(), armnn::info, armnn::Input, armnn::Mean, armnn::Multiplication, armnn::Output, armnn::Pad, armnn::Pooling2d, armnn::QAsymmU8, armnn::Quantize, armnn::Reduce, armnn::Reshape, armnn::Resize, armnn::Signed64, armnn::Slice, armnn::Softmax, armnn::Splitter, armnn::Stack, armnn::StridedSlice, armnn::Subtraction, armnn::Transpose, armnn::TransposeConvolution2d, and OptionalReferenceSwitch< IsReference, T >::value().


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