@@ -37,9 +37,7 @@ bool CompareExportedInput(
37
37
}
38
38
39
39
QnnManager::~QnnManager () {
40
- backend_params_ptr_.reset (new BackendConfigParameters ());
41
- logger_.reset ();
42
- qnn_loaded_backend_.TerminateAllBackends ();
40
+ Destroy ();
43
41
}
44
42
45
43
QnnManager::QnnManager (
@@ -96,10 +94,14 @@ QnnManager::QnnManager(
96
94
}
97
95
qnn_loaded_backend_ = QnnImplementation (library_path);
98
96
backend_params_ptr_ = std::make_unique<BackendConfigParameters>();
97
+
98
+ qnn_dlc_manager_ =
99
+ std::make_shared<QnnDlcManager>(qnn_context_blob_, options_);
99
100
}
100
101
101
102
Error QnnManager::LoadQnnLibrary () {
102
- Error ret = qnn_loaded_backend_.Load (nullptr );
103
+ auto config = GetImplementationConfig ();
104
+ Error ret = qnn_loaded_backend_.Load (config.get ());
103
105
return ret;
104
106
}
105
107
@@ -286,7 +288,11 @@ Error QnnManager::Init() {
286
288
" parameters for Qnn executorch backend type %d" ,
287
289
options_->backend_options ()->backend_type ());
288
290
backend_params_ptr_ = QnnBackendFactory ().Create (
289
- qnn_loaded_backend_, logger_.get (), qnn_context_blob_, options_);
291
+ qnn_loaded_backend_,
292
+ logger_.get (),
293
+ qnn_context_blob_,
294
+ options_,
295
+ qnn_dlc_manager_.get ());
290
296
ET_CHECK_OR_RETURN_ERROR (
291
297
backend_params_ptr_ != nullptr ,
292
298
Internal,
@@ -326,6 +332,18 @@ Error QnnManager::Init() {
326
332
Internal,
327
333
" Fail to pre register custom memory handle" );
328
334
#endif
335
+
336
+ if (IsOnlinePrepare ()) {
337
+ Qnn_ApiVersion_t qnn_version = {QNN_VERSION_INIT};
338
+ qnn_loaded_backend_.GetQnnInterface ().qnn_backend_get_api_version (
339
+ &qnn_version);
340
+
341
+ ET_CHECK_OR_RETURN_ERROR (
342
+ qnn_dlc_manager_->SetUpDlcEnvironment (qnn_version.coreApiVersion ) ==
343
+ Error::Ok,
344
+ Internal,
345
+ " Fail to setup Dlc environment" );
346
+ }
329
347
return Error::Ok;
330
348
}
331
349
@@ -446,9 +464,11 @@ Error QnnManager::ProfileExecuteData(
446
464
void QnnManager::Destroy () {
447
465
QNN_EXECUTORCH_LOG_INFO (" Destroy Qnn backend parameters" );
448
466
backend_params_ptr_.reset (new BackendConfigParameters ());
467
+ qnn_dlc_manager_->ResetBackendParams ();
449
468
logger_.reset ();
450
-
469
+ qnn_dlc_manager_-> ResetLogger ();
451
470
qnn_loaded_backend_.TerminateAllBackends ();
471
+ qnn_dlc_manager_->TerminateAllBackends ();
452
472
}
453
473
454
474
bool QnnManager::IsNodeSupportedByBackend (
@@ -483,11 +503,64 @@ bool QnnManager::IsNodeSupportedByBackend(
483
503
484
504
Error QnnManager::GetContextBinary (
485
505
QnnExecuTorchContextBinary& qnn_executorch_context_binary) {
486
- ET_CHECK_OR_RETURN_ERROR (
487
- backend_params_ptr_->qnn_context_ptr_ ->GetContextBinary (
488
- qnn_executorch_context_binary) == Error::Ok,
489
- Internal,
490
- " Fail to get context binary." );
506
+ if (IsOnlinePrepare () &&
507
+ qnn_dlc_manager_->backend_params_ptr_ ->qnn_context_ptr_ .get () !=
508
+ nullptr ) {
509
+ ET_CHECK_OR_RETURN_ERROR (
510
+ qnn_dlc_manager_->backend_params_ptr_ ->qnn_context_ptr_
511
+ ->GetContextBinary (qnn_executorch_context_binary) == Error::Ok,
512
+ Internal,
513
+ " Fail to get context binary." );
514
+ }
515
+
516
+ else {
517
+ ET_CHECK_OR_RETURN_ERROR (
518
+ backend_params_ptr_->qnn_context_ptr_ ->GetContextBinary (
519
+ qnn_executorch_context_binary) == Error::Ok,
520
+ Internal,
521
+ " Fail to get context binary." );
522
+ }
523
+ return Error::Ok;
524
+ }
525
+
526
+ Error QnnManager::CompileDlc () {
527
+ Qnn_ErrorHandle_t error;
528
+ auto qnn_dlc_graph_info = qnn_dlc_manager_->GetQnnDlcGraphInfoPtr ();
529
+ uint32_t qnn_dlc_graph_info_num = qnn_dlc_manager_->GetQnnDlcGraphInfoNum ();
530
+ for (uint32_t i = 0 ; i < qnn_dlc_graph_info_num; ++i) {
531
+ auto & graphInfo = (*qnn_dlc_graph_info)[i];
532
+ backend_params_ptr_->qnn_graph_ptr_ ->SetGraphHandle (
533
+ graphInfo.graphName , graphInfo.graph );
534
+ error =
535
+ backend_params_ptr_->qnn_graph_ptr_ ->GraphFinalize (graphInfo.graphName );
536
+ if (error != QNN_SUCCESS) {
537
+ QNN_EXECUTORCH_LOG_ERROR (
538
+ " Failed to finalize Qnn Graph with error: %d" ,
539
+ QNN_GET_ERROR_CODE (error));
540
+ return Error::Internal;
541
+ }
542
+
543
+ std::vector<std::shared_ptr<TensorWrapper>> graph_inputs, graph_outputs,
544
+ tensors;
545
+
546
+ for (int i = 0 ; i < graphInfo.numInputTensors ; ++i) {
547
+ auto tw = CreateTensorWrapper (graphInfo.inputTensors [i]);
548
+ tw->UpdateQnnTensorMeta (graphInfo.inputTensors [i]);
549
+ graph_inputs.push_back (tw);
550
+ }
551
+ for (int i = 0 ; i < graphInfo.numOutputTensors ; ++i) {
552
+ auto tw = CreateTensorWrapper (graphInfo.outputTensors [i]);
553
+ tw->UpdateQnnTensorMeta (graphInfo.outputTensors [i]);
554
+ graph_outputs.push_back (tw);
555
+ }
556
+
557
+ ET_CHECK_OR_RETURN_ERROR (
558
+ AllocateTensor (graphInfo.graphName , graph_inputs, graph_outputs) ==
559
+ Error::Ok,
560
+ Internal,
561
+ " Fail to allocate tensor for Dlc with graph_name: %s" ,
562
+ graphInfo.graphName );
563
+ }
491
564
492
565
return Error::Ok;
493
566
}
@@ -616,31 +689,34 @@ Error QnnManager::Compile(
616
689
const std::string& graph_name,
617
690
std::vector<std::shared_ptr<OpWrapper>>& op_wrappers) {
618
691
Qnn_ErrorHandle_t error = QNN_SUCCESS;
692
+ QnnGraph* qnn_graph_ptr = backend_params_ptr_->qnn_graph_ptr_ .get ();
619
693
694
+ if (IsOnlinePrepare () &&
695
+ qnn_dlc_manager_->backend_params_ptr_ ->qnn_graph_ptr_ .get () != nullptr ) {
696
+ qnn_graph_ptr = qnn_dlc_manager_->backend_params_ptr_ ->qnn_graph_ptr_ .get ();
697
+ }
620
698
for (std::shared_ptr<OpWrapper>& op_wrapper : op_wrappers) {
621
699
for (const auto & tensor_wrapper : op_wrapper->GetInputTensors ()) {
622
700
ET_CHECK_OR_RETURN_ERROR (
623
- backend_params_ptr_-> qnn_graph_ptr_ -> EnsureTensorInQnnGraph (
624
- graph_name, tensor_wrapper) == Error::Ok,
701
+ qnn_graph_ptr-> EnsureTensorInQnnGraph (graph_name, tensor_wrapper) ==
702
+ Error::Ok,
625
703
Internal,
626
704
" Tensor name %s isn't added to Qnn Graph" ,
627
705
tensor_wrapper->GetName ().c_str ());
628
706
}
629
-
630
707
for (const auto & tensor_wrapper : op_wrapper->GetOutputTensors ()) {
631
708
ET_CHECK_OR_RETURN_ERROR (
632
- backend_params_ptr_-> qnn_graph_ptr_ -> EnsureTensorInQnnGraph (
633
- graph_name, tensor_wrapper) == Error::Ok,
709
+ qnn_graph_ptr-> EnsureTensorInQnnGraph (graph_name, tensor_wrapper) ==
710
+ Error::Ok,
634
711
Internal,
635
712
" Tensor name %s isn't added to Qnn Graph" ,
636
713
tensor_wrapper->GetName ().c_str ());
637
714
}
638
-
639
715
for (const auto & param : op_wrapper->GetParams ()) {
640
716
auto * p_tensor_param = dynamic_cast <TensorParamWrapper*>(param.get ());
641
717
if (p_tensor_param != nullptr ) {
642
718
ET_CHECK_OR_RETURN_ERROR (
643
- backend_params_ptr_-> qnn_graph_ptr_ ->EnsureTensorInQnnGraph (
719
+ qnn_graph_ptr ->EnsureTensorInQnnGraph (
644
720
graph_name, p_tensor_param->GetTensorWrapper ()) == Error::Ok,
645
721
Internal,
646
722
" Param tensor name %s isn't added to Qnn Graph" ,
@@ -652,23 +728,21 @@ Error QnnManager::Compile(
652
728
" Fail to configure Qnn backend" );
653
729
}
654
730
655
- error = backend_params_ptr_->qnn_graph_ptr_ ->GraphAddNode (
656
- graph_name, op_wrapper->GetOpConfig ());
731
+ error = qnn_graph_ptr->GraphAddNode (graph_name, op_wrapper->GetOpConfig ());
657
732
if (error != QNN_SUCCESS) {
658
733
QNN_EXECUTORCH_LOG_ERROR (
659
734
" Failed to add node to Qnn Graph with error: %d" ,
660
735
QNN_GET_ERROR_CODE (error));
661
736
return Error::Internal;
662
737
}
663
738
}
664
- error = backend_params_ptr_-> qnn_graph_ptr_ ->GraphFinalize (graph_name);
739
+ error = qnn_graph_ptr ->GraphFinalize (graph_name);
665
740
if (error != QNN_SUCCESS) {
666
741
QNN_EXECUTORCH_LOG_ERROR (
667
742
" Failed to finalize Qnn Graph with error: %d" ,
668
743
QNN_GET_ERROR_CODE (error));
669
744
return Error::Internal;
670
745
}
671
-
672
746
return Error::Ok;
673
747
}
674
748
0 commit comments