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