@@ -214,107 +214,29 @@ void BasicBackend::PopulateConfigValue(ov::AnyMap& device_config) {
214214  if  (!session_context_.load_config .empty ()) {
215215    const  std::map<std::string, ov::AnyMap>& target_config = session_context_.load_config ;
216216
217-     if  ((session_context_.device_type .find (" NPU"  ) != std::string::npos) && session_context_.enable_causallm ) {
218-       if  (target_config.find (" NPU"  ) != target_config.end ()) {
219-         auto  npu_genai_config = target_config.at (" NPU"  );
220-         CausalLMConfig ().ApplyConfig (npu_genai_config, device_config);
221-       } else  {
222-         LOGS_DEFAULT (WARNING) << " ORT GenAI CausalLMConfig Configuration not found."  ;
223-       }
224-     }
225- 
226-     if  (session_context_.device_type .find (" NPU"  ) != std::string::npos) {
227-       auto  npuw_config = target_config.at (" NPU"  );
228- 
229-       //  Check if "NPU_USE_NPUW" exists and is set to "YES"
230-       auto  npu_use_npuw_it = npuw_config.find (" NPU_USE_NPUW"  );
231-       if  (npu_use_npuw_it != npuw_config.end () &&
232-           npu_use_npuw_it->second .is <std::string>() &&
233-           npu_use_npuw_it->second .as <std::string>() == " YES"  ) {
234-         //  Only add NPUW-related keys if NPU_USE_NPUW is "YES"
235-         for  (const  auto & [key, value] : npuw_config) {
236-           if  (key.find (" NPUW"  ) != std::string::npos) {
237-             if  (!value.is <std::string>()) {
238-               LOGS_DEFAULT (ERROR) << " Invalid value type for key: "   << key;
239-               continue ;
240-             }
241-             device_config[key] = value;
242-           }
243-         }
244-       } else  {
245-         //  Check if there are any "NPUW" keys and log a warning
246-         if  (std::any_of (npuw_config.begin (), npuw_config.end (),
247-                         [&](const  auto & pair) { return  pair.first .find (" NPUW"  ) != std::string::npos; })) {
248-           LOGS_DEFAULT (WARNING) << " Skipping NPUW-related configurations as NPU_USE_NPUW is not set to 'YES'."  ;
249-         }
250-       }
251-     }
252-     auto  find_device_type_mode = [&](const  std::string& device_type) -> std::string {
253-       std::string device_mode = " "  ;
254-       auto  delimiter_pos = device_type.find (' :'  );
255-       if  (delimiter_pos != std::string::npos) {
256-         std::stringstream str_stream (device_type.substr (0 , delimiter_pos));
257-         std::getline (str_stream, device_mode, ' ,'  );
258-       }
259-       return  device_mode;
260-     };
217+     //  Extract device names from device string and apply their configs
218+     //  Examples: "GPU" -> ["GPU"], "AUTO:GPU.0,CPU" -> ["AUTO", "GPU", "CPU"]
219+     auto  apply_device_config = [&](std::string_view device) {
220+       if  (device.empty ()) return ;
261221
262-     //  Parse device types like "AUTO:CPU,GPU" and extract individual devices
263-     auto  parse_individual_devices = [&](const  std::string& device_type) -> std::vector<std::string> {
264-       std::vector<std::string> devices;
265-       auto  delimiter_pos = device_type.find (' :'  );
266-       if  (delimiter_pos != std::string::npos) {
267-         std::stringstream str_stream (device_type.substr (delimiter_pos + 1 ));
268-         std::string device;
269-         while  (std::getline (str_stream, device, ' ,'  )) {
270-           devices.emplace_back (device);
271-         }
272-       } else  {
273-         devices.emplace_back (device_type);
274-       }
275-       return  devices;
276-     };
222+       //  Remove device index: "GPU.0" -> "GPU"
223+       auto  base_device = device.substr (0 , device.find (' .'  ));
277224
278-     //  Set properties, Validation will be handled by OpenVINO Core
279-     auto  set_target_properties = [&](const  std::string& device, const  ov::AnyMap& config_options) {
280-       for  (const  auto & [key, value] : config_options) {
281-         //  Update the device_config map from the target_config to avoid load_config being overridden
282-         //  by the device_config set by the OpenVINO EP.
283-         auto  it = device_config.find (key);
284-         if  (it != device_config.end ()) {
285-           it->second  = value;
286-         }
287-         if  ((key.find (" NPUW"  ) != std::string::npos) ||
288-             ((it != device_config.end ()) && session_context_.enable_causallm )) {
289-           continue ;
225+       if  (auto  config_it = target_config.find (std::string (base_device)); config_it != target_config.end ()) {
226+         for  (const  auto & [key, value] : config_it->second ) {
227+           device_config[key] = value;
290228        }
291-         OVCore::Get ()->core .set_property (device, ov::AnyMap{{key, value}});
292229      }
293230    };
294231
295-     //  Check if the device type is AUTO, HETERO, or MULTI
296-     if  (session_context_.device_type .find (" AUTO"  ) == 0  ||
297-         session_context_.device_type .find (" HETERO"  ) == 0  ||
298-         session_context_.device_type .find (" MULTI"  ) == 0 ) {
299-       // // Parse to get the device mode (e.g., "AUTO:CPU,GPU" -> "AUTO")
300-       std::unordered_set<std::string> supported_mode = {" AUTO"  , " HETERO"  , " MULTI"  };
301-       auto  device_mode = find_device_type_mode (session_context_.device_type );
302-       ORT_ENFORCE (supported_mode.find (device_mode) != supported_mode.end (), "  Invalid device mode is passed : "  , session_context_.device_type );
303-       //  Parse individual devices (e.g., "AUTO:CPU,GPU" -> ["CPU", "GPU"])
304-       auto  individual_devices = parse_individual_devices (session_context_.device_type );
305-       if  (!device_mode.empty ()) individual_devices.emplace_back (device_mode);
306- 
307-       //  Set properties only for individual devices (e.g., "CPU", "GPU")
308-       for  (const  std::string& device : individual_devices) {
309-         if  (target_config.count (device)) {
310-           //  Set properties for the device
311-           set_target_properties (device, target_config.at (device));
232+     //  Parse device string by splitting on ':' and ',' delimiters
233+     const  auto & device_str = session_context_.device_type ;
234+     for  (size_t  start = 0 , pos = 0 ; pos <= device_str.size (); ++pos) {
235+       if  (pos == device_str.size () || device_str[pos] == ' :'   || device_str[pos] == ' ,'  ) {
236+         if  (pos > start) {
237+           apply_device_config (std::string_view (device_str).substr (start, pos - start));
312238        }
313-       }
314-     } else  {
315-       if  (target_config.count (session_context_.device_type )) {
316-         set_target_properties (session_context_.device_type ,
317-                               target_config.at (session_context_.device_type ));
239+         start = pos + 1 ;
318240      }
319241    }
320242  }
0 commit comments