@@ -305,7 +305,7 @@ static vk_device_architecture get_device_architecture(const vk::PhysicalDevice&
305
305
}
306
306
307
307
struct vk_device_struct {
308
- std::mutex mutex;
308
+ std::recursive_mutex mutex;
309
309
310
310
vk::PhysicalDevice physical_device;
311
311
vk::PhysicalDeviceProperties properties;
@@ -1197,7 +1197,7 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
1197
1197
}
1198
1198
1199
1199
{
1200
- std::lock_guard<std::mutex > guard(device->mutex);
1200
+ std::lock_guard<std::recursive_mutex > guard(device->mutex);
1201
1201
device->pipelines.insert({ pipeline->name, pipeline });
1202
1202
}
1203
1203
@@ -1411,7 +1411,7 @@ static uint32_t ggml_vk_find_queue_family_index(std::vector<vk::QueueFamilyPrope
1411
1411
1412
1412
static 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) {
1413
1413
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);
1415
1415
1416
1416
q.queue_family_index = queue_family_index;
1417
1417
q.transfer_only = transfer_only;
@@ -4124,6 +4124,7 @@ static void * ggml_vk_host_malloc(vk_device& device, size_t size) {
4124
4124
return nullptr;
4125
4125
}
4126
4126
4127
+ std::lock_guard<std::recursive_mutex> guard(device->mutex);
4127
4128
device->pinned_memory.push_back(std::make_tuple(buf->ptr, size, buf));
4128
4129
4129
4130
return buf->ptr;
@@ -4134,6 +4135,8 @@ static void ggml_vk_host_free(vk_device& device, void* ptr) {
4134
4135
return;
4135
4136
}
4136
4137
VK_LOG_MEMORY("ggml_vk_host_free(" << ptr << ")");
4138
+ std::lock_guard<std::recursive_mutex> guard(device->mutex);
4139
+
4137
4140
vk_buffer buf;
4138
4141
size_t index;
4139
4142
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) {
4156
4159
}
4157
4160
4158
4161
static 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);
4159
4163
buf = nullptr;
4160
4164
buf_offset = 0;
4161
4165
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 *
4457
4461
memcpy((uint8_t *)dst->ptr + offset + i * width, (const uint8_t *) src + i * spitch, width);
4458
4462
}
4459
4463
} else {
4460
- std::lock_guard<std::mutex > guard(dst->device->mutex);
4464
+ std::lock_guard<std::recursive_mutex > guard(dst->device->mutex);
4461
4465
4462
4466
vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
4463
4467
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_
4548
4552
4549
4553
memcpy(dst, (uint8_t *) src->ptr + offset, size);
4550
4554
} else {
4551
- std::lock_guard<std::mutex > guard(src->device->mutex);
4555
+ std::lock_guard<std::recursive_mutex > guard(src->device->mutex);
4552
4556
4553
4557
vk_context subctx = ggml_vk_create_temporary_context(src->device->transfer_queue.cmd_pool);
4554
4558
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
4578
4582
4579
4583
static void ggml_vk_buffer_copy(vk_buffer& dst, size_t dst_offset, vk_buffer& src, size_t src_offset, size_t size) {
4580
4584
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);
4582
4586
VK_LOG_DEBUG("ggml_vk_buffer_copy(SINGLE_DEVICE, " << size << ")");
4583
4587
// Copy within the device
4584
4588
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
4613
4617
static void ggml_vk_buffer_memset(vk_buffer& dst, size_t offset, uint32_t c, size_t size) {
4614
4618
VK_LOG_DEBUG("ggml_vk_buffer_memset(" << offset << ", " << c << ", " << size << ")");
4615
4619
4616
- std::lock_guard<std::mutex > guard(dst->device->mutex);
4620
+ std::lock_guard<std::recursive_mutex > guard(dst->device->mutex);
4617
4621
vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
4618
4622
ggml_vk_ctx_begin(dst->device, subctx);
4619
4623
subctx->s->buffer.fillBuffer(dst->buffer, offset, size, c);
0 commit comments