5
5
#ifdef __cplusplus
6
6
extern "C" {
7
7
#endif
8
+ struct ggml_backend ;
8
9
struct ggml_backend_buffer ;
9
10
10
11
// type-erased backend-specific types / wrappers
11
12
typedef void * ggml_backend_plan_t ;
12
13
typedef void * ggml_backend_context_t ;
13
14
typedef void * ggml_backend_buffer_context_t ;
14
15
16
+ //
17
+ // backend buffer
18
+ //
19
+
15
20
struct ggml_backend_buffer_i {
16
21
void (* free_buffer ) (struct ggml_backend_buffer * buffer );
17
22
void * (* get_base ) (struct ggml_backend_buffer * buffer ); // get base pointer
@@ -20,16 +25,6 @@ extern "C" {
20
25
void (* free_tensor ) (struct ggml_backend_buffer * buffer , struct ggml_tensor * tensor ); // pre-free callback
21
26
};
22
27
23
- struct ggml_backend_buffer {
24
- struct ggml_backend * backend ;
25
-
26
- struct ggml_backend_buffer_i interface ;
27
-
28
- ggml_backend_buffer_context_t context ;
29
-
30
- size_t size ; // GG: can we absorb the size inside the context?
31
- };
32
-
33
28
// backend buffer functions
34
29
GGML_API struct ggml_backend_buffer * ggml_backend_buffer_init (
35
30
struct ggml_backend * backend ,
@@ -40,11 +35,14 @@ extern "C" {
40
35
GGML_API void ggml_backend_buffer_free (struct ggml_backend_buffer * buffer );
41
36
GGML_API size_t ggml_backend_buffer_get_alignment (struct ggml_backend_buffer * buffer );
42
37
GGML_API void * ggml_backend_buffer_get_base (struct ggml_backend_buffer * buffer );
38
+ GGML_API size_t ggml_backend_buffer_get_size (struct ggml_backend_buffer * buffer );
43
39
GGML_API size_t ggml_backend_buffer_get_alloc_size (struct ggml_backend_buffer * buffer , struct ggml_tensor * tensor );
44
40
GGML_API void ggml_backend_buffer_init_tensor (struct ggml_backend_buffer * buffer , struct ggml_tensor * tensor );
45
41
GGML_API void ggml_backend_buffer_free_tensor (struct ggml_backend_buffer * buffer , struct ggml_tensor * tensor );
46
42
43
+ //
47
44
// backend
45
+ //
48
46
49
47
struct ggml_backend_i {
50
48
const char * (* get_name )(struct ggml_backend * backend );
@@ -79,41 +77,37 @@ extern "C" {
79
77
bool (* supports_op )(struct ggml_backend * backend , const struct ggml_tensor * op );
80
78
};
81
79
82
- struct ggml_backend {
83
- struct ggml_backend_i interface ;
84
-
85
- ggml_backend_context_t context ;
86
- };
87
-
88
80
// backend helper functions
89
- // TODO: we should move these implementations in the source file
90
- static inline struct ggml_backend * ggml_get_backend (const struct ggml_tensor * tensor ) { return tensor -> buffer -> backend ; }
81
+ GGML_API struct ggml_backend * ggml_get_backend (const struct ggml_tensor * tensor );
91
82
92
- static inline const char * ggml_backend_name (struct ggml_backend * backend ) { return backend -> interface . get_name ( backend ); }
93
- static inline void ggml_backend_free (struct ggml_backend * backend ) { backend -> interface . free ( backend ); }
83
+ GGML_API const char * ggml_backend_name (struct ggml_backend * backend );
84
+ GGML_API void ggml_backend_free (struct ggml_backend * backend );
94
85
95
- static inline struct ggml_backend_buffer * ggml_backend_alloc_buffer (struct ggml_backend * backend , size_t size ) { return backend -> interface . alloc_buffer ( backend , size ); }
86
+ GGML_API struct ggml_backend_buffer * ggml_backend_alloc_buffer (struct ggml_backend * backend , size_t size );
96
87
97
- static inline size_t ggml_backend_get_alignment (struct ggml_backend * backend ) { return backend -> interface . get_alignment ( backend ); }
88
+ GGML_API size_t ggml_backend_get_alignment (struct ggml_backend * backend );
98
89
99
- static inline void ggml_backend_tensor_set_async ( struct ggml_tensor * tensor , const void * data , size_t offset , size_t size ) { ggml_get_backend ( tensor ) -> interface . set_tensor_async ( ggml_get_backend ( tensor ), tensor , data , offset , size ); }
100
- static inline void ggml_backend_tensor_get_async (const struct ggml_tensor * tensor , void * data , size_t offset , size_t size ) { ggml_get_backend ( tensor ) -> interface . get_tensor_async ( ggml_get_backend ( tensor ), tensor , data , offset , size ); }
90
+ GGML_API void ggml_backend_tensor_set_async ( struct ggml_tensor * tensor , const void * data , size_t offset , size_t size );
91
+ GGML_API void ggml_backend_tensor_get_async (const struct ggml_tensor * tensor , void * data , size_t offset , size_t size );
101
92
102
- static inline void ggml_backend_tensor_set ( struct ggml_tensor * tensor , const void * data , size_t offset , size_t size ) { ggml_get_backend ( tensor ) -> interface . set_tensor_async ( ggml_get_backend ( tensor ), tensor , data , offset , size ); ggml_get_backend ( tensor ) -> interface . synchronize ( ggml_get_backend ( tensor )); }
103
- static inline void ggml_backend_tensor_get (const struct ggml_tensor * tensor , void * data , size_t offset , size_t size ) { ggml_get_backend ( tensor ) -> interface . get_tensor_async ( ggml_get_backend ( tensor ), tensor , data , offset , size ); ggml_get_backend ( tensor ) -> interface . synchronize ( ggml_get_backend ( tensor )); }
93
+ GGML_API void ggml_backend_tensor_set ( struct ggml_tensor * tensor , const void * data , size_t offset , size_t size );
94
+ GGML_API void ggml_backend_tensor_get (const struct ggml_tensor * tensor , void * data , size_t offset , size_t size );
104
95
105
- static inline void ggml_backend_synchronize (struct ggml_backend * backend ) { backend -> interface . synchronize ( backend ); }
96
+ GGML_API void ggml_backend_synchronize (struct ggml_backend * backend );
106
97
107
- static inline ggml_backend_plan_t ggml_backend_graph_plan_create (struct ggml_backend * backend , struct ggml_cgraph * cgraph ) { return backend -> interface . graph_plan_create ( backend , cgraph ); }
108
- static inline void ggml_backend_graph_plan_free (struct ggml_backend * backend , ggml_backend_plan_t plan ) { backend -> interface . graph_plan_free ( backend , plan ); }
109
- static inline void ggml_backend_graph_plan_compute (struct ggml_backend * backend , ggml_backend_plan_t plan ) { backend -> interface . graph_plan_compute ( backend , plan ); }
110
- static inline void ggml_backend_graph_compute (struct ggml_backend * backend , struct ggml_cgraph * cgraph ) { backend -> interface . graph_compute ( backend , cgraph ); }
111
- static inline bool ggml_backend_supports_op (struct ggml_backend * backend , const struct ggml_tensor * op ) { return backend -> interface . supports_op ( backend , op ); }
98
+ GGML_API ggml_backend_plan_t ggml_backend_graph_plan_create (struct ggml_backend * backend , struct ggml_cgraph * cgraph );
99
+ GGML_API void ggml_backend_graph_plan_free (struct ggml_backend * backend , ggml_backend_plan_t plan );
100
+ GGML_API void ggml_backend_graph_plan_compute (struct ggml_backend * backend , ggml_backend_plan_t plan );
101
+ GGML_API void ggml_backend_graph_compute (struct ggml_backend * backend , struct ggml_cgraph * cgraph );
102
+ GGML_API bool ggml_backend_supports_op (struct ggml_backend * backend , const struct ggml_tensor * op );
112
103
113
104
// tensor copy between different backends
114
105
GGML_API void ggml_backend_tensor_copy (struct ggml_tensor * src , struct ggml_tensor * dst );
115
106
107
+ //
116
108
// CPU backend
109
+ //
110
+
117
111
GGML_API struct ggml_backend * ggml_backend_cpu_init (void );
118
112
119
113
GGML_API void ggml_backend_cpu_set_n_threads (struct ggml_backend * backend_cpu , int n_threads );
0 commit comments