@@ -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;
@@ -1206,7 +1206,7 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
1206
1206
}
1207
1207
1208
1208
{
1209
- std::lock_guard<std::mutex > guard(device->mutex);
1209
+ std::lock_guard<std::recursive_mutex > guard(device->mutex);
1210
1210
device->pipelines.insert({ pipeline->name, pipeline });
1211
1211
}
1212
1212
@@ -1420,7 +1420,7 @@ static uint32_t ggml_vk_find_queue_family_index(std::vector<vk::QueueFamilyPrope
1420
1420
1421
1421
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) {
1422
1422
VK_LOG_DEBUG("ggml_vk_create_queue()");
1423
- std::lock_guard<std::mutex > guard(device->mutex);
1423
+ std::lock_guard<std::recursive_mutex > guard(device->mutex);
1424
1424
1425
1425
q.queue_family_index = queue_family_index;
1426
1426
q.transfer_only = transfer_only;
@@ -4133,6 +4133,7 @@ static void * ggml_vk_host_malloc(vk_device& device, size_t size) {
4133
4133
return nullptr;
4134
4134
}
4135
4135
4136
+ std::lock_guard<std::recursive_mutex> guard(device->mutex);
4136
4137
device->pinned_memory.push_back(std::make_tuple(buf->ptr, size, buf));
4137
4138
4138
4139
return buf->ptr;
@@ -4143,6 +4144,8 @@ static void ggml_vk_host_free(vk_device& device, void* ptr) {
4143
4144
return;
4144
4145
}
4145
4146
VK_LOG_MEMORY("ggml_vk_host_free(" << ptr << ")");
4147
+ std::lock_guard<std::recursive_mutex> guard(device->mutex);
4148
+
4146
4149
vk_buffer buf;
4147
4150
size_t index;
4148
4151
for (size_t i = 0; i < device->pinned_memory.size(); i++) {
@@ -4165,6 +4168,7 @@ static void ggml_vk_host_free(vk_device& device, void* ptr) {
4165
4168
}
4166
4169
4167
4170
static void ggml_vk_host_get(vk_device& device, const void * ptr, vk_buffer& buf, size_t& buf_offset) {
4171
+ std::lock_guard<std::recursive_mutex> guard(device->mutex);
4168
4172
buf = nullptr;
4169
4173
buf_offset = 0;
4170
4174
for (size_t i = 0; i < device->pinned_memory.size(); i++) {
@@ -4466,7 +4470,7 @@ static void ggml_vk_buffer_write_2d(vk_buffer& dst, size_t offset, const void *
4466
4470
memcpy((uint8_t *)dst->ptr + offset + i * width, (const uint8_t *) src + i * spitch, width);
4467
4471
}
4468
4472
} else {
4469
- std::lock_guard<std::mutex > guard(dst->device->mutex);
4473
+ std::lock_guard<std::recursive_mutex > guard(dst->device->mutex);
4470
4474
4471
4475
vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
4472
4476
ggml_vk_ctx_begin(dst->device, subctx);
@@ -4557,7 +4561,7 @@ static void ggml_vk_buffer_read(vk_buffer& src, size_t offset, void * dst, size_
4557
4561
4558
4562
memcpy(dst, (uint8_t *) src->ptr + offset, size);
4559
4563
} else {
4560
- std::lock_guard<std::mutex > guard(src->device->mutex);
4564
+ std::lock_guard<std::recursive_mutex > guard(src->device->mutex);
4561
4565
4562
4566
vk_context subctx = ggml_vk_create_temporary_context(src->device->transfer_queue.cmd_pool);
4563
4567
ggml_vk_ctx_begin(src->device, subctx);
@@ -4587,7 +4591,7 @@ static void ggml_vk_buffer_copy_async(vk_context& ctx, vk_buffer& dst, size_t ds
4587
4591
4588
4592
static void ggml_vk_buffer_copy(vk_buffer& dst, size_t dst_offset, vk_buffer& src, size_t src_offset, size_t size) {
4589
4593
if (src->device == dst->device) {
4590
- std::lock_guard<std::mutex > guard(src->device->mutex);
4594
+ std::lock_guard<std::recursive_mutex > guard(src->device->mutex);
4591
4595
VK_LOG_DEBUG("ggml_vk_buffer_copy(SINGLE_DEVICE, " << size << ")");
4592
4596
// Copy within the device
4593
4597
vk_context subctx = ggml_vk_create_temporary_context(src->device->transfer_queue.cmd_pool);
@@ -4622,7 +4626,7 @@ static void ggml_vk_buffer_memset_async(vk_context& ctx, vk_buffer& dst, size_t
4622
4626
static void ggml_vk_buffer_memset(vk_buffer& dst, size_t offset, uint32_t c, size_t size) {
4623
4627
VK_LOG_DEBUG("ggml_vk_buffer_memset(" << offset << ", " << c << ", " << size << ")");
4624
4628
4625
- std::lock_guard<std::mutex > guard(dst->device->mutex);
4629
+ std::lock_guard<std::recursive_mutex > guard(dst->device->mutex);
4626
4630
vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
4627
4631
ggml_vk_ctx_begin(dst->device, subctx);
4628
4632
subctx->s->buffer.fillBuffer(dst->buffer, offset, size, c);
0 commit comments