ggml-meta: propagate buffer usage and call init on the new tensors (#27586)
This commit is contained in:
@@ -83,6 +83,7 @@ extern "C" {
|
|||||||
GGML_API ggml_backend_buffer_t ggml_backend_multi_buffer_alloc_buffer(ggml_backend_buffer_t * buffers, size_t n_buffers);
|
GGML_API ggml_backend_buffer_t ggml_backend_multi_buffer_alloc_buffer(ggml_backend_buffer_t * buffers, size_t n_buffers);
|
||||||
GGML_API bool ggml_backend_buffer_is_multi_buffer(ggml_backend_buffer_t buffer);
|
GGML_API bool ggml_backend_buffer_is_multi_buffer(ggml_backend_buffer_t buffer);
|
||||||
GGML_API void ggml_backend_multi_buffer_set_usage(ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage);
|
GGML_API void ggml_backend_multi_buffer_set_usage(ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage);
|
||||||
|
GGML_API void ggml_backend_meta_buffer_set_usage (ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Backend (meta)
|
// Backend (meta)
|
||||||
|
|||||||
@@ -1168,7 +1168,6 @@ static struct ggml_backend_meta_split_state ggml_backend_meta_get_split_state(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct ggml_backend_meta_split_state ggml_backend_meta_get_split_state(const struct ggml_tensor * tensor, bool assume_sync) {
|
static struct ggml_backend_meta_split_state ggml_backend_meta_get_split_state(const struct ggml_tensor * tensor, bool assume_sync) {
|
||||||
GGML_ASSERT(ggml_backend_buffer_is_meta(tensor->buffer));
|
|
||||||
ggml_backend_meta_buffer_context * buf_ctx = (ggml_backend_meta_buffer_context *) tensor->buffer->context;
|
ggml_backend_meta_buffer_context * buf_ctx = (ggml_backend_meta_buffer_context *) tensor->buffer->context;
|
||||||
return ggml_backend_meta_get_split_state(buf_ctx->get_simple_tensor_container(tensor), tensor, assume_sync);
|
return ggml_backend_meta_get_split_state(buf_ctx->get_simple_tensor_container(tensor), tensor, assume_sync);
|
||||||
}
|
}
|
||||||
@@ -1259,7 +1258,14 @@ static enum ggml_status ggml_backend_meta_buffer_init_tensor_impl(ggml_backend_m
|
|||||||
t_ij->data = (char *) ggml_backend_buffer_get_base(simple_buf)
|
t_ij->data = (char *) ggml_backend_buffer_get_base(simple_buf)
|
||||||
+ size_t(tensor->data) - size_t(ggml_backend_buffer_get_base(tensor->buffer));
|
+ size_t(tensor->data) - size_t(ggml_backend_buffer_get_base(tensor->buffer));
|
||||||
}
|
}
|
||||||
t_ij->extra = tensor->extra;
|
|
||||||
|
if (simple_buf) {
|
||||||
|
// the backend that owns the buffer will set .extra
|
||||||
|
ggml_backend_buffer_init_tensor(simple_buf, t_ij);
|
||||||
|
} else {
|
||||||
|
t_ij->extra = tensor->extra;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < GGML_MAX_SRC; i++) {
|
for (int i = 0; i < GGML_MAX_SRC; i++) {
|
||||||
t_ij->src[i] = tensor->src[i];
|
t_ij->src[i] = tensor->src[i];
|
||||||
if (tensor->src[i] == tensor) {
|
if (tensor->src[i] == tensor) {
|
||||||
@@ -1668,6 +1674,16 @@ bool ggml_backend_buffer_is_meta(ggml_backend_buffer_t buf) {
|
|||||||
return buf != nullptr && buf->iface.free_buffer == ggml_backend_meta_buffer_iface.free_buffer;
|
return buf != nullptr && buf->iface.free_buffer == ggml_backend_meta_buffer_iface.free_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ggml_backend_meta_buffer_set_usage(ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage) {
|
||||||
|
GGML_ASSERT(ggml_backend_buffer_is_meta(buffer));
|
||||||
|
ggml_backend_meta_buffer_context * buf_ctx = (ggml_backend_meta_buffer_context *) buffer->context;
|
||||||
|
for (size_t i = 0; i < buf_ctx->bufs.size(); i++) {
|
||||||
|
if (buf_ctx->bufs[i]) {
|
||||||
|
ggml_backend_buffer_set_usage(buf_ctx->bufs[i].get(), usage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static ggml_backend_buffer_t ggml_backend_meta_buffer_type_alloc_buffer(ggml_backend_buffer_type_t buft, size_t size) {
|
static ggml_backend_buffer_t ggml_backend_meta_buffer_type_alloc_buffer(ggml_backend_buffer_type_t buft, size_t size) {
|
||||||
const size_t n_simple_bufts = ggml_backend_meta_buft_n_bufts(buft);
|
const size_t n_simple_bufts = ggml_backend_meta_buft_n_bufts(buft);
|
||||||
|
|
||||||
|
|||||||
@@ -182,6 +182,8 @@ void ggml_backend_buffer_set_usage(ggml_backend_buffer_t buffer, enum ggml_backe
|
|||||||
// FIXME: add a generic callback to the buffer interface
|
// FIXME: add a generic callback to the buffer interface
|
||||||
if (ggml_backend_buffer_is_multi_buffer(buffer)) {
|
if (ggml_backend_buffer_is_multi_buffer(buffer)) {
|
||||||
ggml_backend_multi_buffer_set_usage(buffer, usage);
|
ggml_backend_multi_buffer_set_usage(buffer, usage);
|
||||||
|
} else if (ggml_backend_buffer_is_meta(buffer)) {
|
||||||
|
ggml_backend_meta_buffer_set_usage(buffer, usage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user