// // QNNCommonExecution.hpp // MNN // // Created by MNN on 2025/02/11. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef MNN_QNNCOMMONEXECUTION_HPP #define MNN_QNNCOMMONEXECUTION_HPP #include "QNNBackend.hpp" #include "core/Execution.hpp" #define MNN_QNN_NOT_SUPPORT_SPECIAL_CASE \ do { \ MNN_PRINT("MNN_QNN: Some special cases of %s is not supported currently.\n", MNN::EnumNameOpType(mOp->type())); \ return NOT_SUPPORT; \ } while(0) #define MNN_QNN_NOT_SUPPORT_NATIVE_CONSTRAINT \ do { \ MNN_PRINT("MNN_QNN: Op %d parameters violated the constraints of the Qnn Htp backend.\n", (int) mOp->type()); \ return NOT_SUPPORT; \ } while(0) #define CLEAR_BEFORE_ADDING_NODE \ mNodeType.clear(); \ mInputs.clear(); \ mParams.clear(); \ mOutputs.clear(); namespace MNN { namespace QNN { #ifdef ENABLE_QNN_ONLINE_FINALIZE class QNNCommonExecution : public Execution { public: QNNCommonExecution(Backend *backend, const Op *op); virtual ~QNNCommonExecution() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onEncode(const std::vector &inputs, const std::vector &outputs); virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; protected: void setNodeName(const Op * op, const std::vector &inputs, const std::vector &outputs); std::shared_ptr createStaticTensor(const std::string & name, Qnn_DataType_t dataType, const std::vector & dimensions, const void * buffer, Qnn_QuantizeParams_t quantizeParam = DEFAULT_QUANTIZE_PARAMS); std::shared_ptr createStaticFloatTensor(const std::string & name, Qnn_DataType_t dataType, const std::vector & dimensions, const float * buffer, Qnn_QuantizeParams_t quantize = DEFAULT_QUANTIZE_PARAMS); std::shared_ptr createStageTensor(const std::string & name, Qnn_DataType_t dataType, const std::vector & dimensions, const Tensor* tensor = nullptr); std::shared_ptr createStageTensor(const std::string & name, Qnn_DataType_t dataType, const std::vector & dimensions, const Tensor* tensor = nullptr); std::shared_ptr createParamTensor(const std::string & paramName, Qnn_DataType_t dataType, const std::vector & dims, void * data, std::string postName = ""); std::shared_ptr createParamScalar(const std::string & name, bool data); std::shared_ptr createParamScalar(const std::string & name, uint32_t data); std::shared_ptr createParamScalar(const std::string & name, int data); std::shared_ptr createParamScalar(const std::string & name, float data); void addNodeCommon(const std::vector &inputs, const std::vector &outputs, int inputSize = 0, int outputSize = 0); void addNodeCommonPermute(const std::string & nodeNamePostfix, const Qnn_Tensor_t & input, const Qnn_Param_t & paramPerm, const Qnn_Tensor_t & output); void addNodeCommonReshape(const std::string & nodeNamePostfix, const Qnn_Tensor_t & input, const Qnn_Tensor_t & output); void clean(); public: QnnBackend* mBackend; const Op* mOp; // mandatory params for QnnBackend::addNodeToGraph() Qnn_OpConfigVersion_t mOpConfigVersion = QNN_OPCONFIG_VERSION_1; std::string mNodeName; std::string mPackageName = "qti.aisw"; std::string mNodeType; std::vector mParams; std::vector mInputs; std::vector mOutputs; // wrappers for , , std::vector> mTempTensorWrappers; std::vector> mParamTensorWrappers; std::vector> mParamScalarWrappers; }; #endif } // end namespace QNN } // end namespace MNN #endif /* QNNCommonExecution_hpp */