Skip to content

Commit 0a95b47

Browse files
committed
Select dedicated GPU on Vulkan
1 parent a3294bd commit 0a95b47

File tree

1 file changed

+57
-3
lines changed

1 file changed

+57
-3
lines changed

stable-diffusion.cpp

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

0 commit comments

Comments
 (0)