@@ -164,11 +164,65 @@ class StableDiffusionGGML {
164164#endif
165165#ifdef SD_USE_VULKAN
166166 LOG_DEBUG (" Using Vulkan backend" );
167- for (int device = 0 ; device < ggml_backend_vk_get_device_count (); ++device) {
168- backend = ggml_backend_vk_init (device);
167+ int dev_count = ggml_backend_vk_get_device_count ();
168+ int dev = 0 ;
169+
170+ // Log available devices
171+ LOG_INFO (" Found %d Vulkan devices:" , dev_count);
172+ for (int i = 0 ; i < dev_count; ++i) {
173+ char desc[256 ] = {0 };
174+ size_t free_mem = 0 ;
175+ size_t total_mem = 0 ;
176+ ggml_backend_vk_get_device_description (i, desc, sizeof (desc));
177+ ggml_backend_vk_get_device_memory (i, &free_mem, &total_mem);
178+ LOG_INFO (" - %d: %s (VRAM: %.2f / %.2f GB)" , i, desc, free_mem / 1024.0 / 1024.0 / 1024.0 , total_mem / 1024.0 / 1024.0 / 1024.0 );
169179 }
180+
181+ if (const char * s = getenv (" GGML_VK_DEVICE" )) {
182+ int v = atoi (s);
183+ if (v >= 0 && v < dev_count) {
184+ dev = v;
185+ }
186+ } else {
187+ // If no device is specified, try to find the best one
188+ int64_t max_score = -1 ;
189+ int best_dev = 0 ;
190+ for (int i = 0 ; i < dev_count; i++) {
191+ char desc[256 ] = {0 };
192+ size_t free_mem = 0 ;
193+ size_t total_mem = 0 ;
194+ ggml_backend_vk_get_device_description (i, desc, sizeof (desc));
195+ ggml_backend_vk_get_device_memory (i, &free_mem, &total_mem);
196+
197+ int64_t score = total_mem; // Base score on VRAM
198+
199+ std::string d (desc);
200+ // Adjust score based on device type
201+ if (d.find (" Radeon" ) != std::string::npos || d.find (" NVIDIA" ) != std::string::npos || d.find (" Arc" ) != std::string::npos) {
202+ score += 1LL << 40 ; // Discrete GPU bonus
203+ }
204+ if (d.find (" Integrated" ) != std::string::npos) {
205+ score -= 1LL << 40 ; // Integrated GPU penalty
206+ }
207+ if (d.find (" SwiftShader" ) != std::string::npos) {
208+ score = -1 ; // Heavily penalize software renderer
209+ }
210+
211+ if (score > max_score) {
212+ max_score = score;
213+ best_dev = i;
214+ }
215+ }
216+ dev = best_dev;
217+ }
218+
219+ backend = ggml_backend_vk_init (dev);
170220 if (!backend) {
171- LOG_WARN (" Failed to initialize Vulkan backend" );
221+ LOG_WARN (" Failed to initialize Vulkan backend (device %d)" , dev);
222+ } else {
223+ char desc[256 ] = {0 };
224+ ggml_backend_vk_get_device_description (dev, desc, sizeof (desc));
225+ LOG_INFO (" Vulkan selected device: %d - %s" , dev, desc);
172226 }
173227#endif
174228#ifdef SD_USE_OPENCL
0 commit comments