Skip to content

Commit e1351e9

Browse files
committed
ggml-backend : move ggml_backend and ggml_backend_buffer in the source file
1 parent 89de150 commit e1351e9

File tree

3 files changed

+111
-33
lines changed

3 files changed

+111
-33
lines changed

include/ggml/ggml-backend.h

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@
55
#ifdef __cplusplus
66
extern "C" {
77
#endif
8+
struct ggml_backend;
89
struct ggml_backend_buffer;
910

1011
// type-erased backend-specific types / wrappers
1112
typedef void * ggml_backend_plan_t;
1213
typedef void * ggml_backend_context_t;
1314
typedef void * ggml_backend_buffer_context_t;
1415

16+
//
17+
// backend buffer
18+
//
19+
1520
struct ggml_backend_buffer_i {
1621
void (*free_buffer) (struct ggml_backend_buffer * buffer);
1722
void * (*get_base) (struct ggml_backend_buffer * buffer); // get base pointer
@@ -20,16 +25,6 @@ extern "C" {
2025
void (*free_tensor) (struct ggml_backend_buffer * buffer, struct ggml_tensor * tensor); // pre-free callback
2126
};
2227

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-
3328
// backend buffer functions
3429
GGML_API struct ggml_backend_buffer * ggml_backend_buffer_init(
3530
struct ggml_backend * backend,
@@ -40,11 +35,14 @@ extern "C" {
4035
GGML_API void ggml_backend_buffer_free (struct ggml_backend_buffer * buffer);
4136
GGML_API size_t ggml_backend_buffer_get_alignment (struct ggml_backend_buffer * buffer);
4237
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);
4339
GGML_API size_t ggml_backend_buffer_get_alloc_size(struct ggml_backend_buffer * buffer, struct ggml_tensor * tensor);
4440
GGML_API void ggml_backend_buffer_init_tensor (struct ggml_backend_buffer * buffer, struct ggml_tensor * tensor);
4541
GGML_API void ggml_backend_buffer_free_tensor (struct ggml_backend_buffer * buffer, struct ggml_tensor * tensor);
4642

43+
//
4744
// backend
45+
//
4846

4947
struct ggml_backend_i {
5048
const char * (*get_name)(struct ggml_backend * backend);
@@ -79,41 +77,37 @@ extern "C" {
7977
bool (*supports_op)(struct ggml_backend * backend, const struct ggml_tensor * op);
8078
};
8179

82-
struct ggml_backend {
83-
struct ggml_backend_i interface;
84-
85-
ggml_backend_context_t context;
86-
};
87-
8880
// 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);
9182

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);
9485

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);
9687

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);
9889

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);
10192

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);
10495

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);
10697

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);
112103

113104
// tensor copy between different backends
114105
GGML_API void ggml_backend_tensor_copy(struct ggml_tensor * src, struct ggml_tensor * dst);
115106

107+
//
116108
// CPU backend
109+
//
110+
117111
GGML_API struct ggml_backend * ggml_backend_cpu_init(void);
118112

119113
GGML_API void ggml_backend_cpu_set_n_threads(struct ggml_backend * backend_cpu, int n_threads);

src/ggml-alloc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ void ggml_allocr_reset(struct ggml_allocr * alloc) {
265265
alloc->n_free_blocks = 1;
266266
size_t align_offset = aligned_offset(alloc->data, 0, alloc->alignment);
267267
alloc->free_blocks[0].addr = (char *)alloc->data + align_offset;
268-
alloc->free_blocks[0].size = alloc->buffer->size - align_offset;
268+
alloc->free_blocks[0].size = ggml_backend_buffer_get_size(alloc->buffer) - align_offset;
269269
}
270270

