Skip to content

Commit

Permalink
ggml : force no_alloc == false when creating opt tensors (close ggerg…
Browse files Browse the repository at this point in the history
…anov#1699)

This is needed to make operators like ggml_view() be able to store their
parameters in the ggml context's memory and not get discarded when
no_alloc is true
  • Loading branch information
ggerganov committed Jun 10, 2023
1 parent e9b66ee commit 17c10ac
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions ggml.c
Original file line number Diff line number Diff line change
Expand Up @@ -3721,6 +3721,7 @@ struct ggml_context {
void * mem_buffer;
bool mem_buffer_owned;
bool no_alloc;
bool no_alloc_save; // this is used to save the no_alloc state when using scratch buffers

int n_objects;

Expand Down Expand Up @@ -4055,6 +4056,7 @@ struct ggml_context * ggml_init(struct ggml_init_params params) {
/*.mem_buffer =*/ params.mem_buffer ? params.mem_buffer : GGML_ALIGNED_MALLOC(mem_size),
/*.mem_buffer_owned =*/ params.mem_buffer ? false : true,
/*.no_alloc =*/ params.no_alloc,
/*.no_alloc_save =*/ params.no_alloc,
/*.n_objects =*/ 0,
/*.objects_begin =*/ NULL,
/*.objects_end =*/ NULL,
Expand Down Expand Up @@ -4132,11 +4134,18 @@ size_t ggml_get_mem_size(struct ggml_context * ctx) {
// operators when using scratch buffers
// TODO: implement a better way
void ggml_scratch_save(struct ggml_context * ctx) {
// this is needed to allow opt tensors to store their data
// TODO: again, need to find a better way
ctx->no_alloc_save = ctx->no_alloc;
ctx->no_alloc = false;

ctx->scratch_save = ctx->scratch;
ctx->scratch.data = NULL;
}

void ggml_scratch_load(struct ggml_context * ctx) {
ctx->no_alloc = ctx->no_alloc_save;

ctx->scratch = ctx->scratch_save;
}

Expand Down

0 comments on commit 17c10ac

Please sign in to comment.