@@ -598,8 +598,6 @@ QNNExecutionProvider::QNNExecutionProvider(const ProviderOptions& provider_optio
598598 }
599599 }
600600
601- managed_htp_power_config_id_ = std::make_shared<ManagedHtpPowerConfigId>(qnn_backend_manager_);
602-
603601#if defined(_WIN32)
604602 if (onnxruntime::logging::EtwRegistrationManager::SupportsETW ()) {
605603 auto & etwRegistrationManager = logging::EtwRegistrationManager::Instance ();
@@ -654,6 +652,11 @@ QNNExecutionProvider::~QNNExecutionProvider() {
654652 if (qnn_backend_manager_) {
655653 auto thread_id = std::this_thread::get_id ();
656654 qnn_backend_manager_->RemovePerThreadHtpPowerConfigMapping (thread_id);
655+
656+ std::lock_guard<std::mutex> lock (config_id_mutex_);
657+ if (htp_power_config_id_.has_value ()) {
658+ ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->DestroyHTPPowerConfigID (htp_power_config_id_.value ()));
659+ }
657660 }
658661
659662 // Unregister the ETW callback
@@ -961,10 +964,7 @@ QNNExecutionProvider::GetCapability(const onnxruntime::GraphViewer& graph_viewer
961964 if (IsNpuBackend (qnn_backend_manager_->GetQnnBackendType ())) {
962965 // Set the power config id and the default power mode from provider option for main thread,
963966 // otherwise it will mess up the power mode if user just create session without run it.
964- managed_htp_power_config_id_->CreateHtpPowerConfigId (device_id_,
965- default_htp_performance_mode_,
966- default_rpc_control_latency_,
967- default_rpc_polling_time_);
967+ CreateHtpPowerConfigId ();
968968 }
969969
970970 // Report error if QNN CPU backend is loaded while CPU fallback is disabled
@@ -1379,7 +1379,6 @@ qnn::PerThreadHtpPowerConfigs_t QNNExecutionProvider::GetPerThreadHtpPowerConfig
13791379 qnn::HtpPerformanceMode post_run_htp_performance_mode = qnn::HtpPerformanceMode::kHtpDefault ;
13801380
13811381 qnn::PerThreadHtpPowerConfigs_t per_thread_htp_power_configs;
1382- per_thread_htp_power_configs.power_config_id = managed_htp_power_config_id_->GetHtpPowerConfigId ();
13831382
13841383 std::string htp_perf_mode = " " ;
13851384 if (TryGetConfigEntry (config_options, kOrtRunOptionsConfigQnnPerfMode , htp_perf_mode)) {
@@ -1404,18 +1403,15 @@ qnn::PerThreadHtpPowerConfigs_t QNNExecutionProvider::GetPerThreadHtpPowerConfig
14041403
14051404 if (qnn::HtpPerformanceMode::kHtpDefault != pre_run_htp_performance_mode) {
14061405 per_thread_htp_power_configs.pre_run_perf_mode = pre_run_htp_performance_mode;
1407- per_thread_htp_power_configs.pre_run_perf_mode_set = true ;
14081406 }
14091407
14101408 if (qnn::HtpPerformanceMode::kHtpDefault != post_run_htp_performance_mode) {
14111409 per_thread_htp_power_configs.post_run_perf_mode = post_run_htp_performance_mode;
1412- per_thread_htp_power_configs.post_run_perf_mode_set = true ;
14131410 }
14141411
14151412 if (rpc_control_latency > 0 || rpc_polling_time > 0 ) {
1416- per_thread_htp_power_configs.rpc_control_latency = rpc_control_latency;
1417- per_thread_htp_power_configs.rpc_polling_time = rpc_polling_time;
1418- per_thread_htp_power_configs.rpc_configs_set = true ;
1413+ per_thread_htp_power_configs.rpc_configs = {rpc_control_latency,
1414+ rpc_polling_time};
14191415 }
14201416
14211417 return per_thread_htp_power_configs;
@@ -1429,9 +1425,11 @@ Status QNNExecutionProvider::OnRunStart(const onnxruntime::RunOptions& run_optio
14291425
14301426 const ConfigOptions& config_options = RunOptions__GetConfigOptions (run_options);
14311427
1432- if (managed_htp_power_config_id_->IsValid ()) {
1428+ uint32_t htp_power_config_id = 0 ;
1429+ if (GetHtpPowerConfigId (htp_power_config_id)) {
14331430 auto thread_id = std::this_thread::get_id ();
14341431 auto per_thread_htp_power_configs = GetPerThreadHtpPowerConfigs (config_options);
1432+ per_thread_htp_power_configs.power_config_id = htp_power_config_id;
14351433 ORT_RETURN_IF_ERROR (qnn_backend_manager_->AddPerThreadHtpPowerConfigMapping (thread_id,
14361434 per_thread_htp_power_configs));
14371435 }
@@ -1453,7 +1451,8 @@ Status QNNExecutionProvider::OnRunEnd(bool /*sync_stream*/, const onnxruntime::R
14531451 return Status::OK ();
14541452 }
14551453
1456- if (managed_htp_power_config_id_->IsValid ()) {
1454+ uint32_t htp_power_config_id;
1455+ if (GetHtpPowerConfigId (htp_power_config_id)) {
14571456 auto thread_id = std::this_thread::get_id ();
14581457 qnn_backend_manager_->RemovePerThreadHtpPowerConfigMapping (thread_id);
14591458 }
@@ -1520,8 +1519,10 @@ Status QNNExecutionProvider::SetEpDynamicOptions(gsl::span<const char* const> ke
15201519 }
15211520 qnn::HtpPerformanceMode htp_performance_mode = qnn::HtpPerformanceMode::kHtpDefault ;
15221521 ParseHtpPerformanceMode (value, htp_performance_mode);
1523- if (managed_htp_power_config_id_->IsValid ()) {
1524- ORT_RETURN_IF_ERROR (qnn_backend_manager_->SetHtpPowerConfig (managed_htp_power_config_id_->GetHtpPowerConfigId (),
1522+
1523+ uint32_t htp_power_config_id = 0 ;
1524+ if (GetHtpPowerConfigId (htp_power_config_id)) {
1525+ ORT_RETURN_IF_ERROR (qnn_backend_manager_->SetHtpPowerConfig (htp_power_config_id,
15251526 htp_performance_mode));
15261527 }
15271528 } else {
@@ -1536,54 +1537,40 @@ Status QNNExecutionProvider::SetEpDynamicOptions(gsl::span<const char* const> ke
15361537 return Status::OK ();
15371538}
15381539
1539- QNNExecutionProvider::ManagedHtpPowerConfigId::ManagedHtpPowerConfigId (std::shared_ptr<qnn::QnnBackendManager> qnn_backend_manager)
1540- : qnn_backend_manager_(qnn_backend_manager) {
1541- }
1542-
1543- QNNExecutionProvider::ManagedHtpPowerConfigId::~ManagedHtpPowerConfigId () {
1544- if (qnn_backend_manager_ && is_valid_) {
1545- ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->DestroyHTPPowerConfigID (htp_power_config_id_));
1540+ bool QNNExecutionProvider::GetHtpPowerConfigId (uint32_t & htp_power_config_id) {
1541+ std::lock_guard<std::mutex> lock (config_id_mutex_);
1542+ if (!htp_power_config_id_.has_value ()) {
1543+ return false ;
15461544 }
1545+
1546+ htp_power_config_id = htp_power_config_id_.value ();
1547+ return true ;
15471548}
15481549
1549- void QNNExecutionProvider::ManagedHtpPowerConfigId::CreateHtpPowerConfigId (uint32_t device_id,
1550- qnn::HtpPerformanceMode default_htp_performance_mode,
1551- uint32_t default_rpc_control_latency,
1552- uint32_t default_rpc_polling_time) {
1550+ void QNNExecutionProvider::CreateHtpPowerConfigId () const {
15531551 std::lock_guard<std::mutex> lock (config_id_mutex_);
1554- if (is_valid_ ) {
1552+ if (htp_power_config_id_. has_value () ) {
15551553 return ;
15561554 }
15571555
15581556 constexpr uint32_t core_id = 0 ;
15591557 uint32_t htp_power_config_id;
15601558
1561- 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);
15621560
15631561 if (rt == Status::OK ()) {
15641562 htp_power_config_id_ = htp_power_config_id;
15651563
1566- if (qnn::HtpPerformanceMode::kHtpDefault != default_htp_performance_mode ) {
1567- ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->SetHtpPowerConfig (htp_power_config_id_ ,
1568- 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_ ));
15691567 }
1570- if (default_rpc_control_latency > 0 || default_rpc_polling_time > 0 ) {
1571- ORT_IGNORE_RETURN_VALUE (qnn_backend_manager_->SetRpcPowerConfigs (htp_power_config_id_ ,
1572- default_rpc_control_latency ,
1573- 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_ ));
15741572 }
1575-
1576- is_valid_ = true ;
15771573 }
15781574}
15791575
1580- bool QNNExecutionProvider::ManagedHtpPowerConfigId::IsValid () {
1581- std::lock_guard<std::mutex> lock (config_id_mutex_);
1582- return is_valid_;
1583- }
1584-
1585- uint32_t QNNExecutionProvider::ManagedHtpPowerConfigId::GetHtpPowerConfigId () {
1586- return htp_power_config_id_;
1587- }
1588-
15891576} // namespace onnxruntime
0 commit comments