Skip to content

Commit 26458af

Browse files
authored
metal : use vm_allocate instead of posix_memalign on macOS (#7078)
* fix: use `malloc` instead of `posix_memalign` in `ggml-metal.m` to make it not crash Electron proccesses * fix: typo * fix: use `vm_allocate` instead of `posix_memalign` * fix: don't call `newBufferWithBytesNoCopy` with `NULL` when `ggml_metal_host_malloc` returns `NULL` * fix: use `vm_allocate` only on macOS
1 parent 83330d8 commit 26458af

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

ggml-metal.m

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,11 +265,20 @@ static void ggml_metal_log(enum ggml_log_level level, const char * format, ...){
265265

266266
static void * ggml_metal_host_malloc(size_t n) {
267267
void * data = NULL;
268+
269+
#if TARGET_OS_OSX
270+
kern_return_t err = vm_allocate((vm_map_t) mach_task_self(), (void *) &data, n, VM_FLAGS_ANYWHERE);
271+
if (err != KERN_SUCCESS) {
272+
GGML_METAL_LOG_ERROR("%s: error: vm_allocate failed\n", __func__);
273+
return NULL;
274+
}
275+
#else
268276
const int result = posix_memalign((void **) &data, sysconf(_SC_PAGESIZE), n);
269277
if (result != 0) {
270278
GGML_METAL_LOG_ERROR("%s: error: posix_memalign failed\n", __func__);
271279
return NULL;
272280
}
281+
#endif
273282

274283
return data;
275284
}
@@ -2840,7 +2849,11 @@ GGML_CALL static void ggml_backend_metal_buffer_free_buffer(ggml_backend_buffer_
28402849
ggml_backend_metal_free_device();
28412850

28422851
if (ctx->owned) {
2852+
#if TARGET_OS_OSX
2853+
vm_deallocate((vm_map_t)mach_task_self(), (vm_address_t)ctx->all_data, ctx->all_size);
2854+
#else
28432855
free(ctx->all_data);
2856+
#endif
28442857
}
28452858

28462859
free(ctx);
@@ -2944,14 +2957,16 @@ GGML_CALL static ggml_backend_buffer_t ggml_backend_metal_buffer_type_alloc_buff
29442957
ctx->owned = true;
29452958
ctx->n_buffers = 1;
29462959

2947-
ctx->buffers[0].data = ctx->all_data;
2948-
ctx->buffers[0].size = size;
2949-
ctx->buffers[0].metal = [device newBufferWithBytesNoCopy:ctx->all_data
2950-
length:size_aligned
2951-
options:MTLResourceStorageModeShared
2952-
deallocator:nil];
2960+
if (ctx->all_data != NULL) {
2961+
ctx->buffers[0].data = ctx->all_data;
2962+
ctx->buffers[0].size = size;
2963+
ctx->buffers[0].metal = [device newBufferWithBytesNoCopy:ctx->all_data
2964+
length:size_aligned
2965+
options:MTLResourceStorageModeShared
2966+
deallocator:nil];
2967+
}
29532968

2954-
if (ctx->buffers[0].metal == nil) {
2969+
if (ctx->all_data == NULL || ctx->buffers[0].metal == nil) {
29552970
GGML_METAL_LOG_ERROR("%s: error: failed to allocate buffer, size = %8.2f MiB\n", __func__, size_aligned / 1024.0 / 1024.0);
29562971
free(ctx);
29572972
ggml_backend_metal_free_device();

0 commit comments

Comments
 (0)