@@ -12,31 +12,50 @@ extern "C" {
12
12
// Backend buffer
13
13
//
14
14
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
15
31
typedef void * ggml_backend_buffer_context_t ;
16
32
17
33
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 );
23
43
};
24
44
25
45
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 ;
29
48
ggml_backend_buffer_context_t context ;
30
-
31
49
size_t size ;
32
50
};
33
51
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 ,
36
54
struct ggml_backend_buffer_i iface ,
37
55
ggml_backend_buffer_context_t context ,
38
56
size_t size );
39
57
58
+
40
59
//
41
60
// Backend
42
61
//
@@ -49,20 +68,17 @@ extern "C" {
49
68
void (* free )(ggml_backend_t backend );
50
69
51
70
// 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 );
53
72
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
59
74
void (* set_tensor_async )(ggml_backend_t backend , struct ggml_tensor * tensor , const void * data , size_t offset , size_t size );
60
75
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 );
62
76
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 );
66
82
67
83
// compute graph with a plan
68
84
ggml_backend_graph_plan_t (* graph_plan_create ) (ggml_backend_t backend , struct ggml_cgraph * cgraph );
@@ -82,6 +98,15 @@ extern "C" {
82
98
ggml_backend_context_t context ;
83
99
};
84
100
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
+
85
110
#ifdef __cplusplus
86
111
}
87
112
#endif
0 commit comments