1*523fa7a6SAndroid Build Coastguard Worker /* 2*523fa7a6SAndroid Build Coastguard Worker * Copyright (c) Qualcomm Innovation Center, Inc. 3*523fa7a6SAndroid Build Coastguard Worker * All rights reserved. 4*523fa7a6SAndroid Build Coastguard Worker * 5*523fa7a6SAndroid Build Coastguard Worker * This source code is licensed under the BSD-style license found in the 6*523fa7a6SAndroid Build Coastguard Worker * LICENSE file in the root directory of this source tree. 7*523fa7a6SAndroid Build Coastguard Worker */ 8*523fa7a6SAndroid Build Coastguard Worker #pragma once 9*523fa7a6SAndroid Build Coastguard Worker 10*523fa7a6SAndroid Build Coastguard Worker #include <executorch/backends/qualcomm/aot/wrappers/OpWrapper.h> 11*523fa7a6SAndroid Build Coastguard Worker #include <executorch/backends/qualcomm/aot/wrappers/TensorWrapper.h> 12*523fa7a6SAndroid Build Coastguard Worker #include <executorch/backends/qualcomm/qc_compiler_spec_generated.h> 13*523fa7a6SAndroid Build Coastguard Worker #include <executorch/backends/qualcomm/runtime/Logging.h> 14*523fa7a6SAndroid Build Coastguard Worker #include <executorch/backends/qualcomm/runtime/QnnExecuTorch.h> 15*523fa7a6SAndroid Build Coastguard Worker #include <executorch/backends/qualcomm/runtime/backends/QnnBackendFactory.h> 16*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/error.h> 17*523fa7a6SAndroid Build Coastguard Worker 18*523fa7a6SAndroid Build Coastguard Worker #include <memory> 19*523fa7a6SAndroid Build Coastguard Worker #include <unordered_map> 20*523fa7a6SAndroid Build Coastguard Worker 21*523fa7a6SAndroid Build Coastguard Worker namespace executorch { 22*523fa7a6SAndroid Build Coastguard Worker namespace backends { 23*523fa7a6SAndroid Build Coastguard Worker namespace qnn { 24*523fa7a6SAndroid Build Coastguard Worker class QnnManager { 25*523fa7a6SAndroid Build Coastguard Worker public: 26*523fa7a6SAndroid Build Coastguard Worker // Construct QnnManager 27*523fa7a6SAndroid Build Coastguard Worker explicit QnnManager( 28*523fa7a6SAndroid Build Coastguard Worker const QnnExecuTorchOptions* options, 29*523fa7a6SAndroid Build Coastguard Worker const QnnExecuTorchContextBinary& qnn_executorch_context_binary); 30*523fa7a6SAndroid Build Coastguard Worker 31*523fa7a6SAndroid Build Coastguard Worker ~QnnManager(); 32*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error Init(); 33*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error AllocateTensor(const std::string& graph_name); 34*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error AllocateTensor( 35*523fa7a6SAndroid Build Coastguard Worker const std::string& graph_name, 36*523fa7a6SAndroid Build Coastguard Worker std::vector<std::shared_ptr<TensorWrapper>>& inputs, 37*523fa7a6SAndroid Build Coastguard Worker std::vector<std::shared_ptr<TensorWrapper>>& outputs); 38*523fa7a6SAndroid Build Coastguard Worker 39*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error Execute( 40*523fa7a6SAndroid Build Coastguard Worker const std::string& graph_name, 41*523fa7a6SAndroid Build Coastguard Worker const std::vector<Qnn_Tensor_t>& input_tensor_structs, 42*523fa7a6SAndroid Build Coastguard Worker std::vector<Qnn_Tensor_t>& output_tensor_structs, 43*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::EventTracer* event_tracer); 44*523fa7a6SAndroid Build Coastguard Worker 45*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error ProfileExecuteData( 46*523fa7a6SAndroid Build Coastguard Worker const std::string& graph_name, 47*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::EventTracer* event_tracer); 48*523fa7a6SAndroid Build Coastguard Worker 49*523fa7a6SAndroid Build Coastguard Worker void Destroy(); 50*523fa7a6SAndroid Build Coastguard Worker IsAvailable()51*523fa7a6SAndroid Build Coastguard Worker bool IsAvailable() { 52*523fa7a6SAndroid Build Coastguard Worker return true; 53*523fa7a6SAndroid Build Coastguard Worker } 54*523fa7a6SAndroid Build Coastguard Worker IsOnlinePrepare()55*523fa7a6SAndroid Build Coastguard Worker bool IsOnlinePrepare() { 56*523fa7a6SAndroid Build Coastguard Worker return options_->online_prepare(); 57*523fa7a6SAndroid Build Coastguard Worker } 58*523fa7a6SAndroid Build Coastguard Worker IsMultipleGraphs()59*523fa7a6SAndroid Build Coastguard Worker bool IsMultipleGraphs() { 60*523fa7a6SAndroid Build Coastguard Worker return options_->multiple_graphs(); 61*523fa7a6SAndroid Build Coastguard Worker } 62*523fa7a6SAndroid Build Coastguard Worker IsTensorDump()63*523fa7a6SAndroid Build Coastguard Worker bool IsTensorDump() { 64*523fa7a6SAndroid Build Coastguard Worker return options_->dump_intermediate_outputs(); 65*523fa7a6SAndroid Build Coastguard Worker } 66*523fa7a6SAndroid Build Coastguard Worker 67*523fa7a6SAndroid Build Coastguard Worker bool IsNodeSupportedByBackend( 68*523fa7a6SAndroid Build Coastguard Worker std::vector<std::shared_ptr<OpWrapper>>& op_wrappers); 69*523fa7a6SAndroid Build Coastguard Worker 70*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error GetContextBinary( 71*523fa7a6SAndroid Build Coastguard Worker QnnExecuTorchContextBinary& qnn_executorch_context_binary); 72*523fa7a6SAndroid Build Coastguard Worker 73*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error CompileQcir(); 74*523fa7a6SAndroid Build Coastguard Worker 75*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error Compile( 76*523fa7a6SAndroid Build Coastguard Worker const std::string& graph_name, 77*523fa7a6SAndroid Build Coastguard Worker std::vector<std::shared_ptr<OpWrapper>>& op_wrappers); 78*523fa7a6SAndroid Build Coastguard Worker 79*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error RegisterMem( 80*523fa7a6SAndroid Build Coastguard Worker void* data_ptr, 81*523fa7a6SAndroid Build Coastguard Worker const std::shared_ptr<TensorWrapper>& tensor_wrapper); 82*523fa7a6SAndroid Build Coastguard Worker 83*523fa7a6SAndroid Build Coastguard Worker // Pre-register custom memory handle from the SharedBuffer before execution 84*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error PreRegisterMem(); 85*523fa7a6SAndroid Build Coastguard Worker GetSpillFillBufferSize()86*523fa7a6SAndroid Build Coastguard Worker uint64_t GetSpillFillBufferSize() { 87*523fa7a6SAndroid Build Coastguard Worker auto* htp_backend_cache_ptr = static_cast<HtpBackendCache*>( 88*523fa7a6SAndroid Build Coastguard Worker backend_params_ptr_->qnn_backend_cache_ptr_.get()); 89*523fa7a6SAndroid Build Coastguard Worker return htp_backend_cache_ptr->GetSpillFillBufferSize(); 90*523fa7a6SAndroid Build Coastguard Worker } 91*523fa7a6SAndroid Build Coastguard Worker GetGraphInputs(const std::string & graph_name)92*523fa7a6SAndroid Build Coastguard Worker std::vector<std::shared_ptr<TensorWrapper>> GetGraphInputs( 93*523fa7a6SAndroid Build Coastguard Worker const std::string& graph_name) { 94*523fa7a6SAndroid Build Coastguard Worker return !input_tensors_.count(graph_name) 95*523fa7a6SAndroid Build Coastguard Worker ? std::vector<std::shared_ptr<TensorWrapper>>() 96*523fa7a6SAndroid Build Coastguard Worker : input_tensors_[graph_name]; 97*523fa7a6SAndroid Build Coastguard Worker } 98*523fa7a6SAndroid Build Coastguard Worker GetGraphOutputs(const std::string & graph_name)99*523fa7a6SAndroid Build Coastguard Worker std::vector<std::shared_ptr<TensorWrapper>> GetGraphOutputs( 100*523fa7a6SAndroid Build Coastguard Worker const std::string& graph_name) { 101*523fa7a6SAndroid Build Coastguard Worker return !output_tensors_.count(graph_name) 102*523fa7a6SAndroid Build Coastguard Worker ? std::vector<std::shared_ptr<TensorWrapper>>() 103*523fa7a6SAndroid Build Coastguard Worker : output_tensors_[graph_name]; 104*523fa7a6SAndroid Build Coastguard Worker } 105*523fa7a6SAndroid Build Coastguard Worker GetGraphNames()106*523fa7a6SAndroid Build Coastguard Worker std::vector<std::string> GetGraphNames() { 107*523fa7a6SAndroid Build Coastguard Worker return backend_params_ptr_->qnn_context_ptr_->GetGraphNames(); 108*523fa7a6SAndroid Build Coastguard Worker } 109*523fa7a6SAndroid Build Coastguard Worker 110*523fa7a6SAndroid Build Coastguard Worker std::string GetBinarySignature(); 111*523fa7a6SAndroid Build Coastguard Worker 112*523fa7a6SAndroid Build Coastguard Worker private: 113*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error LoadQnnLibrary(); 114*523fa7a6SAndroid Build Coastguard Worker 115*523fa7a6SAndroid Build Coastguard Worker static constexpr const char* htp_library_name_ = "libQnnHtp.so"; 116*523fa7a6SAndroid Build Coastguard Worker static constexpr const char* gpu_library_name_ = "libQnnGpu.so"; 117*523fa7a6SAndroid Build Coastguard Worker static constexpr const char* dsp_library_name_ = "libQnnDsp.so"; 118*523fa7a6SAndroid Build Coastguard Worker 119*523fa7a6SAndroid Build Coastguard Worker QnnExecuTorchContextBinary qnn_context_blob_; 120*523fa7a6SAndroid Build Coastguard Worker std::unique_ptr<BackendConfigParameters> backend_params_ptr_; 121*523fa7a6SAndroid Build Coastguard Worker QnnImplementation qnn_loaded_backend_; 122*523fa7a6SAndroid Build Coastguard Worker std::unique_ptr<QnnLogger> logger_; 123*523fa7a6SAndroid Build Coastguard Worker const QnnExecuTorchOptions* options_; 124*523fa7a6SAndroid Build Coastguard Worker std::unordered_map<std::string, std::vector<std::shared_ptr<TensorWrapper>>> 125*523fa7a6SAndroid Build Coastguard Worker input_tensors_; 126*523fa7a6SAndroid Build Coastguard Worker std::unordered_map<std::string, std::vector<std::shared_ptr<TensorWrapper>>> 127*523fa7a6SAndroid Build Coastguard Worker output_tensors_; 128*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error RegisterIonMem( 129*523fa7a6SAndroid Build Coastguard Worker void* data_ptr, 130*523fa7a6SAndroid Build Coastguard Worker const std::shared_ptr<TensorWrapper>& tensor_wrapper); 131*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error RegisterCustomMem( 132*523fa7a6SAndroid Build Coastguard Worker void* data_ptr, 133*523fa7a6SAndroid Build Coastguard Worker void* custom_mem_base, 134*523fa7a6SAndroid Build Coastguard Worker const std::shared_ptr<TensorWrapper>& tensor_wrapper); 135*523fa7a6SAndroid Build Coastguard Worker std::unordered_map<Qnn_DataType_t, executorch::aten::ScalarType> 136*523fa7a6SAndroid Build Coastguard Worker qnn_dtype_to_scalar_type_ = { 137*523fa7a6SAndroid Build Coastguard Worker {Qnn_DataType_t::QNN_DATATYPE_INT_32, 138*523fa7a6SAndroid Build Coastguard Worker executorch::aten::ScalarType::Int}, 139*523fa7a6SAndroid Build Coastguard Worker {Qnn_DataType_t::QNN_DATATYPE_FLOAT_32, 140*523fa7a6SAndroid Build Coastguard Worker executorch::aten::ScalarType::Float}, 141*523fa7a6SAndroid Build Coastguard Worker {Qnn_DataType_t::QNN_DATATYPE_SFIXED_POINT_8, 142*523fa7a6SAndroid Build Coastguard Worker executorch::aten::ScalarType::Char}, 143*523fa7a6SAndroid Build Coastguard Worker {Qnn_DataType_t::QNN_DATATYPE_SFIXED_POINT_16, 144*523fa7a6SAndroid Build Coastguard Worker executorch::aten::ScalarType::Short}, 145*523fa7a6SAndroid Build Coastguard Worker {Qnn_DataType_t::QNN_DATATYPE_UFIXED_POINT_8, 146*523fa7a6SAndroid Build Coastguard Worker executorch::aten::ScalarType::Byte}, 147*523fa7a6SAndroid Build Coastguard Worker {Qnn_DataType_t::QNN_DATATYPE_UFIXED_POINT_16, 148*523fa7a6SAndroid Build Coastguard Worker executorch::aten::ScalarType::Bits16}, 149*523fa7a6SAndroid Build Coastguard Worker }; 150*523fa7a6SAndroid Build Coastguard Worker }; 151*523fa7a6SAndroid Build Coastguard Worker } // namespace qnn 152*523fa7a6SAndroid Build Coastguard Worker } // namespace backends 153*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch 154