From c4fb0dd4145e05123c546458ba5d281abfcc2b28 Mon Sep 17 00:00:00 2001 From: Francis Murtagh Date: Thu, 16 Mar 2023 17:01:56 +0000 Subject: IVGCVSW-7556 Introduce Opaque Delegate API * Also added cmake for the new layers to reduce merge conflicts. Signed-off-by: Francis Murtagh Change-Id: Ieb59aa2b7e2a18c57c9357b8d5b5cd63d8211c85 --- delegate/opaque/include/armnn_delegate.hpp | 107 ++++++++++++++--------------- 1 file changed, 51 insertions(+), 56 deletions(-) (limited to 'delegate/opaque/include/armnn_delegate.hpp') diff --git a/delegate/opaque/include/armnn_delegate.hpp b/delegate/opaque/include/armnn_delegate.hpp index 8957dc87d6..5522699e26 100644 --- a/delegate/opaque/include/armnn_delegate.hpp +++ b/delegate/opaque/include/armnn_delegate.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2020-2023 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -7,32 +7,17 @@ #include -#include -#include -#include -#include -#include +#include +#include -#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 3) -#define ARMNN_POST_TFLITE_2_3 -#endif - -#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 4) -#define ARMNN_POST_TFLITE_2_4 -#endif - -#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 5) -#define ARMNN_POST_TFLITE_2_5 -#endif - -namespace armnnDelegate +namespace armnnOpaqueDelegate { struct DelegateData { DelegateData(const std::vector& backends) - : m_Backends(backends) - , m_Network(nullptr, nullptr) + : m_Backends(backends) + , m_Network(nullptr, nullptr) {} const std::vector m_Backends; @@ -40,25 +25,25 @@ struct DelegateData std::vector m_OutputSlotForNode; }; -// Forward decleration for functions initializing the ArmNN Delegate -DelegateOptions TfLiteArmnnDelegateOptionsDefault(); +/// Forward declaration for functions initializing the ArmNN Delegate +::armnnDelegate::DelegateOptions TfLiteArmnnDelegateOptionsDefault(); -TfLiteDelegate* TfLiteArmnnDelegateCreate(armnnDelegate::DelegateOptions options); +TfLiteOpaqueDelegate* TfLiteArmnnOpaqueDelegateCreate(const void* settings); -void TfLiteArmnnDelegateDelete(TfLiteDelegate* tfLiteDelegate); +void TfLiteArmnnOpaqueDelegateDelete(TfLiteOpaqueDelegate* tfLiteDelegate); -TfLiteStatus DoPrepare(TfLiteContext* context, TfLiteDelegate* delegate); +TfLiteStatus DoPrepare(TfLiteOpaqueContext* context, TfLiteOpaqueDelegate* delegate, void* data); -/// ArmNN Delegate -class Delegate +/// ArmNN Opaque Delegate +class ArmnnOpaqueDelegate { friend class ArmnnSubgraph; public: - explicit Delegate(armnnDelegate::DelegateOptions options); + explicit ArmnnOpaqueDelegate(armnnDelegate::DelegateOptions options); - TfLiteIntArray* IdentifyOperatorsToDelegate(TfLiteContext* context); + TfLiteIntArray* IdentifyOperatorsToDelegate(TfLiteOpaqueContext* context); - TfLiteDelegate* GetDelegate(); + TfLiteOpaqueDelegateBuilder* GetDelegateBuilder() { return &m_Builder; } /// Retrieve version in X.Y.Z form static const std::string GetVersion(); @@ -70,18 +55,18 @@ private: armnn::IRuntime* GetRuntime(const armnn::IRuntime::CreationOptions& options) { static armnn::IRuntimePtr instance = armnn::IRuntime::Create(options); - // Instantiated on first use. + /// Instantiated on first use. return instance.get(); } - TfLiteDelegate m_Delegate = { + TfLiteOpaqueDelegateBuilder m_Builder = + { reinterpret_cast(this), // .data_ - DoPrepare, // .Prepare + nullptr, // .Prepare nullptr, // .CopyFromBufferHandle nullptr, // .CopyToBufferHandle nullptr, // .FreeBufferHandle kTfLiteDelegateFlagsNone, // .flags - nullptr, // .opaque_delegate_builder }; /// ArmNN Runtime pointer @@ -90,52 +75,62 @@ private: armnnDelegate::DelegateOptions m_Options; }; +static int TfLiteArmnnOpaqueDelegateErrno(TfLiteOpaqueDelegate* delegate) { return 0; } + + + /// In order for the delegate to be loaded by TfLite +const TfLiteOpaqueDelegatePlugin* GetArmnnDelegatePluginApi(); + +extern const TfLiteStableDelegate TFL_TheStableDelegate = +{ + /*delegate_abi_version=*/ TFL_STABLE_DELEGATE_ABI_VERSION, + /*delegate_name=*/ "ArmnnDelegatePlugin", + /*delegate_version=*/ "1.0.0", + /*delegate_plugin=*/ GetArmnnDelegatePluginApi() +}; + /// ArmnnSubgraph class where parsing the nodes to ArmNN format and creating the ArmNN Graph class ArmnnSubgraph { public: - static ArmnnSubgraph* Create(TfLiteContext* tfLiteContext, - const TfLiteDelegateParams* parameters, - const Delegate* delegate); + static ArmnnSubgraph* Create(TfLiteOpaqueContext* tfLiteContext, + const TfLiteOpaqueDelegateParams* parameters, + const ArmnnOpaqueDelegate* delegate); - TfLiteStatus Prepare(TfLiteContext* tfLiteContext); + TfLiteStatus Prepare(TfLiteOpaqueContext* tfLiteContext); - TfLiteStatus Invoke(TfLiteContext* tfLiteContext, TfLiteNode* tfLiteNode); + TfLiteStatus Invoke(TfLiteOpaqueContext* tfLiteContext, TfLiteOpaqueNode* tfLiteNode); static TfLiteStatus VisitNode(DelegateData& delegateData, - TfLiteContext* tfLiteContext, - TfLiteRegistration* tfLiteRegistration, - TfLiteNode* tfLiteNode, + TfLiteOpaqueContext* tfLiteContext, + TfLiteRegistrationExternal* tfLiteRegistration, + TfLiteOpaqueNode* tfLiteNode, int nodeIndex); - private: ArmnnSubgraph(armnn::NetworkId networkId, armnn::IRuntime* runtime, std::vector& inputBindings, std::vector& outputBindings) - : m_NetworkId(networkId), m_Runtime(runtime), m_InputBindings(inputBindings), m_OutputBindings(outputBindings) + : m_NetworkId(networkId) + , m_Runtime(runtime) + , m_InputBindings(inputBindings) + , m_OutputBindings(outputBindings) {} - static TfLiteStatus AddInputLayer(DelegateData& delegateData, - TfLiteContext* tfLiteContext, + TfLiteOpaqueContext* tfLiteContext, const TfLiteIntArray* inputs, std::vector& inputBindings); - static TfLiteStatus AddOutputLayer(DelegateData& delegateData, - TfLiteContext* tfLiteContext, + TfLiteOpaqueContext* tfLiteContext, const TfLiteIntArray* outputs, std::vector& outputBindings); - - /// The Network Id armnn::NetworkId m_NetworkId; - /// ArmNN Rumtime + /// ArmNN Runtime armnn::IRuntime* m_Runtime; - - // Binding information for inputs and outputs + /// Binding information for inputs and outputs std::vector m_InputBindings; std::vector m_OutputBindings; - }; -} // armnnDelegate namespace \ No newline at end of file +} // armnnOpaqueDelegate namespace \ No newline at end of file -- cgit v1.2.1