From 626fa1de36695da69e217308b0a3632c7ca89c96 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Sun, 14 Sep 2025 14:20:06 +0300 Subject: [PATCH] metal : use virtual GPU address for private buffers ggml-ci --- ggml/src/ggml-metal/ggml-metal.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ggml/src/ggml-metal/ggml-metal.m b/ggml/src/ggml-metal/ggml-metal.m index 13f9de297e..893fb553f5 100644 --- a/ggml/src/ggml-metal/ggml-metal.m +++ b/ggml/src/ggml-metal/ggml-metal.m @@ -9,6 +9,8 @@ #import +#include + #undef MIN #undef MAX #define MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -6327,8 +6329,10 @@ static ggml_backend_buffer_t ggml_backend_metal_buffer_type_alloc_buffer(ggml_ba ctx->all_data = ggml_metal_host_malloc(size_aligned); ctx->is_shared = true; } else { - // dummy, non-NULL value - we'll populate this after creating the Metal buffer below - ctx->all_data = (void *) 0x000000400ULL; + // virtual address for GPU memory allocations + static atomic_uintptr_t addr_device = 0x000000400ULL; + + ctx->all_data = (void *) atomic_fetch_add_explicit(&addr_device, size_aligned, memory_order_relaxed); ctx->is_shared = false; } ctx->all_size = size_aligned; @@ -6351,7 +6355,10 @@ static ggml_backend_buffer_t ggml_backend_metal_buffer_type_alloc_buffer(ggml_ba } else { ctx->buffers[0].metal = [device newBufferWithLength:size_aligned options:MTLResourceStorageModePrivate]; - ctx->all_data = (void *) (ctx->buffers[0].metal.gpuAddress); + // MTLBuffer.gpuAddress is not available on early OSes, so we use a virtual address instead + //if (@available(macOS 10.13, iOS 16.0, *)) { + // ctx->all_data = (void *) (ctx->buffers[0].metal.gpuAddress); + //} } }