ArmNN
 23.02
armnn_delegate.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2020-2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include "DelegateOptions.hpp"
9 
10 #include <tensorflow/lite/builtin_ops.h>
11 #include <tensorflow/lite/c/builtin_op_data.h>
12 #include <tensorflow/lite/c/common.h>
13 #include <tensorflow/lite/minimal_logging.h>
14 #include <tensorflow/lite/version.h>
15 
16 #if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 3)
17 #define ARMNN_POST_TFLITE_2_3
18 #endif
19 
20 #if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 4)
21 #define ARMNN_POST_TFLITE_2_4
22 #endif
23 
24 #if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 5)
25 #define ARMNN_POST_TFLITE_2_5
26 #endif
27 
28 namespace armnnDelegate
29 {
30 
32 {
33  DelegateData(const std::vector<armnn::BackendId>& backends)
34  : m_Backends(backends)
35  , m_Network(nullptr, nullptr)
36  {}
37 
38  const std::vector<armnn::BackendId> m_Backends;
40  std::vector<armnn::IOutputSlot*> m_OutputSlotForNode;
41 };
42 
43 // Forward decleration for functions initializing the ArmNN Delegate
45 
47 
48 void TfLiteArmnnDelegateDelete(TfLiteDelegate* tfLiteDelegate);
49 
50 TfLiteStatus DoPrepare(TfLiteContext* context, TfLiteDelegate* delegate);
51 
52 /// ArmNN Delegate
53 class Delegate
54 {
55  friend class ArmnnSubgraph;
56 public:
57  explicit Delegate(armnnDelegate::DelegateOptions options);
58 
59  TfLiteIntArray* IdentifyOperatorsToDelegate(TfLiteContext* context);
60 
61  TfLiteDelegate* GetDelegate();
62 
63  /// Retrieve version in X.Y.Z form
64  static const std::string GetVersion();
65 
66 private:
67  /**
68  * Returns a pointer to the armnn::IRuntime* this will be shared by all armnn_delegates.
69  */
70  armnn::IRuntime* GetRuntime(const armnn::IRuntime::CreationOptions& options)
71  {
72  static armnn::IRuntimePtr instance = armnn::IRuntime::Create(options);
73  // Instantiated on first use.
74  return instance.get();
75  }
76 
77  TfLiteDelegate m_Delegate = {
78  reinterpret_cast<void*>(this), // .data_
79  DoPrepare, // .Prepare
80  nullptr, // .CopyFromBufferHandle
81  nullptr, // .CopyToBufferHandle
82  nullptr, // .FreeBufferHandle
83  kTfLiteDelegateFlagsNone, // .flags
84  };
85 
86  /// ArmNN Runtime pointer
87  armnn::IRuntime* m_Runtime;
88  /// ArmNN Delegate Options
90 };
91 
92 /// ArmnnSubgraph class where parsing the nodes to ArmNN format and creating the ArmNN Graph
94 {
95 public:
96  static ArmnnSubgraph* Create(TfLiteContext* tfLiteContext,
97  const TfLiteDelegateParams* parameters,
98  const Delegate* delegate);
99 
100  TfLiteStatus Prepare(TfLiteContext* tfLiteContext);
101 
102  TfLiteStatus Invoke(TfLiteContext* tfLiteContext, TfLiteNode* tfLiteNode);
103 
104  static TfLiteStatus VisitNode(DelegateData& delegateData,
105  TfLiteContext* tfLiteContext,
106  TfLiteRegistration* tfLiteRegistration,
107  TfLiteNode* tfLiteNode,
108  int nodeIndex);
109 
110 private:
112  armnn::IRuntime* runtime,
113  std::vector<armnn::BindingPointInfo>& inputBindings,
114  std::vector<armnn::BindingPointInfo>& outputBindings)
115  : m_NetworkId(networkId), m_Runtime(runtime), m_InputBindings(inputBindings), m_OutputBindings(outputBindings)
116  {}
117 
118  static TfLiteStatus AddInputLayer(DelegateData& delegateData,
119  TfLiteContext* tfLiteContext,
120  const TfLiteIntArray* inputs,
121  std::vector<armnn::BindingPointInfo>& inputBindings);
122 
123  static TfLiteStatus AddOutputLayer(DelegateData& delegateData,
124  TfLiteContext* tfLiteContext,
125  const TfLiteIntArray* outputs,
126  std::vector<armnn::BindingPointInfo>& outputBindings);
127 
128 
129  /// The Network Id
130  armnn::NetworkId m_NetworkId;
131  /// ArmNN Rumtime
132  armnn::IRuntime* m_Runtime;
133 
134  // Binding information for inputs and outputs
135  std::vector<armnn::BindingPointInfo> m_InputBindings;
136  std::vector<armnn::BindingPointInfo> m_OutputBindings;
137 
138 };
139 
140 } // armnnDelegate namespace
141 
142 
armnnDelegate::DoPrepare
TfLiteStatus DoPrepare(TfLiteContext *context, TfLiteDelegate *delegate)
armnnDelegate
Definition: armnn_delegate.hpp:28
armnnDelegate::ArmnnSubgraph::Create
static ArmnnSubgraph * Create(TfLiteContext *tfLiteContext, const TfLiteDelegateParams *parameters, const Delegate *delegate)
armnn::IRuntime::CreationOptions
Definition: IRuntime.hpp:85
armnnDelegate::ArmnnSubgraph::Invoke
TfLiteStatus Invoke(TfLiteContext *tfLiteContext, TfLiteNode *tfLiteNode)
armnnDelegate::TfLiteArmnnDelegateCreate
TfLiteDelegate * TfLiteArmnnDelegateCreate(armnnDelegate::DelegateOptions options)
armnnDelegate::Delegate::IdentifyOperatorsToDelegate
TfLiteIntArray * IdentifyOperatorsToDelegate(TfLiteContext *context)
armnnDelegate::DelegateData::DelegateData
DelegateData(const std::vector< armnn::BackendId > &backends)
Definition: armnn_delegate.hpp:33
armnnDelegate::ArmnnSubgraph
ArmnnSubgraph class where parsing the nodes to ArmNN format and creating the ArmNN Graph.
Definition: armnn_delegate.hpp:93
armnnDelegate::DelegateData
Definition: armnn_delegate.hpp:31
armnnDelegate::DelegateData::m_Backends
const std::vector< armnn::BackendId > m_Backends
Definition: armnn_delegate.hpp:38
armnnDelegate::Delegate::GetVersion
static const std::string GetVersion()
Retrieve version in X.Y.Z form.
armnnDelegate::DelegateOptions
Definition: DelegateOptions.hpp:21
armnnDelegate::Delegate
ArmNN Delegate.
Definition: armnn_delegate.hpp:53
armnnDelegate::DelegateData::m_OutputSlotForNode
std::vector< armnn::IOutputSlot * > m_OutputSlotForNode
Definition: armnn_delegate.hpp:40
armnn::NetworkId
int NetworkId
Definition: IRuntime.hpp:35
armnnDelegate::TfLiteArmnnDelegateDelete
void TfLiteArmnnDelegateDelete(TfLiteDelegate *tfLiteDelegate)
armnnDelegate::TfLiteArmnnDelegateOptionsDefault
DelegateOptions TfLiteArmnnDelegateOptionsDefault()
armnnDelegate::ArmnnSubgraph::Prepare
TfLiteStatus Prepare(TfLiteContext *tfLiteContext)
armnn::IRuntime
Definition: IRuntime.hpp:82
armnnDelegate::Delegate::Delegate
Delegate(armnnDelegate::DelegateOptions options)
armnn::INetworkPtr
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:252
armnnDelegate::Delegate::GetDelegate
TfLiteDelegate * GetDelegate()
armnn::IRuntime::Create
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:52
armnnDelegate::ArmnnSubgraph::VisitNode
static TfLiteStatus VisitNode(DelegateData &delegateData, TfLiteContext *tfLiteContext, TfLiteRegistration *tfLiteRegistration, TfLiteNode *tfLiteNode, int nodeIndex)
DelegateOptions.hpp
armnnDelegate::DelegateData::m_Network
armnn::INetworkPtr m_Network
Definition: armnn_delegate.hpp:39
armnn::IRuntimePtr
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:41