xref: /aosp_15_r20/external/executorch/backends/qualcomm/runtime/QnnManager.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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