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