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