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