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; }