@@ -598,6 +598,8 @@ QNNExecutionProvider::QNNExecutionProvider(const ProviderOptions& provider_optio
598598 }
599599 }
600600
601+ managed_htp_power_config_id_ = std::make_shared<ManagedHtpPowerConfigId>(qnn_backend_manager_);
602+
601603#if defined(_WIN32)
602604 if (onnxruntime::logging::EtwRegistrationManager::SupportsETW ()) {
603605 auto & etwRegistrationManager = logging::EtwRegistrationManager::Instance ();
@@ -660,12 +662,6 @@ QNNExecutionProvider::~QNNExecutionProvider() {
660662 logging::EtwRegistrationManager::Instance ().UnregisterInternalCallback (callback_ETWSink_provider_);
661663 }
662664#endif
663- {
664- std::lock_guard<std::mutex> lock (htp_power_config_id_mutex_);
665- if (managed_htp_power_config_id_) {
666- managed_htp_power_config_id_.reset ();
667- }
668- }
669665}
670666
671667// Logs information about the supported/unsupported nodes.
@@ -965,7 +961,10 @@ QNNExecutionProvider::GetCapability(const onnxruntime::GraphViewer& graph_viewer
965961 if (IsNpuBackend (qnn_backend_manager_->GetQnnBackendType ())) {
966962 // Set the power config id and the default power mode from provider option for main thread,
967963 // otherwise it will mess up the power mode if user just create session without run it.
968- CreateHtpPowerConfigId ();
964+ managed_htp_power_config_id_->CreateHtpPowerConfigId (device_id_,
965+ default_htp_performance_mode_,
966+ default_rpc_control_latency_,
967+ default_rpc_polling_time_);
969968 }
970969
971970 // Report error if QNN CPU backend is loaded while CPU fallback is disabled
@@ -1380,7 +1379,7 @@ qnn::PerThreadHtpPowerConfigs_t QNNExecutionProvider::GetPerThreadHtpPowerConfig
13801379 qnn::HtpPerformanceMode post_run_htp_performance_mode = qnn::HtpPerformanceMode::kHtpDefault ;
13811380
13821381 qnn::PerThreadHtpPowerConfigs_t per_thread_htp_power_configs;
1383- per_thread_htp_power_configs.power_config_id = GetHtpPowerConfigId ();
1382+ per_thread_htp_power_configs.power_config_id = managed_htp_power_config_id_-> GetHtpPowerConfigId ();
13841383
13851384 std::string htp_perf_mode = " " ;
13861385 if (TryGetConfigEntry (config_options, kOrtRunOptionsConfigQnnPerfMode , htp_perf_mode)) {
@@ -1430,7 +1429,7 @@ Status QNNExecutionProvider::OnRunStart(const onnxruntime::RunOptions& run_optio
14301429
14311430 const ConfigOptions& config_options = RunOptions__GetConfigOptions (run_options);
14321431
1433- if (IsHtpPowerConfigIdValid ()) {
1432+ if (managed_htp_power_config_id_-> IsValid ()) {
14341433 auto thread_id = std::this_thread::get_id ();
14351434 auto per_thread_htp_power_configs = GetPerThreadHtpPowerConfigs (config_options);
14361435 ORT_RETURN_IF_ERROR (qnn_backend_manager_->AddPerThreadHtpPowerConfigMapping (thread_id,
@@ -1454,7 +1453,7 @@ Status QNNExecutionProvider::OnRunEnd(bool /*sync_stream*/, const onnxruntime::R
14541453 return Status::OK ();
14551454 }
14561455
1457- if (IsHtpPowerConfigIdValid ()) {
1456+ if (managed_htp_power_config_id_-> IsValid ()) {
14581457 auto thread_id = std::this_thread::get_id ();
14591458 qnn_backend_manager_->RemovePerThreadHtpPowerConfigs (thread_id);
14601459 }
@@ -1521,8 +1520,8 @@ Status QNNExecutionProvider::SetEpDynamicOptions(gsl::span<const char* const> ke
15211520 }
15221521 qnn::HtpPerformanceMode htp_performance_mode = qnn::HtpPerformanceMode::kHtpDefault ;
15231522 ParseHtpPerformanceMode (value, htp_performance_mode);
1524- if (IsHtpPowerConfigIdValid ()) {
1525- ORT_RETURN_IF_ERROR (qnn_backend_manager_->SetHtpPowerConfig (GetHtpPowerConfigId (),
1523+ if (managed_htp_power_config_id_-> IsValid ()) {
1524+ ORT_RETURN_IF_ERROR (qnn_backend_manager_->SetHtpPowerConfig (managed_htp_power_config_id_-> GetHtpPowerConfigId (),
15261525 htp_performance_mode));
15271526 }
15281527 } else {
@@ -1537,54 +1536,52 @@ Status QNNExecutionProvider::SetEpDynamicOptions(gsl::span<const char* const> ke
15371536 return Status::OK ();
15381537}
15391538
1540- QNNExecutionProvider::ManagedHtpPowerConfigId::ManagedHtpPowerConfigId (uint32_t htp_power_config_id,
1541- std::shared_ptr<qnn::QnnBackendManager> qnn_backend_manager)
1542- : htp_power_config_id_(htp_power_config_id),
1543- qnn_backend_manager_ (qnn_backend_manager) {
1539+ QNNExecutionProvider::ManagedHtpPowerConfigId::ManagedHtpPowerConfigId (std::shared_ptr<qnn::QnnBackendManager> qnn_backend_manager)
1540+ : qnn_backend_manager_(qnn_backend_manager) {
15441541}
15451542
15461543QNNExecutionProvider::ManagedHtpPowerConfigId::~ManagedHtpPowerConfigId () {
15471544 ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->DestroyHTPPowerConfigID (htp_power_config_id_));
15481545}
15491546
1550- uint32_t QNNExecutionProvider::ManagedHtpPowerConfigId::GetHtpPowerConfigId () {
1551- return htp_power_config_id_;
1552- }
1553-
1554- void QNNExecutionProvider::CreateHtpPowerConfigId () const {
1555- std::lock_guard<std::mutex> lock (htp_power_config_id_mutex_);
1556- if (managed_htp_power_config_id_) {
1547+ void QNNExecutionProvider::ManagedHtpPowerConfigId::CreateHtpPowerConfigId (uint32_t device_id,
1548+ qnn::HtpPerformanceMode default_htp_performance_mode,
1549+ uint32_t default_rpc_control_latency,
1550+ uint32_t default_rpc_polling_time) {
1551+ std::lock_guard<std::mutex> lock (config_id_mutex_);
1552+ if (is_valid_) {
15571553 return ;
15581554 }
15591555
15601556 constexpr uint32_t core_id = 0 ;
15611557 uint32_t htp_power_config_id;
15621558
1563- Status rt = qnn_backend_manager_->CreateHtpPowerCfgId (device_id_ , core_id, htp_power_config_id);
1559+ Status rt = qnn_backend_manager_->CreateHtpPowerCfgId (device_id , core_id, htp_power_config_id);
15641560
15651561 if (rt == Status::OK ()) {
1566- managed_htp_power_config_id_ = std::make_shared<ManagedHtpPowerConfigId>( htp_power_config_id, qnn_backend_manager_) ;
1562+ htp_power_config_id_ = htp_power_config_id;
15671563
1568- if (qnn::HtpPerformanceMode::kHtpDefault != default_htp_performance_mode_ ) {
1569- ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->SetHtpPowerConfig (htp_power_config_id ,
1570- default_htp_performance_mode_ ));
1564+ if (qnn::HtpPerformanceMode::kHtpDefault != default_htp_performance_mode ) {
1565+ ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->SetHtpPowerConfig (htp_power_config_id_ ,
1566+ default_htp_performance_mode ));
15711567 }
1572- if (default_rpc_control_latency_ > 0 || default_rpc_polling_time_ > 0 ) {
1573- ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->SetRpcPowerConfigs (htp_power_config_id ,
1574- default_rpc_control_latency_ ,
1575- default_rpc_polling_time_ ));
1568+ if (default_rpc_control_latency > 0 || default_rpc_polling_time > 0 ) {
1569+ ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->SetRpcPowerConfigs (htp_power_config_id_ ,
1570+ default_rpc_control_latency ,
1571+ default_rpc_polling_time ));
15761572 }
1573+
1574+ is_valid_ = true ;
15771575 }
15781576}
15791577
1580- bool QNNExecutionProvider::IsHtpPowerConfigIdValid () {
1581- std::lock_guard<std::mutex> lock (htp_power_config_id_mutex_ );
1582- return managed_htp_power_config_id_ != nullptr ;
1578+ bool QNNExecutionProvider::ManagedHtpPowerConfigId::IsValid () {
1579+ std::lock_guard<std::mutex> lock (config_id_mutex_ );
1580+ return is_valid_ ;
15831581}
15841582
1585- uint32_t QNNExecutionProvider::GetHtpPowerConfigId () {
1586- std::lock_guard<std::mutex> lock (htp_power_config_id_mutex_);
1587- return managed_htp_power_config_id_->GetHtpPowerConfigId ();
1583+ uint32_t QNNExecutionProvider::ManagedHtpPowerConfigId::GetHtpPowerConfigId () {
1584+ return htp_power_config_id_;
15881585}
15891586
15901587} // namespace onnxruntime
0 commit comments