Skip to content

Commit 211be54

Browse files
jeffbolznvJohannesGaessler
authored andcommitted
vulkan: lock accesses of pinned_memory vector (ggml-org#14333)
1 parent ee151e3 commit 211be54

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

ggml/src/ggml-vulkan/ggml-vulkan.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ static vk_device_architecture get_device_architecture(const vk::PhysicalDevice&
305305
}
306306

307307
struct vk_device_struct {
308-
std::mutex mutex;
308+
std::recursive_mutex mutex;
309309

310310
vk::PhysicalDevice physical_device;
311311
vk::PhysicalDeviceProperties properties;
@@ -1206,7 +1206,7 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
12061206
}
12071207

12081208
{
1209-
std::lock_guard<std::mutex> guard(device->mutex);
1209+
std::lock_guard<std::recursive_mutex> guard(device->mutex);
12101210
device->pipelines.insert({ pipeline->name, pipeline });
12111211
}
12121212

@@ -1420,7 +1420,7 @@ static uint32_t ggml_vk_find_queue_family_index(std::vector<vk::QueueFamilyPrope
14201420

14211421
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) {
14221422
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);
14241424

14251425
q.queue_family_index = queue_family_index;
14261426
q.transfer_only = transfer_only;
@@ -4133,6 +4133,7 @@ static void * ggml_vk_host_malloc(vk_device& device, size_t size) {
41334133
return nullptr;
41344134
}
41354135

4136+
std::lock_guard<std::recursive_mutex> guard(device->mutex);
41364137
device->pinned_memory.push_back(std::make_tuple(buf->ptr, size, buf));
41374138

41384139
return buf->ptr;
@@ -4143,6 +4144,8 @@ static void ggml_vk_host_free(vk_device& device, void* ptr) {
41434144
return;
41444145
}
41454146
VK_LOG_MEMORY("ggml_vk_host_free(" << ptr << ")");
4147+
std::lock_guard<std::recursive_mutex> guard(device->mutex);
4148+
41464149
vk_buffer buf;
41474150
size_t index;
41484151
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) {
41654168
}
41664169

41674170
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);
41684172
buf = nullptr;
41694173
buf_offset = 0;
41704174
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 *
44664470
memcpy((uint8_t *)dst->ptr + offset + i * width, (const uint8_t *) src + i * spitch, width);
44674471
}
44684472
} else {
4469-
std::lock_guard<std::mutex> guard(dst->device->mutex);
4473+
std::lock_guard<std::recursive_mutex> guard(dst->device->mutex);
44704474

44714475
vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
44724476
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_
45574561

45584562
memcpy(dst, (uint8_t *) src->ptr + offset, size);
45594563
} else {
4560-
std::lock_guard<std::mutex> guard(src->device->mutex);
4564+
std::lock_guard<std::recursive_mutex> guard(src->device->mutex);
45614565

45624566
vk_context subctx = ggml_vk_create_temporary_context(src->device->transfer_queue.cmd_pool);
45634567
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
45874591

45884592
static void ggml_vk_buffer_copy(vk_buffer& dst, size_t dst_offset, vk_buffer& src, size_t src_offset, size_t size) {
45894593
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);
45914595
VK_LOG_DEBUG("ggml_vk_buffer_copy(SINGLE_DEVICE, " << size << ")");
45924596
// Copy within the device
45934597
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
46224626
static void ggml_vk_buffer_memset(vk_buffer& dst, size_t offset, uint32_t c, size_t size) {
46234627
VK_LOG_DEBUG("ggml_vk_buffer_memset(" << offset << ", " << c << ", " << size << ")");
46244628

4625-
std::lock_guard<std::mutex> guard(dst->device->mutex);
4629+
std::lock_guard<std::recursive_mutex> guard(dst->device->mutex);
46264630
vk_context subctx = ggml_vk_create_temporary_context(dst->device->transfer_queue.cmd_pool);
46274631
ggml_vk_ctx_begin(dst->device, subctx);
46284632
subctx->s->buffer.fillBuffer(dst->buffer, offset, size, c);

0 commit comments

Comments
 (0)