@@ -12464,7 +12464,7 @@ static vk::PhysicalDeviceType ggml_backend_vk_get_device_type(int device_idx) {
1246412464 return props.properties.deviceType;
1246512465}
1246612466
12467- static std::string ggml_backend_vk_get_device_pci_id(int device_idx) {
12467+ static std::string ggml_backend_vk_get_device_pci_id(int device_idx, int *domain_pci, int *bus_pci, int *device_pci ) {
1246812468 GGML_ASSERT(device_idx >= 0 && device_idx < (int) vk_instance.device_indices.size());
1246912469
1247012470 vk::PhysicalDevice device = vk_instance.instance.enumeratePhysicalDevices()[vk_instance.device_indices[device_idx]];
@@ -12496,24 +12496,17 @@ static std::string ggml_backend_vk_get_device_pci_id(int device_idx) {
1249612496 const uint32_t pci_device = pci_bus_info.pciDevice;
1249712497 const uint8_t pci_function = (uint8_t) pci_bus_info.pciFunction; // pci function is between 0 and 7, prevent printf overflow warning
1249812498
12499+ // Safely convert uint32_t to int (PCI IDs are small, so this is safe)
12500+ if (domain_pci) *domain_pci = static_cast<int>(pci_bus_info.pciDomain);
12501+ if (bus_pci) *bus_pci = static_cast<int>(pci_bus_info.pciBus);
12502+ if (device_pci) *device_pci = static_cast<int>(pci_bus_info.pciDevice);
12503+
1249912504 char pci_bus_id[16] = {};
1250012505 snprintf(pci_bus_id, sizeof(pci_bus_id), "%04x:%02x:%02x.%x", pci_domain, pci_bus, pci_device, pci_function);
1250112506
1250212507 return std::string(pci_bus_id);
1250312508}
1250412509
12505- static bool ggml_backend_vk_parse_pci_bus_id(const std::string & id, int *domain, int *bus, int *device) {
12506- if (id.empty()) return false;
12507- unsigned int d = 0, b = 0, dev = 0, func = 0;
12508- // Expected format: dddd:bb:dd.f (all hex)
12509- int n = sscanf(id.c_str(), "%4x:%2x:%2x.%1x", &d, &b, &dev, &func);
12510- if (n < 4) return false;
12511- if (domain) *domain = (int) d;
12512- if (bus) *bus = (int) b;
12513- if (device) *device = (int) dev;
12514- return true;
12515- }
12516-
1251712510//////////////////////////
1251812511
1251912512struct ggml_backend_vk_device_context {
@@ -13023,18 +13016,11 @@ static ggml_backend_dev_t ggml_backend_vk_reg_get_device(ggml_backend_reg_t reg,
1302313016 ctx->name = GGML_VK_NAME + std::to_string(i);
1302413017 ctx->description = desc;
1302513018 ctx->is_integrated_gpu = ggml_backend_vk_get_device_type(i) == vk::PhysicalDeviceType::eIntegratedGpu;
13026- ctx->pci_bus_id = ggml_backend_vk_get_device_pci_id(i);
13027- // Parse numeric PCI components if available
13028- int d = 0, b = 0, devn = 0;
13029- if (ggml_backend_vk_parse_pci_bus_id(ctx->pci_bus_id, &d, &b, &devn)) {
13030- ctx->pciDomainID = d;
13031- ctx->pciBusID = b;
13032- ctx->pciDeviceID = devn;
13033- } else {
13034- ctx->pciDomainID = 0;
13035- ctx->pciBusID = 0;
13036- ctx->pciDeviceID = 0;
13037- }
13019+ int domain = 0, bus = 0, device = 0;
13020+ ctx->pci_bus_id = ggml_backend_vk_get_device_pci_id(i,&domain, &bus, &device);
13021+ ctx->pciDomainID = domain;
13022+ ctx->pciBusID = bus;
13023+ ctx->pciDeviceID = device;
1303813024 ctx->id = ggml_backend_vk_get_device_id(i);
1303913025 devices.push_back(new ggml_backend_device {
1304013026 /* .iface = */ ggml_backend_vk_device_i,
0 commit comments