diff --git a/src/core/ggml_extend_backend.cpp b/src/core/ggml_extend_backend.cpp index 47fe80ff..70f2ae2e 100644 --- a/src/core/ggml_extend_backend.cpp +++ b/src/core/ggml_extend_backend.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -447,7 +448,19 @@ bool sd_backend_is_cpu(ggml_backend_t backend) { return false; } auto dev = ggml_backend_get_device(backend); - return dev != nullptr && ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_CPU; + if (dev == nullptr) { + return false; + } + // ggml_backend_dev_type() can query the driver on every call (CUDA reads all device + // properties), and this check runs inside per-tensor residency loops. + static std::mutex mutex; + static std::unordered_map is_cpu_by_device; + std::lock_guard lock(mutex); + auto it = is_cpu_by_device.find(dev); + if (it == is_cpu_by_device.end()) { + it = is_cpu_by_device.emplace(dev, ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_CPU).first; + } + return it->second; } static int cuda_compiled_arch(ggml_backend_t backend) {