@@ -34,6 +34,11 @@ const char * ggml_backend_buft_name(ggml_backend_buffer_type_t buft) {
34
34
}
35
35
36
36
ggml_backend_buffer_t ggml_backend_buft_alloc_buffer (ggml_backend_buffer_type_t buft, size_t size) {
37
+ if (size == 0 ) {
38
+ // return a dummy buffer for zero-sized allocations
39
+ return ggml_backend_buffer_init (buft, {}, NULL , 0 );
40
+ }
41
+
37
42
return buft->iface .alloc_buffer (buft, size);
38
43
}
39
44
@@ -89,7 +94,7 @@ ggml_backend_buffer_t ggml_backend_buffer_init(
89
94
}
90
95
91
96
const char * ggml_backend_buffer_name (ggml_backend_buffer_t buffer) {
92
- return buffer-> iface . get_name ( buffer);
97
+ return ggml_backend_buft_name ( ggml_backend_buffer_get_type ( buffer) );
93
98
}
94
99
95
100
void ggml_backend_buffer_free (ggml_backend_buffer_t buffer) {
@@ -108,6 +113,11 @@ size_t ggml_backend_buffer_get_size(ggml_backend_buffer_t buffer) {
108
113
}
109
114
110
115
void * ggml_backend_buffer_get_base (ggml_backend_buffer_t buffer) {
116
+ // get_base is optional if the buffer is zero-sized
117
+ if (buffer->iface .get_base == NULL && buffer->size == 0 ) {
118
+ return NULL ;
119
+ }
120
+
111
121
void * base = buffer->iface .get_base (buffer);
112
122
113
123
GGML_ASSERT (base != NULL && " backend buffer base cannot be NULL" );
@@ -238,43 +248,42 @@ void ggml_backend_tensor_get_async(ggml_backend_t backend, const struct ggml_ten
238
248
void ggml_backend_tensor_set (struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) {
239
249
ggml_backend_buffer_t buf = tensor->view_src ? tensor->view_src ->buffer : tensor->buffer ;
240
250
251
+ if (size == 0 ) {
252
+ return ;
253
+ }
254
+
241
255
GGML_ASSERT (buf != NULL && " tensor buffer not set" );
242
256
GGML_ASSERT (tensor->data != NULL && " tensor not allocated" );
243
257
GGML_ASSERT (offset + size <= ggml_nbytes (tensor) && " tensor write out of bounds" );
244
258
245
- if (!size) {
246
- return ;
247
- }
248
-
249
259
buf->iface .set_tensor (buf, tensor, data, offset, size);
250
260
}
251
261
252
262
void ggml_backend_tensor_get (const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) {
253
263
ggml_backend_buffer_t buf = tensor->view_src ? tensor->view_src ->buffer : tensor->buffer ;
254
264
265
+ if (size == 0 ) {
266
+ return ;
267
+ }
268
+
255
269
GGML_ASSERT (buf != NULL && " tensor buffer not set" );
256
270
GGML_ASSERT (tensor->data != NULL && " tensor not allocated" );
257
271
GGML_ASSERT (offset + size <= ggml_nbytes (tensor) && " tensor read out of bounds" );
258
272
259
- if (!size) {
260
- return ;
261
- }
262
-
263
273
buf->iface .get_tensor (buf, tensor, data, offset, size);
264
274
}
265
275
266
276
GGML_API void ggml_backend_tensor_memset (struct ggml_tensor * tensor, uint8_t value, size_t offset, size_t size) {
267
277
ggml_backend_buffer_t buf = tensor->view_src ? tensor->view_src ->buffer : tensor->buffer ;
268
278
269
- GGML_ASSERT (buf != NULL && " tensor buffer not set" );
270
- GGML_ASSERT (tensor->data != NULL && " tensor not allocated" );
271
- GGML_ASSERT (offset + size <= ggml_nbytes (tensor) && " tensor write out of bounds" );
272
-
273
- if (!size) {
279
+ if (size == 0 ) {
274
280
return ;
275
281
}
276
282
277
- GGML_ASSERT (buf->iface .memset_tensor != NULL && " memset not supported by backend buffer" );
283
+ GGML_ASSERT (buf != NULL && " tensor buffer not set" );
284
+ GGML_ASSERT (tensor->data != NULL && " tensor not allocated" );
285
+ GGML_ASSERT (offset + size <= ggml_nbytes (tensor) && " tensor write out of bounds" );
286
+ GGML_ASSERT (buf->iface .memset_tensor != NULL && " memset not implemented by backend buffer" );
278
287
279
288
buf->iface .memset_tensor (buf, tensor, value, offset, size);
280
289
}
@@ -713,12 +722,6 @@ ggml_backend_t ggml_backend_init_best(void) {
713
722
714
723
// backend CPU
715
724
716
- static const char * ggml_backend_cpu_buffer_get_name (ggml_backend_buffer_t buffer) {
717
- return " CPU" ;
718
-
719
- GGML_UNUSED (buffer);
720
- }
721
-
722
725
static void * ggml_backend_cpu_buffer_get_base (ggml_backend_buffer_t buffer) {
723
726
uintptr_t data = (uintptr_t )buffer->context ;
724
727
@@ -767,7 +770,6 @@ static void ggml_backend_cpu_buffer_clear(ggml_backend_buffer_t buffer, uint8_t
767
770
}
768
771
769
772
static const struct ggml_backend_buffer_i ggml_backend_cpu_buffer_i = {
770
- /* .get_name = */ ggml_backend_cpu_buffer_get_name,
771
773
/* .free_buffer = */ ggml_backend_cpu_buffer_free_buffer,
772
774
/* .get_base = */ ggml_backend_cpu_buffer_get_base,
773
775
/* .init_tensor = */ NULL , // no initialization required
@@ -780,7 +782,6 @@ static const struct ggml_backend_buffer_i ggml_backend_cpu_buffer_i = {
780
782
};
781
783
782
784
static const struct ggml_backend_buffer_i ggml_backend_cpu_buffer_from_ptr_i = {
783
- /* .get_name = */ ggml_backend_cpu_buffer_get_name,
784
785
/* .free_buffer = */ NULL , // ptr is not owned by the buffer, so it does not need to be freed
785
786
/* .get_base = */ ggml_backend_cpu_buffer_get_base,
786
787
/* .init_tensor = */ NULL , // no initialization required
@@ -799,19 +800,14 @@ static const char * ggml_backend_cpu_buffer_type_get_name(ggml_backend_buffer_ty
799
800
}
800
801
801
802
static ggml_backend_buffer_t ggml_backend_cpu_buffer_type_alloc_buffer (ggml_backend_buffer_type_t buft, size_t size) {
802
- auto alloc_size = size;
803
- if (alloc_size == 0 ) {
804
- alloc_size = 1 ;
805
- }
806
-
807
- void * data = ggml_aligned_malloc (alloc_size);
803
+ void * data = ggml_aligned_malloc (size);
808
804
809
805
if (data == NULL ) {
810
- GGML_LOG_ERROR (" %s: failed to allocate buffer of size %zu\n " , __func__, alloc_size );
806
+ GGML_LOG_ERROR (" %s: failed to allocate buffer of size %zu\n " , __func__, size );
811
807
return NULL ;
812
808
}
813
809
814
- return ggml_backend_buffer_init (buft, ggml_backend_cpu_buffer_i, data, alloc_size );
810
+ return ggml_backend_buffer_init (buft, ggml_backend_cpu_buffer_i, data, size );
815
811
}
816
812
817
813
static size_t ggml_backend_cpu_buffer_type_get_alignment (ggml_backend_buffer_type_t buft) {
@@ -1315,12 +1311,6 @@ struct ggml_backend_multi_buffer_context {
1315
1311
size_t n_buffers;
1316
1312
};
1317
1313
1318
- static const char * ggml_backend_multi_buffer_get_name (ggml_backend_buffer_t buffer) {
1319
- ggml_backend_multi_buffer_context * ctx = (ggml_backend_multi_buffer_context *) buffer->context ;
1320
-
1321
- return ctx->buffers [0 ]->iface .get_name (ctx->buffers [0 ]);
1322
- }
1323
-
1324
1314
static void ggml_backend_multi_buffer_free_buffer (ggml_backend_buffer_t buffer) {
1325
1315
ggml_backend_multi_buffer_context * ctx = (ggml_backend_multi_buffer_context *) buffer->context ;
1326
1316
for (size_t i = 0 ; i < ctx->n_buffers ; i++) {
@@ -1339,7 +1329,6 @@ static void ggml_backend_multi_buffer_clear(ggml_backend_buffer_t buffer, uint8_
1339
1329
}
1340
1330
1341
1331
static const struct ggml_backend_buffer_i ggml_backend_multi_buffer_i = {
1342
- /* .get_name = */ ggml_backend_multi_buffer_get_name,
1343
1332
/* .free_buffer = */ ggml_backend_multi_buffer_free_buffer,
1344
1333
/* .get_base = */ NULL ,
1345
1334
/* .init_tensor = */ NULL ,
@@ -1368,7 +1357,7 @@ ggml_backend_buffer_t ggml_backend_multi_buffer_alloc_buffer(ggml_backend_buffer
1368
1357
}
1369
1358
1370
1359
bool ggml_backend_buffer_is_multi_buffer (ggml_backend_buffer_t buffer) {
1371
- return buffer->iface .get_name == ggml_backend_multi_buffer_get_name ;
1360
+ return buffer->iface .free_buffer == ggml_backend_multi_buffer_free_buffer ;
1372
1361
}
1373
1362
1374
1363
void ggml_backend_multi_buffer_set_usage (ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage) {
0 commit comments