You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
9.2 KiB
207 lines
9.2 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2019-2021 Qualcomm Technologies, Inc.
|
|
// All Rights Reserved.
|
|
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
|
//
|
|
//==============================================================================
|
|
|
|
//==============================================================================
|
|
/*
|
|
* THIS HEADER FILE IS COPIED FROM HEXAGON-NN PROJECT
|
|
*
|
|
*/
|
|
//==============================================================================
|
|
|
|
|
|
// Header to be used by a DSP Hexnn UDO Implementation library
|
|
|
|
#ifndef SNPE_UDO_IMPL_DSP_H
|
|
#define SNPE_UDO_IMPL_DSP_H
|
|
#include <stdio.h>
|
|
#include "SnpeUdo/UdoImpl.h"
|
|
|
|
/** @addtogroup c_plus_plus_apis C++
|
|
@{ */
|
|
|
|
/**
|
|
* @brief A function to validate that a set of params is supported by an operation
|
|
* This function is HexNN specific, use case is when registration library is not in use.
|
|
* Optional function.
|
|
*
|
|
* @param[in] operationType Operation type
|
|
* @param[in] numOfStaticParams Number of static params defined by the op
|
|
* @param[in] staticParams Array of static params to the op
|
|
* @return Error code, indicating if the operation can be created on this set of configuration or not.
|
|
*
|
|
*/
|
|
|
|
SnpeUdo_ErrorType_t
|
|
SnpeUdo_validateOperation (SnpeUdo_String_t operationType,
|
|
uint32_t numOfStaticParams,
|
|
const SnpeUdo_Param_t* staticParams);
|
|
|
|
typedef SnpeUdo_ErrorType_t (*SnpeUdo_ValidateOperationFunction_t) (SnpeUdo_String_t,
|
|
uint32_t,
|
|
const SnpeUdo_Param_t*);
|
|
|
|
typedef SnpeUdo_ValidateOperationFunction_t Udo_ValidateOperationFunction_t;
|
|
|
|
// enum used for indicating input/outout tensor data layouts on DSP, plain vs d32
|
|
typedef enum {
|
|
SNPE_UDO_DSP_TENSOR_LAYOUT_PLAIN = 0x00, UDO_DSP_TENSOR_LAYOUT_PLAIN = 0x00,
|
|
SNPE_UDO_DSP_TENSOR_LAYOUT_D32 = 0x01, UDO_DSP_TENSOR_LAYOUT_D32 = 0x01
|
|
} SnpeUdo_HexNNTensorLayout_t;
|
|
|
|
typedef SnpeUdo_HexNNTensorLayout_t Udo_HexNNTensorLayout_t;
|
|
|
|
/**
|
|
* @brief A function to query numbers of inputs and outputs,
|
|
* quantization type of each input and each output as arrays,
|
|
* and data layout (plain vs d32) of each input and each output as arrays
|
|
* of an operation.
|
|
* inputsQuantTypes and inputsLayouts should point to arrays of size numOfInputs
|
|
* outputsQuantTypes and outputsLayouts should point to arrays of size numOfOutputs
|
|
*
|
|
* Note: inputsLayouts and inputsLayouts can point to NULL, in this case, it is
|
|
* assumed all inputs and/or outputs have plain data layouts, i.e. no D32
|
|
*
|
|
* @param[in] operationType Operation type
|
|
* @param[in] numOfStaticParams Number of static params defined by the op
|
|
* @param[in] staticParams Array of static params to the op
|
|
* @param[in,out] numOfInputs Number of input tensors to the op
|
|
* @param[in,out] inputsQuantTypes Array of Quantization info for each input tensor
|
|
* @param[in,out] inputsLayouts Array of layout type for each input tensor
|
|
* @param[in,out] numOfOutputs Number of output tensors to the op
|
|
* @param[in,out] outputsQuantTypes Array of Quantization info for each output tensor
|
|
* @param[in,out] outputsLayouts Array of layout type for each output tensor
|
|
* @return error code, indicating status of query
|
|
*/
|
|
|
|
SnpeUdo_ErrorType_t
|
|
SnpeUdo_queryOperation (SnpeUdo_String_t operationType,
|
|
uint32_t numOfStaticParams,
|
|
const SnpeUdo_Param_t* staticParams,
|
|
uint32_t* numOfInputs,
|
|
SnpeUdo_QuantizationType_t** inputsQuantTypes,
|
|
SnpeUdo_HexNNTensorLayout_t** inputsLayouts,
|
|
uint32_t* numOfOutputs,
|
|
SnpeUdo_QuantizationType_t** outputsQuantTypes,
|
|
SnpeUdo_HexNNTensorLayout_t** outputsLayouts);
|
|
|
|
typedef SnpeUdo_ErrorType_t (*SnpeUdo_QueryOperationFunction_t) (SnpeUdo_String_t,
|
|
uint32_t,
|
|
const SnpeUdo_Param_t*,
|
|
uint32_t*,
|
|
SnpeUdo_QuantizationType_t**,
|
|
SnpeUdo_HexNNTensorLayout_t**,
|
|
uint32_t*,
|
|
SnpeUdo_QuantizationType_t**,
|
|
SnpeUdo_HexNNTensorLayout_t**);
|
|
|
|
typedef SnpeUdo_QueryOperationFunction_t Udo_QueryOperationFunction_t;
|
|
|
|
// Global infrastructure functions supported by Hexagon-NN v2
|
|
typedef void (*workerThread_t) (void* perOpInfrastructure, void* userData);
|
|
typedef int (*udoSetOutputTensorSize_t) (void* perOpInfrastructure, uint32_t outIdx, uint32_t size);
|
|
typedef int (*udoGetInputD32Paddings_t) (void* perOpInfrastructure, uint32_t inIdx,
|
|
uint32_t* heightPadBefore, uint32_t* heightPadAfter,
|
|
uint32_t* widthPadBefore, uint32_t* widthPadAfter,
|
|
uint32_t* depthPadBefore, uint32_t* depthPadAfter);
|
|
typedef int (*udoSetOutputD32ShapeSizePaddings_t) (void* perOpInfrastructure, uint32_t outIdx,
|
|
uint32_t batch,
|
|
uint32_t height, uint32_t heightPadBefore, uint32_t heightPadAfter,
|
|
uint32_t width, uint32_t widthPadBefore, uint32_t widthPadAfter,
|
|
uint32_t depth, uint32_t depthPadBefore, uint32_t depthPadAfter,
|
|
SnpeUdo_DataType_t dataType);
|
|
typedef void* (*udoMemalign_t) (size_t n, size_t size);
|
|
typedef void* (*udoMalloc_t) (size_t size);
|
|
typedef void* (*udoCalloc_t) (size_t n, size_t size);
|
|
typedef void (*udoFree_t) (void* ptr);
|
|
typedef uint32_t (*udoGetVtcmSize_t) (void* perOpInfrastructure);
|
|
typedef void* (*udoGetVtcmPtr_t) (void* perOpInfrastructure);
|
|
typedef uint32_t (*udoVtcmIsReal_t) (void* perOpInfrastructure);
|
|
typedef void (*udoRunWorkerThreads_t) (void* perOpInfrastructure, uint32_t nThreads, workerThread_t w, void* userData);
|
|
|
|
typedef struct hexNNv2GlobalInfra {
|
|
udoSetOutputTensorSize_t udoSetOutputTensorSize;
|
|
udoGetInputD32Paddings_t udoGetInputD32Paddings;
|
|
udoSetOutputD32ShapeSizePaddings_t udoSetOutputD32ShapeSizePaddings;
|
|
udoMemalign_t udoMemalign;
|
|
udoMalloc_t udoMalloc;
|
|
udoCalloc_t udoCalloc;
|
|
udoFree_t udoFree;
|
|
udoGetVtcmSize_t udoGetVtcmSize;
|
|
udoGetVtcmPtr_t udoGetVtcmPtr;
|
|
udoVtcmIsReal_t udoVtcmIsReal;
|
|
udoRunWorkerThreads_t udoRunWorkerThreads;
|
|
} SnpeUdo_HexNNv2GlobalInfra_t;
|
|
|
|
typedef SnpeUdo_HexNNv2GlobalInfra_t Udo_HexNNv2GlobalInfra_t;
|
|
|
|
// hexnn types
|
|
typedef enum hexnnInfraType {
|
|
UDO_INFRA_HEXNN_V2,
|
|
UDO_INFRA_HEXNN_V3 // reserved, do not use
|
|
} SnpeUdo_HexNNInfraType_t;
|
|
|
|
typedef SnpeUdo_HexNNInfraType_t Udo_HexNNInfraType_t;
|
|
|
|
typedef struct {
|
|
Udo_CreateOpFactoryFunction_t create_op_factory;
|
|
Udo_CreateOperationFunction_t create_operation;
|
|
Udo_ExecuteOpFunction_t execute_op;
|
|
Udo_ReleaseOpFunction_t release_op;
|
|
Udo_ReleaseOpFactoryFunction_t release_op_factory;
|
|
Udo_ValidateOperationFunction_t validate_op;
|
|
Udo_QueryOperationFunction_t query_op;
|
|
} udo_func_package_t;
|
|
|
|
/**
|
|
* @brief Infrastructures needed by a developer of DSP Hexnn UDO Implementation library.
|
|
*
|
|
* The framework/runtime which loads the Hexnn UDO implementation library provides
|
|
* this infrastructure to the loaded library by calling "SnpeUdo_initImplLibrary"
|
|
* function, and passing it (cast to void*). The Hexnn UDO library is expected
|
|
* to cast it back to this structure.
|
|
*
|
|
*/
|
|
typedef struct dspGlobalInfrastructure {
|
|
SnpeUdo_Version_t dspInfraVersion; // api version
|
|
SnpeUdo_HexNNInfraType_t infraType;
|
|
SnpeUdo_HexNNv2GlobalInfra_t hexNNv2Infra;
|
|
} SnpeUdo_DspGlobalInfrastructure_t;
|
|
|
|
typedef SnpeUdo_DspGlobalInfrastructure_t Udo_DspGlobalInfrastructure_t;
|
|
|
|
/**
|
|
* hexnn v2 per op factory infrastructure
|
|
*
|
|
* The framework/runtime passes per op factory infrastructure as a void pointer
|
|
* to HexNN UDO implementation library by calling function "SnpeUdo_createOpFactory".
|
|
* UDO implementation library is expected to cast it back to this following struct.
|
|
*
|
|
*/
|
|
typedef struct hexnnv2OpFactoryInfra {
|
|
unsigned long graphId;
|
|
} SnpeUdo_HexNNv2OpFactoryInfra_t;
|
|
|
|
typedef SnpeUdo_HexNNv2OpFactoryInfra_t Udo_HexNNv2OpFactoryInfra_t;
|
|
|
|
/**
|
|
* hexnn v2 per operation infrastructure
|
|
*
|
|
* The framework/runtime passes per operation infrastructure as a void pointer
|
|
* to HexNN UDO implementation library by calling function "SnpeUdo_createOperation".
|
|
* UDO implementation library is expected to cast it to the following type and save it.
|
|
*
|
|
* This is needed to be passed back into some functions from global infrastructure.
|
|
*
|
|
*/
|
|
typedef void* SnpeUdo_HexNNv2OpInfra_t;
|
|
|
|
typedef SnpeUdo_HexNNv2OpInfra_t Udo_HexNNv2OpInfra_t;
|
|
|
|
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
|
|
|
#endif // SNPE_UDO_IMPL_DSP_H
|
|
|