Skip to content

Commit 0c171fb

Browse files
committed
checkpoint
1 parent 920b5f4 commit 0c171fb

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

ggml/src/ggml-metal/ggml-metal.m

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5967,12 +5967,17 @@ static enum ggml_status ggml_backend_metal_split_buffer_init_tensor(ggml_backend
59675967
return GGML_STATUS_ALLOC_FAILED;
59685968
}
59695969

5970-
// For a dynamic array, we need to manually manage the array
5971-
ctx->tensor_extras = realloc(ctx->tensor_extras, (ctx->tensor_extras_size + 1) * sizeof(struct ggml_tensor_extra_metal *));
5972-
if (ctx->tensor_extras == NULL) {
5973-
GGML_LOG_ERROR("%s: failed to reallocate tensor_extras array\n", __func__);
5974-
free(extra);
5975-
return GGML_STATUS_ALLOC_FAILED;
5970+
// For a dynamic array, we need to manually manage the array with proper capacity tracking
5971+
if (ctx->tensor_extras_size >= ctx->tensor_extras_capacity) {
5972+
size_t new_capacity = ctx->tensor_extras_capacity == 0 ? 16 : ctx->tensor_extras_capacity * 2;
5973+
struct ggml_tensor_extra_metal ** new_tensor_extras = realloc(ctx->tensor_extras, new_capacity * sizeof(struct ggml_tensor_extra_metal *));
5974+
if (new_tensor_extras == NULL) {
5975+
GGML_LOG_ERROR("%s: failed to reallocate tensor_extras array\n", __func__);
5976+
free(extra);
5977+
return GGML_STATUS_ALLOC_FAILED;
5978+
}
5979+
ctx->tensor_extras = new_tensor_extras;
5980+
ctx->tensor_extras_capacity = new_capacity;
59765981
}
59775982
ctx->tensor_extras[ctx->tensor_extras_size] = extra;
59785983
ctx->tensor_extras_size++;
@@ -6023,15 +6028,17 @@ static enum ggml_status ggml_backend_metal_split_buffer_init_tensor(ggml_backend
60236028
GGML_LOG_DEBUG("%s: tensor '%s' initializing buffer with zeros\n", __func__, tensor->name);
60246029
void * bufferContents = [extra->data_device[id] contents];
60256030
if (bufferContents == NULL) {
6026-
GGML_LOG_ERROR("%s: Metal buffer contents is NULL for tensor '%s'\n", __func__, tensor->name);
6027-
[extra->data_device[id] release];
6028-
free(extra);
6029-
return GGML_STATUS_ALLOC_FAILED;
6031+
// If we can't access the buffer contents directly, we'll skip initialization
6032+
// Buffers with StorageModePrivate are typically zero-initialized by Metal
6033+
// or will be initialized when first used
6034+
GGML_LOG_DEBUG("%s: Metal buffer contents is NULL for tensor '%s', skipping zero initialization\n", __func__, tensor->name);
6035+
} else {
6036+
// We can access the buffer contents directly, so initialize with zeros
6037+
memset(bufferContents, 0, size);
60306038
}
6031-
memset(bufferContents, 0, size);
60326039

60336040
tensor->extra = extra;
6034-
GGML_LOG_DEBUG("%s: tensor '%s' initialization completed\n", __func__, tensor->name);
6041+
GGML_LOG_DEBUG("%s: tensor '%s' initialization completed successfully\n", __func__, tensor->name);
60356042
return GGML_STATUS_SUCCESS;
60366043
}
60376044

0 commit comments

Comments
 (0)