@@ -1426,13 +1426,33 @@ Status QnnBackendManager::SetHtpPowerConfig(uint32_t htp_power_config_client_id,
1426
1426
return Status::OK ();
1427
1427
}
1428
1428
1429
- Status QnnBackendManager::SetRpcControlLatency (uint32_t htp_power_config_client_id,
1430
- uint32_t rpc_control_latency) {
1429
+ Status QnnBackendManager::SetRpcPowerConfigs (uint32_t htp_power_config_client_id,
1430
+ uint32_t rpc_control_latency,
1431
+ uint32_t rpc_polling_time) {
1431
1432
// This function is called in QNN EP's OnRunStart() even if QNN backend setup failed and the model is assigned
1432
1433
// to a different EP. Therefore, we have to check that backend setup actually completed before trying to
1433
1434
// set RPC control latency. Otherwise, this causes a segfault because the QNN backend library is unloaded.
1434
1435
ORT_RETURN_IF_NOT (backend_setup_completed_, " Cannot set HTP RPC control latency if backend setup is not complete." );
1436
+
1437
+ constexpr int kNumRpcPollingPowerConfigs = 2 ;
1438
+ std::vector<QnnHtpPerfInfrastructure_PowerConfig_t> rpc_power_configs;
1439
+ rpc_power_configs.reserve (kNumRpcPollingPowerConfigs );
1440
+
1441
+ // Set rpc control latency here
1435
1442
if (rpc_control_latency != 0 ) {
1443
+ auto & rpc_control_latency_cfg = rpc_power_configs.emplace_back ();
1444
+ rpc_control_latency_cfg.option = QNN_HTP_PERF_INFRASTRUCTURE_POWER_CONFIGOPTION_RPC_CONTROL_LATENCY;
1445
+ rpc_control_latency_cfg.rpcControlLatencyConfig = rpc_control_latency;
1446
+ }
1447
+
1448
+ // Note: v68 does not support rpc polling mode
1449
+ if (rpc_polling_time != 0 ) {
1450
+ auto & rpc_polling_time_cfg = rpc_power_configs.emplace_back ();
1451
+ rpc_polling_time_cfg.option = QNN_HTP_PERF_INFRASTRUCTURE_POWER_CONFIGOPTION_RPC_POLLING_TIME;
1452
+ rpc_polling_time_cfg.rpcPollingTimeConfig = rpc_polling_time;
1453
+ }
1454
+
1455
+ if (rpc_power_configs.size () > 0 ) {
1436
1456
QnnDevice_Infrastructure_t qnn_device_infra = nullptr ;
1437
1457
auto status = qnn_interface_.deviceGetInfrastructure (&qnn_device_infra);
1438
1458
ORT_RETURN_IF (QNN_SUCCESS != status, " backendGetPerfInfrastructure failed." );
@@ -1442,15 +1462,6 @@ Status QnnBackendManager::SetRpcControlLatency(uint32_t htp_power_config_client_
1442
1462
" HTP infra type = " , htp_infra->infraType , " , which is not perf infra type." );
1443
1463
QnnHtpDevice_PerfInfrastructure_t& htp_perf_infra = htp_infra->perfInfra ;
1444
1464
1445
- // Set rpc control latency here, but note that v68 doesn't support rpc polling mode.
1446
- constexpr int kNumRpcPollingPowerConfigs = 2 ;
1447
- std::vector<QnnHtpPerfInfrastructure_PowerConfig_t> rpc_power_configs (kNumRpcPollingPowerConfigs );
1448
- QnnHtpPerfInfrastructure_PowerConfig_t& rpc_control_latency_cfg = rpc_power_configs[0 ];
1449
- // v68 doesn't support this.
1450
- QnnHtpPerfInfrastructure_PowerConfig_t& rpc_polling_time = rpc_power_configs[1 ];
1451
- rpc_control_latency_cfg.option = QNN_HTP_PERF_INFRASTRUCTURE_POWER_CONFIGOPTION_RPC_CONTROL_LATENCY;
1452
- rpc_polling_time.option = QNN_HTP_PERF_INFRASTRUCTURE_POWER_CONFIGOPTION_RPC_POLLING_TIME;
1453
- rpc_control_latency_cfg.rpcControlLatencyConfig = rpc_control_latency;
1454
1465
std::vector<const QnnHtpPerfInfrastructure_PowerConfig_t*> perf_power_configs_ptr =
1455
1466
ObtainNullTermPtrVector (rpc_power_configs);
1456
1467
status = htp_perf_infra.setPowerConfig (htp_power_config_client_id, perf_power_configs_ptr.data ());
0 commit comments