Skip to content

Commit 349e10f

Browse files
committed
Remove ManagedHtpPowerConfigId class and use std::optional
1 parent 52cc665 commit 349e10f

File tree

4 files changed

+53
-83
lines changed

4 files changed

+53
-83
lines changed

onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,17 +1563,17 @@ Status QnnBackendManager::SetPerThreadHtpPowerConfigs(const std::thread::id& thr
15631563

15641564
auto htp_power_config_id = htp_power_configs.power_config_id;
15651565
if (pre_run) {
1566-
if (htp_power_configs.pre_run_perf_mode_set) {
1567-
ORT_RETURN_IF_ERROR(SetHtpPowerConfig(htp_power_config_id, htp_power_configs.pre_run_perf_mode));
1566+
if (htp_power_configs.pre_run_perf_mode.has_value()) {
1567+
ORT_RETURN_IF_ERROR(SetHtpPowerConfig(htp_power_config_id, htp_power_configs.pre_run_perf_mode.value()));
15681568
}
15691569

1570-
if (htp_power_configs.rpc_configs_set) {
1570+
if (htp_power_configs.rpc_configs.has_value()) {
15711571
ORT_RETURN_IF_ERROR(SetRpcPowerConfigs(htp_power_config_id,
1572-
htp_power_configs.rpc_control_latency,
1573-
htp_power_configs.rpc_polling_time));
1572+
htp_power_configs.rpc_configs.value().rpc_control_latency,
1573+
htp_power_configs.rpc_configs.value().rpc_polling_time));
15741574
}
1575-
} else if (htp_power_configs.post_run_perf_mode_set) {
1576-
ORT_RETURN_IF_ERROR(SetHtpPowerConfig(htp_power_config_id, htp_power_configs.post_run_perf_mode));
1575+
} else if (htp_power_configs.post_run_perf_mode.has_value()) {
1576+
ORT_RETURN_IF_ERROR(SetHtpPowerConfig(htp_power_config_id, htp_power_configs.post_run_perf_mode.value()));
15771577
}
15781578

15791579
return Status::OK();

onnxruntime/core/providers/qnn/builder/qnn_def.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,15 @@ enum class HtpPerformanceMode : uint8_t {
7171
kHtpExtremePowerSaver,
7272
};
7373

74-
typedef struct PerThreadHtpPowerConfigs {
75-
HtpPerformanceMode pre_run_perf_mode = HtpPerformanceMode::kHtpDefault;
76-
HtpPerformanceMode post_run_perf_mode = HtpPerformanceMode::kHtpDefault;
74+
typedef struct RpcPowerConfigs {
7775
uint32_t rpc_control_latency = 0;
7876
uint32_t rpc_polling_time = 0;
77+
} RpcPowerConfigs_t;
7978

80-
bool pre_run_perf_mode_set = false;
81-
bool post_run_perf_mode_set = false;
82-
bool rpc_configs_set = false;
79+
typedef struct PerThreadHtpPowerConfigs {
80+
std::optional<HtpPerformanceMode> pre_run_perf_mode;
81+
std::optional<HtpPerformanceMode> post_run_perf_mode;
82+
std::optional<RpcPowerConfigs_t> rpc_configs;
8383

8484
uint32_t power_config_id = 0;
8585
} PerThreadHtpPowerConfigs_t;

onnxruntime/core/providers/qnn/qnn_execution_provider.cc

Lines changed: 34 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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

onnxruntime/core/providers/qnn/qnn_execution_provider.h

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -83,31 +83,14 @@ class QNNExecutionProvider : public IExecutionProvider {
8383
bool IsHtpSharedMemoryAllocatorAvailable() const { return rpcmem_library_ != nullptr; }
8484

8585
private:
86-
class ManagedHtpPowerConfigId {
87-
public:
88-
ManagedHtpPowerConfigId(std::shared_ptr<qnn::QnnBackendManager> qnn_backend_manager);
89-
90-
~ManagedHtpPowerConfigId();
91-
92-
void CreateHtpPowerConfigId(uint32_t device_id,
93-
qnn::HtpPerformanceMode default_htp_performance_mode,
94-
uint32_t default_rpc_control_latency,
95-
uint32_t default_rpc_polling_time);
96-
97-
bool IsValid();
98-
uint32_t GetHtpPowerConfigId();
99-
100-
private:
101-
bool is_valid_ = false;
102-
std::mutex config_id_mutex_;
103-
104-
uint32_t htp_power_config_id_;
105-
std::shared_ptr<qnn::QnnBackendManager> qnn_backend_manager_;
106-
};
107-
10886
qnn::PerThreadHtpPowerConfigs_t GetPerThreadHtpPowerConfigs(const ConfigOptions& config_options);
10987

110-
mutable std::shared_ptr<ManagedHtpPowerConfigId> managed_htp_power_config_id_ = nullptr;
88+
void CreateHtpPowerConfigId() const;
89+
// Will return false if htp_power_config_id_ has no value
90+
bool GetHtpPowerConfigId(uint32_t& htp_power_config_id);
91+
92+
mutable std::optional<uint32_t> htp_power_config_id_;
93+
mutable std::mutex config_id_mutex_;
11194

11295
qnn::HtpGraphFinalizationOptimizationMode htp_graph_finalization_opt_mode_ = qnn::HtpGraphFinalizationOptimizationMode::kDefault;
11396
// Note: Using shared_ptr<QnnBackendManager> so that we can refer to it with a weak_ptr from a

0 commit comments

Comments
 (0)