Просмотр исходного кода

vulkan: mutex around vkQueueSubmit (#14127)

This fixes the remaining crash in test-thread-safety on my system.
Jeff Bolz 7 месяцев назад
Родитель
Сommit
c89c2d1ab9
1 измененных файлов с 7 добавлено и 0 удалено
  1. 7 0
      ggml/src/ggml-vulkan/ggml-vulkan.cpp

+ 7 - 0
ggml/src/ggml-vulkan/ggml-vulkan.cpp

@@ -168,6 +168,11 @@ struct vk_command_pool {
     vk_queue *q;
     vk_queue *q;
 };
 };
 
 
+// Prevent simultaneous submissions to the same queue.
+// This could be per vk_queue if we stopped having two vk_queue structures
+// sharing the same vk::Queue.
+static std::mutex queue_mutex;
+
 struct vk_queue {
 struct vk_queue {
     uint32_t queue_family_index;
     uint32_t queue_family_index;
     vk::Queue queue;
     vk::Queue queue;
@@ -1266,6 +1271,7 @@ static vk::CommandBuffer ggml_vk_create_cmd_buffer(vk_device& device, vk_command
 static void ggml_vk_submit(vk_context& ctx, vk::Fence fence) {
 static void ggml_vk_submit(vk_context& ctx, vk::Fence fence) {
     if (ctx->seqs.empty()) {
     if (ctx->seqs.empty()) {
         if (fence) {
         if (fence) {
+            std::lock_guard<std::mutex> guard(queue_mutex);
             ctx->p->q->queue.submit({}, fence);
             ctx->p->q->queue.submit({}, fence);
         }
         }
         return;
         return;
@@ -1335,6 +1341,7 @@ static void ggml_vk_submit(vk_context& ctx, vk::Fence fence) {
         }
         }
     }
     }
 
 
+    std::lock_guard<std::mutex> guard(queue_mutex);
     ctx->p->q->queue.submit(submit_infos, fence);
     ctx->p->q->queue.submit(submit_infos, fence);
 
 
     ctx->seqs.clear();
     ctx->seqs.clear();