From bc04508666f2b59b4217b5e59fe6e67676d19269 Mon Sep 17 00:00:00 2001 From: Kilty McGowan Date: Sun, 4 Jun 2023 21:30:54 -0700 Subject: [PATCH] Use MTLDevice.newBufferWithBytesNoCopy to share buffers between CPU and GPU --- ggml-metal.m | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ggml-metal.m b/ggml-metal.m index 3cb423a01..82c65963b 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -195,14 +195,25 @@ bool ggml_metal_add_buffer( } } + size_t page_size = getpagesize(); + size_t aligned_size = size; + if ((aligned_size % page_size) != 0) { + aligned_size += (page_size - (aligned_size % page_size)); + } + ctx->buffers[ctx->n_buffers].name = name; ctx->buffers[ctx->n_buffers].data = data; ctx->buffers[ctx->n_buffers].size = size; - ctx->buffers[ctx->n_buffers].metal = [ctx->device newBufferWithBytes:data length:size options:MTLResourceStorageModeShared]; + ctx->buffers[ctx->n_buffers].metal = [ctx->device newBufferWithBytesNoCopy:data length:aligned_size options:MTLResourceStorageModeShared deallocator:nil]; + + if (ctx->buffers[ctx->n_buffers].metal == nil) { + fprintf(stderr, "%s: failed to allocate '%-16s' buffer, size = %8.2f MB\n", __func__, name, aligned_size / 1024.0 / 1024.0); + return false; + } else { + fprintf(stderr, "%s: allocated '%-16s' buffer, size = %8.2f MB\n", __func__, name, aligned_size / 1024.0 / 1024.0); + } ++ctx->n_buffers; - - fprintf(stderr, "%s: allocated '%-16s' buffer, size = %8.2f MB\n", __func__, name, size / 1024.0 / 1024.0); } return true;