@@ -190,11 +190,65 @@ class StableDiffusionGGML {
190190#endif
191191#ifdef SD_USE_VULKAN
192192 LOG_DEBUG (" Using Vulkan backend" );
193- for (int device = 0 ; device < ggml_backend_vk_get_device_count (); ++device) {
194- backend = ggml_backend_vk_init (device);
193+ int dev_count = ggml_backend_vk_get_device_count ();
194+ int dev = 0 ;
195+
196+ // Log available devices
197+ LOG_INFO (" Found %d Vulkan devices:" , dev_count);
198+ for (int i = 0 ; i < dev_count; ++i) {
199+ char desc[256 ] = {0 };
200+ size_t free_mem = 0 ;
201+ size_t total_mem = 0 ;
202+ ggml_backend_vk_get_device_description (i, desc, sizeof (desc));
203+ ggml_backend_vk_get_device_memory (i, &free_mem, &total_mem);
204+ 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 );
195205 }
206+
207+ if (const char * s = getenv (" GGML_VK_DEVICE" )) {
208+ int v = atoi (s);
209+ if (v >= 0 && v < dev_count) {
210+ dev = v;
211+ }
212+ } else {
213+ // If no device is specified, try to find the best one
214+ int64_t max_score = -1 ;
215+ int best_dev = 0 ;
216+ for (int i = 0 ; i < dev_count; i++) {
217+ char desc[256 ] = {0 };
218+ size_t free_mem = 0 ;
219+ size_t total_mem = 0 ;
220+ ggml_backend_vk_get_device_description (i, desc, sizeof (desc));
221+ ggml_backend_vk_get_device_memory (i, &free_mem, &total_mem);
222+
223+ int64_t score = total_mem; // Base score on VRAM
224+
225+ std::string d (desc);
226+ // Adjust score based on device type
227+ if (d.find (" Radeon" ) != std::string::npos || d.find (" NVIDIA" ) != std::string::npos || d.find (" Arc" ) != std::string::npos) {
228+ score += 1LL << 40 ; // Discrete GPU bonus
229+ }
230+ if (d.find (" Integrated" ) != std::string::npos) {
231+ score -= 1LL << 40 ; // Integrated GPU penalty
232+ }
233+ if (d.find (" SwiftShader" ) != std::string::npos) {
234+ score = -1 ; // Heavily penalize software renderer
235+ }
236+
237+ if (score > max_score) {
238+ max_score = score;
239+ best_dev = i;
240+ }
241+ }
242+ dev = best_dev;
243+ }
244+
245+ backend = ggml_backend_vk_init (dev);
196246 if (!backend) {
197- LOG_WARN (" Failed to initialize Vulkan backend" );
247+ LOG_WARN (" Failed to initialize Vulkan backend (device %d)" , dev);
248+ } else {
249+ char desc[256 ] = {0 };
250+ ggml_backend_vk_get_device_description (dev, desc, sizeof (desc));
251+ LOG_INFO (" Vulkan selected device: %d - %s" , dev, desc);
198252 }
199253#endif
200254#ifdef SD_USE_OPENCL
0 commit comments