]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
vulkan: add pipeline barriers for memcpy read operations (#23770)
authorRuben Ortlam <redacted>
Fri, 12 Jun 2026 14:43:50 +0000 (16:43 +0200)
committerGitHub <redacted>
Fri, 12 Jun 2026 14:43:50 +0000 (16:43 +0200)
* vulkan: add pipeline barriers for memcpy read/write operations

* remove unnecessary host write pipeline barriers

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

index 1b1150e773107f05abb0c09e30990c295be42609..b0ad811230048dda9eaba92a3b929542303858fa 100644 (file)
@@ -7741,6 +7741,23 @@ static void ggml_vk_buffer_read_2d(vk_buffer& src, size_t offset, void * dst, si
     if(src->memory_property_flags & vk::MemoryPropertyFlagBits::eHostVisible && src->device->uma) {
         GGML_ASSERT(src->memory_property_flags & vk::MemoryPropertyFlagBits::eHostCoherent);
 
+        std::lock_guard<std::recursive_mutex> guard(src->device->mutex);
+        vk_context subctx = ggml_vk_create_temporary_context(src->device->compute_queue.cmd_pool);
+        ggml_vk_ctx_begin(src->device, subctx);
+        subctx->s->buffer->buf.pipelineBarrier(
+            vk::PipelineStageFlagBits::eComputeShader | vk::PipelineStageFlagBits::eTransfer,
+            vk::PipelineStageFlagBits::eHost,
+            {},
+            { { vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eTransferWrite,
+                vk::AccessFlagBits::eHostRead } },
+            {}, {});
+        ggml_vk_ctx_end(subctx);
+        ggml_vk_submit(subctx, src->device->fence);
+        VK_CHECK(src->device->device.waitForFences({ src->device->fence }, true, UINT64_MAX),
+                 "vk_buffer_read_2d uma waitForFences");
+        src->device->device.resetFences({ src->device->fence });
+        ggml_vk_queue_command_pools_cleanup(src->device);
+
         if (width == spitch && width == dpitch) {
             memcpy(dst, (const uint8_t *) src->ptr + offset, width * height);
         } else {