From 478f30b46da85bae26745d5cad091e7e1e6588ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=BCller?= Date: Sat, 31 Jan 2026 08:49:05 -0800 Subject: [PATCH] ggml-vulkan: serialize racy vk_instance initialization When calling whisper_init_from_file_with_params_no_state() from multiple threads with the Vulkan backend enabled, segfaults abound. The problem seems to be that vk_instance initialization is not serialized properly. Introduce a mutex to fix the problem. It needs to be recursive because of the following call chain: ggml_vk_get_device() -> ggml_backend_vk_reg() -> ggml_vk_instance_init() --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 15ed5b2a..5ca77b26 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -2060,6 +2060,7 @@ struct vk_instance_t { vk_device devices[GGML_VK_MAX_DEVICES]; }; +static std::recursive_mutex vk_instance_init_mutex; static bool vk_instance_initialized = false; static vk_instance_t vk_instance; @@ -4779,6 +4780,7 @@ static uint32_t ggml_vk_intel_shader_core_count(const vk::PhysicalDevice& vkdev) static vk_device ggml_vk_get_device(size_t idx) { VK_LOG_DEBUG("ggml_vk_get_device(" << idx << ")"); + std::lock_guard lock(vk_instance_init_mutex); if (vk_instance.devices[idx] == nullptr) { VK_LOG_DEBUG("Initializing new vk_device"); vk_device device = std::make_shared(); @@ -5713,6 +5715,7 @@ DispatchLoaderDynamic & ggml_vk_default_dispatcher() { } static void ggml_vk_instance_init() { + std::lock_guard lock(vk_instance_init_mutex); if (vk_instance_initialized) { return; }