summaryrefslogtreecommitdiff
path: root/ggml-alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'ggml-alloc.c')
-rw-r--r--ggml-alloc.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/ggml-alloc.c b/ggml-alloc.c
index 4121f3db..8de28cf9 100644
--- a/ggml-alloc.c
+++ b/ggml-alloc.c
@@ -67,6 +67,8 @@ struct ggml_allocr {
struct hash_node hash_table[GGML_GRAPH_HASHTABLE_SIZE];
size_t max_size;
bool measure;
+ int parse_seq[GGML_MAX_NODES];
+ bool has_parse_seq;
#ifdef GGML_ALLOCATOR_DEBUG
struct ggml_tensor * allocated_tensors[1024];
@@ -229,6 +231,17 @@ static void ggml_allocator_free_tensor(struct ggml_allocr * alloc, struct ggml_t
alloc->n_free_blocks++;
}
+void ggml_allocr_set_parse_seq(struct ggml_allocr * alloc, int * list, int n) {
+ int pos = 0;
+ for (int i = 0; i < n; i++) {
+ if (list[i] != -1) {
+ alloc->parse_seq[pos] = list[i];
+ pos++;
+ }
+ }
+ alloc->has_parse_seq = true;
+}
+
void ggml_allocr_reset(struct ggml_allocr * alloc) {
alloc->n_free_blocks = 1;
size_t align_offset = aligned_offset(alloc->data, 0, alloc->alignment);
@@ -248,6 +261,8 @@ struct ggml_allocr * ggml_allocr_new(void * data, size_t size, size_t alignment)
/*.hash_table = */ {{0}},
/*.max_size = */ 0,
/*.measure = */ false,
+ /*.parse_seq = */ {0},
+ /*.has_parse_seq = */ false,
#ifdef GGML_ALLOCATOR_DEBUG
/*.allocated_tensors = */ = {0},
#endif
@@ -275,6 +290,8 @@ struct ggml_allocr * ggml_allocr_new_measure(size_t alignment) {
/*.hash_table = */ {{0}},
/*.max_size = */ 0,
/*.measure = */ true,
+ /*.parse_seq = */ {0},
+ /*.has_parse_seq = */ false,
#ifdef GGML_ALLOCATOR_DEBUG
/*.allocated_tensors = */ = {0},
#endif
@@ -473,7 +490,13 @@ static size_t ggml_allocator_alloc_graph_tensors_n(
allocate_node(alloc, input);
}
}
- for (int i = 0; i < gf->n_nodes; i++) {
+ for (int ind = 0; ind < gf->n_nodes; ind++) {
+ int i;
+ if (alloc->has_parse_seq) {
+ i = alloc->parse_seq[ind];
+ } else {
+ i = ind;
+ }
struct ggml_tensor * node = gf->nodes[i];
// allocate parents (leafs)