@@ -12,31 +12,50 @@ extern "C" {
1212 // Backend buffer
1313 //
1414
15+ // buffer type
16+ typedef void * ggml_backend_buffer_type_context_t ;
17+
18+ struct ggml_backend_buffer_type_i {
19+ ggml_backend_buffer_t (* alloc_buffer ) (ggml_backend_buffer_type_t buft , size_t size );
20+ size_t (* get_alignment ) (ggml_backend_buffer_type_t buft ); // tensor alignment
21+ size_t (* get_alloc_size ) (ggml_backend_buffer_type_t buft , struct ggml_tensor * tensor ); // data size needed to allocate the tensor, including padding
22+ bool (* supports_backend )(ggml_backend_buffer_type_t buft , ggml_backend_t backend ); // check if the buffer type is usable by the backend
23+ };
24+
25+ struct ggml_backend_buffer_type {
26+ struct ggml_backend_buffer_type_i iface ;
27+ ggml_backend_buffer_type_context_t context ;
28+ };
29+
30+ // buffer
1531 typedef void * ggml_backend_buffer_context_t ;
1632
1733 struct ggml_backend_buffer_i {
18- void (* free_buffer ) (ggml_backend_buffer_t buffer );
19- void * (* get_base ) (ggml_backend_buffer_t buffer ); // get base pointer
20- size_t (* get_alloc_size )(ggml_backend_buffer_t buffer , struct ggml_tensor * tensor ); // pre-allocation callback
21- void (* init_tensor ) (ggml_backend_buffer_t buffer , struct ggml_tensor * tensor ); // post-allocation callback
22- void (* free_tensor ) (ggml_backend_buffer_t buffer , struct ggml_tensor * tensor ); // pre-free callback
34+ void (* free_buffer )(ggml_backend_buffer_t buffer );
35+ //void (*reset) (ggml_backend_buffer_t buffer); // reset any internal state due to tensor initialization, such as tensor extras
36+ void * (* get_base ) (ggml_backend_buffer_t buffer );
37+ void (* init_tensor )(ggml_backend_buffer_t buffer , struct ggml_tensor * tensor );
38+ void (* set_tensor ) (ggml_backend_buffer_t buffer , struct ggml_tensor * tensor , const void * data , size_t offset , size_t size );
39+ void (* get_tensor ) (ggml_backend_buffer_t buffer , const struct ggml_tensor * tensor , void * data , size_t offset , size_t size );
40+ // (optional) copy tensor between different buffer-type, allow for single-copy tranfers
41+ void (* cpy_tensor_from )(ggml_backend_buffer_t buffer , struct ggml_tensor * src , struct ggml_tensor * dst );
42+ void (* cpy_tensor_to ) (ggml_backend_buffer_t buffer , struct ggml_tensor * src , struct ggml_tensor * dst );
2343 };
2444
2545 struct ggml_backend_buffer {
26- struct ggml_backend_buffer_i iface ;
27-
28- ggml_backend_t backend ;
46+ struct ggml_backend_buffer_i iface ;
47+ ggml_backend_buffer_type_t buft ;
2948 ggml_backend_buffer_context_t context ;
30-
3149 size_t size ;
3250 };
3351
34- GGML_API ggml_backend_buffer_t ggml_backend_buffer_init (
35- struct ggml_backend * backend ,
52+ ggml_backend_buffer_t ggml_backend_buffer_init (
53+ ggml_backend_buffer_type_t buft ,
3654 struct ggml_backend_buffer_i iface ,
3755 ggml_backend_buffer_context_t context ,
3856 size_t size );
3957
58+
4059 //
4160 // Backend
4261 //
@@ -49,20 +68,17 @@ extern "C" {
4968 void (* free )(ggml_backend_t backend );
5069
5170 // buffer allocation
52- ggml_backend_buffer_t (* alloc_buffer )(ggml_backend_t backend , size_t size );
71+ ggml_backend_buffer_type_t (* get_default_buffer_type )(ggml_backend_t backend );
5372
54- // get buffer alignment
55- size_t (* get_alignment )(ggml_backend_t backend );
56-
57- // tensor data access
58- // these functions can be asynchronous, helper functions are provided for synchronous access that automatically call synchronize
73+ // (optional) asynchroneous tensor data access
5974 void (* set_tensor_async )(ggml_backend_t backend , struct ggml_tensor * tensor , const void * data , size_t offset , size_t size );
6075 void (* get_tensor_async )(ggml_backend_t backend , const struct ggml_tensor * tensor , void * data , size_t offset , size_t size );
61- void (* synchronize ) (ggml_backend_t backend );
6276
63- // (optional) copy tensor between different backends, allow for single-copy tranfers
64- void (* cpy_tensor_from )(ggml_backend_t backend , struct ggml_tensor * src , struct ggml_tensor * dst );
65- void (* cpy_tensor_to ) (ggml_backend_t backend , struct ggml_tensor * src , struct ggml_tensor * dst );
77+ // (optional) asynchroneous tensor copy
78+ void (* cpy_tensor_from_async )(ggml_backend_t backend , struct ggml_tensor * src , struct ggml_tensor * dst );
79+ void (* cpy_tensor_to_async ) (ggml_backend_t backend , struct ggml_tensor * src , struct ggml_tensor * dst );
80+
81+ void (* synchronize ) (ggml_backend_t backend );
6682
6783 // compute graph with a plan
6884 ggml_backend_graph_plan_t (* graph_plan_create ) (ggml_backend_t backend , struct ggml_cgraph * cgraph );
@@ -82,6 +98,15 @@ extern "C" {
8298 ggml_backend_context_t context ;
8399 };
84100
101+
102+ //
103+ // Backend registry
104+ //
105+
106+ typedef ggml_backend_t (* ggml_backend_init_fn )(const char * params , void * user_data );
107+
108+ void ggml_backend_register (const char * name , ggml_backend_init_fn init_fn , ggml_backend_buffer_type_t default_buffer_type , void * user_data );
109+
85110#ifdef __cplusplus
86111}
87112#endif
0 commit comments