@@ -305,7 +305,7 @@ static vk_device_architecture get_device_architecture(const vk::PhysicalDevice&
305305}
306306
307307struct vk_device_struct {
308-     std::mutex  mutex;
308+     std::recursive_mutex  mutex;
309309
310310    vk::PhysicalDevice physical_device;
311311    vk::PhysicalDeviceProperties properties;
@@ -1197,7 +1197,7 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
11971197    }
11981198
11991199    {
1200-         std::lock_guard<std::mutex > guard(device->mutex);
1200+         std::lock_guard<std::recursive_mutex > guard(device->mutex);
12011201        device->pipelines.insert({ pipeline->name, pipeline });
12021202    }
12031203
@@ -1411,7 +1411,7 @@ static uint32_t ggml_vk_find_queue_family_index(std::vector<vk::QueueFamilyPrope
14111411
14121412static void ggml_vk_create_queue(vk_device& device, vk_queue& q, uint32_t queue_family_index, uint32_t queue_index, vk::PipelineStageFlags&& stage_flags, bool transfer_only) {
14131413    VK_LOG_DEBUG("ggml_vk_create_queue()");
1414-     std::lock_guard<std::mutex > guard(device->mutex);
1414+     std::lock_guard<std::recursive_mutex > guard(device->mutex);
14151415
14161416    q.queue_family_index = queue_family_index;
14171417    q.transfer_only = transfer_only;
@@ -4124,6 +4124,7 @@ static void * ggml_vk_host_malloc(vk_device& device, size_t size) {
41244124        return nullptr;
41254125    }
41264126
4127+     std::lock_guard<std::recursive_mutex> guard(device->mutex);
41274128    device->pinned_memory.push_back(std::make_tuple(buf->ptr, size, buf));
41284129
41294130    return buf->ptr;
@@ -4134,6 +4135,8 @@ static void ggml_vk_host_free(vk_device& device, void* ptr) {
41344135        return;
41354136    }
41364137    VK_LOG_MEMORY("ggml_vk_host_free(" << ptr << ")");
4138+     std::lock_guard<std::recursive_mutex> guard(device->mutex);
4139+ 
41374140    vk_buffer buf;
41384141    size_t index;
41394142    for (size_t i = 0; i < device->pinned_memory.size(); i++) {
@@ -4156,6 +4159,7 @@ static void ggml_vk_host_free(vk_device& device, void* ptr) {
41564159}
41574160
41584161static void ggml_vk_host_get(vk_device& device, const void * ptr, vk_buffer& buf, size_t& buf_offset) {
4162+     std::lock_guard<std::recursive_mutex> guard(device->mutex);
41594163    buf = nullptr;
41604164    buf_offset = 0;
41614165    for (size_t i = 0; i < device->pinned_memory.size(); i++) {
@@ -4457,7 +4461,7 @@ static void ggml_vk_buffer_write_2d(vk_buffer& dst, size_t offset, const void *
44574461            memcpy((uint8_t *)dst->ptr + offset + i * width, (const uint8_t *) src + i * spitch, width);
44584462        }
44594463    } else {
4460-         std::lock_guard<std::mutex > guard(dst->device->mutex);
4464+         std::lock_guard<std::recursive_mutex > guard(dst->device->mutex);
44614465
44624466        vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
44634467        ggml_vk_ctx_begin(dst->device, subctx);
@@ -4548,7 +4552,7 @@ static void ggml_vk_buffer_read(vk_buffer& src, size_t offset, void * dst, size_
45484552
45494553        memcpy(dst, (uint8_t *) src->ptr + offset, size);
45504554    } else {
4551-         std::lock_guard<std::mutex > guard(src->device->mutex);
4555+         std::lock_guard<std::recursive_mutex > guard(src->device->mutex);
45524556
45534557        vk_context subctx = ggml_vk_create_temporary_context(src->device->transfer_queue.cmd_pool);
45544558        ggml_vk_ctx_begin(src->device, subctx);
@@ -4578,7 +4582,7 @@ static void ggml_vk_buffer_copy_async(vk_context& ctx, vk_buffer& dst, size_t ds
45784582
45794583static void ggml_vk_buffer_copy(vk_buffer& dst, size_t dst_offset, vk_buffer& src, size_t src_offset, size_t size) {
45804584    if (src->device == dst->device) {
4581-         std::lock_guard<std::mutex > guard(src->device->mutex);
4585+         std::lock_guard<std::recursive_mutex > guard(src->device->mutex);
45824586        VK_LOG_DEBUG("ggml_vk_buffer_copy(SINGLE_DEVICE, " << size << ")");
45834587        // Copy within the device
45844588        vk_context subctx = ggml_vk_create_temporary_context(src->device->transfer_queue.cmd_pool);
@@ -4613,7 +4617,7 @@ static void ggml_vk_buffer_memset_async(vk_context& ctx, vk_buffer& dst, size_t
46134617static void ggml_vk_buffer_memset(vk_buffer& dst, size_t offset, uint32_t c, size_t size) {
46144618    VK_LOG_DEBUG("ggml_vk_buffer_memset(" << offset << ", " << c << ", " << size << ")");
46154619
4616-     std::lock_guard<std::mutex > guard(dst->device->mutex);
4620+     std::lock_guard<std::recursive_mutex > guard(dst->device->mutex);
46174621    vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
46184622    ggml_vk_ctx_begin(dst->device, subctx);
46194623    subctx->s->buffer.fillBuffer(dst->buffer, offset, size, c);
0 commit comments