aboutsummaryrefslogtreecommitdiff
path: root/ggml-metal.m
diff options
context:
space:
mode:
authorkiltyj <kiltyj@gmail.com>2023-06-05 13:24:04 -0700
committerGitHub <noreply@github.com>2023-06-05 23:24:04 +0300
commit9d0693bce38013364b1042568d9083353bfff48f (patch)
tree8311cb168defca62e9b2689571c4b641ea7654b9 /ggml-metal.m
parentefe05076323f5c6bafece109e21cce046f5e4b07 (diff)
metal : use shared buffers between CPU and GPU (#1696)
* Use MTLDevice.newBufferWithBytesNoCopy to share buffers between CPU and GPU * Page-align buffers used by Metal * Remove trailing whitespace * Only import unistd.h for Metal builds * metal : remove unnecessary copies --------- Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
Diffstat (limited to 'ggml-metal.m')
-rw-r--r--ggml-metal.m17
1 files changed, 14 insertions, 3 deletions
diff --git a/ggml-metal.m b/ggml-metal.m
index 3cb423a..82c6596 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];
- ++ctx->n_buffers;
+ 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);
+ }
- fprintf(stderr, "%s: allocated '%-16s' buffer, size = %8.2f MB\n", __func__, name, size / 1024.0 / 1024.0);
+ ++ctx->n_buffers;
}
return true;