// =============================================================================
//
// Copyright (c) 2019-2021 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
//
// =============================================================================
# ifndef PSNPE_HPP
# define PSNPE_HPP
# include <cstdlib>
# include <functional>
# include "SNPE/SNPE.hpp"
# include "DlSystem/UserBufferMap.hpp"
# include "DlContainer/IDlContainer.hpp"
# include "DlSystem/DlEnums.hpp"
# include "DlSystem/ZdlExportDefine.hpp"
# include "UserBufferList.hpp"
# include "RuntimeConfigList.hpp"
# include "ApplicationBufferMap.hpp"
namespace zdl
{
namespace PSNPE
{
/** @addtogroup c_plus_plus_apis C++
@ { */
/**
* @ brief build snpe instance in serial or parallel
*
*/
enum ZDL_EXPORT BuildMode {
SERIAL = 0 ,
PARALLEL = 1
} ;
/**
* @ brief Input and output transmission mode
*/
enum ZDL_EXPORT InputOutputTransmissionMode
{
sync = 0 ,
outputAsync = 1 ,
inputOutputAsync = 2
} ;
/**
* @ brief A structure representing parameters of callback function of Async Output mode
*/
struct ZDL_EXPORT OutputAsyncCallbackParam
{
size_t dataIndex ;
bool executeStatus ;
std : : string errorMsg ;
OutputAsyncCallbackParam ( size_t _index , bool _status , const std : : string & _errorMsg = std : : string ( ) )
: dataIndex ( _index ) , executeStatus ( _status ) , errorMsg ( _errorMsg ) { } ;
} ;
/**
* @ brief A structure representing parameters of callback function of Async Input / Output mode
*/
struct ZDL_EXPORT InputOutputAsyncCallbackParam
{
size_t dataIndex ;
const ApplicationBufferMap & outputMap ;
bool executeStatus ;
std : : string errorMsg ;
InputOutputAsyncCallbackParam ( size_t _index , const ApplicationBufferMap & output_map , bool _status ,
const std : : string _ErrorMsg = std : : string ( ) )
: dataIndex ( _index )
, outputMap ( output_map )
, executeStatus ( _status )
, errorMsg ( _ErrorMsg ) { } ;
} ;
/**
* @ brief This callback is called when the output data is ready , only use for Output Async mode
*/
using OutputAsyncCallbackFunc = std : : function < void ( OutputAsyncCallbackParam ) > ;
/**
* @ brief This callback is called when the output data is ready , only use for Output - Input Async mode
*/
using InputOutputAsyncCallbackFunc = std : : function < void ( InputOutputAsyncCallbackParam ) > ;
/**
* @ brief This callback is called when the input data is ready , only use for Output - Input Async mode
*/
using InputOutputAsyncInputCallback = std : : function < std : : shared_ptr < ApplicationBufferMap > ( const std : : vector < std : : string > & ,
const zdl : : DlSystem : : StringList & ) > ;
/**
* @ brief .
*
* A structure PSNPE configuration
*
*/
struct ZDL_EXPORT BuildConfig final
{
BuildMode buildMode = BuildMode : : SERIAL ; ///< Specify build in serial mode or parallel mode
zdl : : DlContainer : : IDlContainer * container ; ///< The opened container ptr
zdl : : DlSystem : : StringList outputBufferNames ; ///< Specify the output layer name
zdl : : DlSystem : : StringList outputTensors ; ///< Specify the output layer name
RuntimeConfigList runtimeConfigList ; ///< The runtime config list for PSNPE, @see RuntimeConfig
size_t inputThreadNumbers = 1 ; ///< Specify the number of threads used in the execution phase to process input data, only used in inputOutputAsync mode
size_t outputThreadNumbers = 1 ; ///< Specify the number of threads used in the execution phase to process output data, only used in inputOutputAsync and outputAsync mode
OutputAsyncCallbackFunc outputCallback ; ///< The callback to deal with output data ,only used in outputAsync mode
InputOutputAsyncCallbackFunc inputOutputCallback ; ///< The callback to deal with output data ,only used in inputOutputAsync mode
InputOutputAsyncInputCallback inputOutputInputCallback ; ///< The callback to deal with input data ,only used in inputOutputAsync mode
InputOutputTransmissionMode inputOutputTransmissionMode = InputOutputTransmissionMode : : sync ; ///< Specify execution mode
zdl : : DlSystem : : ProfilingLevel_t profilingLevel = zdl : : DlSystem : : ProfilingLevel_t : : OFF ; ///< Specify profiling level for Diaglog
uint64_t encode [ 2 ] = { 0 , 0 } ;
bool enableInitCache = false ;
std : : string platformOptions ;
std : : string diaglogOutputDir = " ./diaglogs/ " ; ///< Specify a diaglog output directory to save the generated Diaglog files.
} ;
/**
* @ brief .
*
* The class for executing SNPE instances in parallel .
*/
class ZDL_EXPORT PSNPE final
{
public :
~ PSNPE ( ) ;
explicit PSNPE ( ) noexcept : m_TransmissionMode ( InputOutputTransmissionMode : : sync ) { } ;
/**
* @ brief Build snpe instances .
*
*/
bool build ( BuildConfig & buildConfig ) noexcept ;
/**
* @ brief Execute snpe instances in Async Output mode and Sync mode
*
* @ param [ in ] inputBufferList A list of user buffers that contains the input data
*
* @ param [ in , out ] outputBufferList A list of user buffers that will hold the output data
*
*/
bool execute ( UserBufferList & inputBufferList , UserBufferList & outputBufferList ) noexcept ;
/**
* @ brief Execute snpe instances in Async Input / Output mode
*
* @ param [ in ] inputMap A map of input buffers that contains input data . The names of buffers
* need to be matched with names retrived through getInputTensorNames ( )
*
* @ param dataIndex Index of the input data
*
* @ param isTF8buff Whether prefer to using 8 bit quantized element for inference
*
* @ return True if executed successfully ; flase , otherwise .
*/
bool executeInputOutputAsync ( const std : : vector < std : : string > & inputMap , size_t dataIndex , bool isTF8buff ) noexcept ;
bool executeInputOutputAsync ( const std : : vector < std : : string > & inputMap , size_t dataIndex , bool isTF8buff , bool isTF8Outputbuff ) noexcept ;
/**
* @ brief Returns the input layer names of the network .
*
* @ return StringList which contains the input layer names
*/
const zdl : : DlSystem : : StringList getInputTensorNames ( ) const noexcept ;
/**
* @ brief Returns the output layer names of the network .
*
* @ return StringList which contains the output layer names
*/
const zdl : : DlSystem : : StringList getOutputTensorNames ( ) const noexcept ;
/**
* @ brief Returns the input tensor dimensions of the network .
*
* @ return TensorShape which contains the dimensions .
*/
const zdl : : DlSystem : : TensorShape getInputDimensions ( ) const noexcept ;
const zdl : : DlSystem : : TensorShape getInputDimensions ( const char * name ) const noexcept ;
/**
* @ brief Returns attributes of buffers .
*
* @ see zdl : : SNPE
*
* @ return BufferAttributes of input / output tensor named .
*/
const zdl : : DlSystem : : TensorShape getBufferAttributesDims ( const char * name ) const noexcept ;
zdl : : DlSystem : : Optional < zdl : : DlSystem : : IBufferAttributes * > getInputOutputBufferAttributes ( const char * name ) const noexcept ;
bool registerIonBuffers ( const zdl : : DlSystem : : UserMemoryMap & ionBufferMap ) const noexcept ;
bool deregisterIonBuffers ( const zdl : : DlSystem : : StringList & ionBufferNames ) const noexcept ;
const char * getLastErrorString ( ) ;
private :
PSNPE ( const PSNPE & ) = delete ;
PSNPE & operator = ( const PSNPE & ) = delete ;
zdl : : PSNPE : : InputOutputTransmissionMode m_TransmissionMode ;
} ;
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
} // namespace PSNPE
} // namespace zdl
# endif // PSNPE_HPP