271271
struct ggml_allocr * ggml_allocr_new(void * data, size_t size, size_t alignment) {

src/ggml-backend.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,22 @@
1111

1212
#define MAX(a, b) ((a) > (b) ? (a) : (b))
1313

14+
struct ggml_backend {
15+
struct ggml_backend_i interface;
16+
17+
ggml_backend_context_t context;
18+
};
19+
20+
struct ggml_backend_buffer {
21+
struct ggml_backend * backend;
22+
23+
struct ggml_backend_buffer_i interface;
24+
25+
ggml_backend_buffer_context_t context;
26+
27+
size_t size; // GG: can we absorb the size inside the context?
28+
};
29+
1430
// backend buffer
1531

1632
struct ggml_backend_buffer * ggml_backend_buffer_init(
@@ -46,6 +62,10 @@ void * ggml_backend_buffer_get_base(struct ggml_backend_buffer * buffer) {
4662
return buffer->interface.get_base(buffer);
4763
}
4864

65+
size_t ggml_backend_buffer_get_size(struct ggml_backend_buffer * buffer) {
66+
return buffer->size;
67+
}
68+
4969
size_t ggml_backend_buffer_get_alloc_size(struct ggml_backend_buffer * buffer, struct ggml_tensor * tensor) {
5070
if (buffer->interface.get_alloc_size) {
5171
return buffer->interface.get_alloc_size(buffer, tensor);
@@ -65,6 +85,70 @@ void ggml_backend_buffer_free_tensor(struct ggml_backend_buffer * buffer, struct
6585
}
6686
}
6787

88+
// backend
89+
90+
struct ggml_backend * ggml_get_backend(const struct ggml_tensor * tensor) {
91+
return tensor->buffer->backend;
92+
}
93+
94+
const char * ggml_backend_name(struct ggml_backend * backend) {
95+
return backend->interface.get_name(backend);
96+
}
97+
98+
void ggml_backend_free(struct ggml_backend * backend) {
99+
backend->interface.free(backend);
100+
}
101+
102+
struct ggml_backend_buffer * ggml_backend_alloc_buffer(struct ggml_backend * backend, size_t size) {
103+
return backend->interface.alloc_buffer(backend, size);
104+
}
105+
106+
size_t ggml_backend_get_alignment(struct ggml_backend * backend) {
107+
return backend->interface.get_alignment(backend);
108+
}
109+
110+
void ggml_backend_tensor_set_async(struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) {
111+
ggml_get_backend(tensor)->interface.set_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size);
112+
}
113+
114+
void ggml_backend_tensor_get_async(const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) {
115+
ggml_get_backend(tensor)->interface.get_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size);
116+
}
117+
118+
void ggml_backend_tensor_set(struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) {
119+
ggml_get_backend(tensor)->interface.set_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size);
120+
ggml_get_backend(tensor)->interface.synchronize(ggml_get_backend(tensor));
121+
}
122+
123+
void ggml_backend_tensor_get(const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) {
124+
ggml_get_backend(tensor)->interface.get_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size);
125+
ggml_get_backend(tensor)->interface.synchronize(ggml_get_backend(tensor));
126+
}
127+
128+
void ggml_backend_synchronize(struct ggml_backend * backend) {
129+
backend->interface.synchronize(backend);
130+
}
131+
132+
ggml_backend_plan_t ggml_backend_graph_plan_create(struct ggml_backend * backend, struct ggml_cgraph * cgraph) {
133+
return backend->interface.graph_plan_create(backend, cgraph);
134+
}
135+
136+
void ggml_backend_graph_plan_free(struct ggml_backend * backend, ggml_backend_plan_t plan) {
137+
backend->interface.graph_plan_free(backend, plan);
138+
}
139+
140+
void ggml_backend_graph_plan_compute(struct ggml_backend * backend, ggml_backend_plan_t plan) {
141+
backend->interface.graph_plan_compute(backend, plan);
142+
}
143+
144+
void ggml_backend_graph_compute(struct ggml_backend * backend, struct ggml_cgraph * cgraph) {
145+
backend->interface.graph_compute(backend, cgraph);
146+
}
147+
148+
bool ggml_backend_supports_op(struct ggml_backend * backend, const struct ggml_tensor * op) {
149+
return backend->interface.supports_op(backend, op);
150+
}
151+
68152
// backend copy
69153

70154
static bool ggml_are_same_layout(const struct ggml_tensor * a, const struct ggml_tensor * b) {

0 commit comments

Comments
 (0)