}
}
-static void init_view(struct ggml_allocr * alloc, struct ggml_tensor * view) {
+static void init_view(struct ggml_allocr * alloc, struct ggml_tensor * view, bool update_backend) {
assert(view->view_src != NULL && view->view_src->data != NULL);
- view->backend = view->view_src->backend;
+
+ if (update_backend) {
+ view->backend = view->view_src->backend;
+ }
+
view->buffer = view->view_src->buffer;
view->data = (char *)view->view_src->data + view->view_offs;
struct hash_node * ht = alloc->hash_table;
if (node->data == NULL) {
if (ggml_is_view(node)) {
- init_view(alloc, node);
+ init_view(alloc, node, true);
} else {
// see if we can reuse a parent's buffer (inplace)
if (ggml_op_can_inplace(node->op)) {
AT_PRINTF("reusing view parent %s (%s) for %s\n", parent->name, view_src->name, node->name);
node->view_src = view_src;
view_src_hn->n_views += 1;
- init_view(alloc, node);
+ init_view(alloc, node, false);
return;
}
- }
- else {
+ } else {
AT_PRINTF("reusing parent %s for %s\n", parent->name, node->name);
node->view_src = parent;
p_hn->n_views += 1;
- init_view(alloc, node);
+ init_view(alloc, node, false);
return;
}
}
hash_get(ht, view_src)->n_views += 1;
if (node->buffer == NULL && node->data != NULL) {
// view of a pre-allocated tensor, didn't call init_view() yet
- init_view(alloc, node);
+ init_view(alloc, node, true);
}
}
}
hash_get(ht, parent)->n_children += 1;
if (ggml_is_view(parent) && parent->buffer == NULL && parent->data != NULL) {
- init_view(alloc, parent);
+ init_view(alloc, parent, true);
}
}
}