@@ -34,6 +34,11 @@ const char * ggml_backend_buft_name(ggml_backend_buffer_type_t buft) {
3434}
3535
3636ggml_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+
3742 return buft->iface .alloc_buffer (buft, size);
3843}
3944
@@ -89,7 +94,7 @@ ggml_backend_buffer_t ggml_backend_buffer_init(
8994}
9095
9196const 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) );
9398}
9499
95100void 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) {
108113}
109114
110115void * 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+
111121 void * base = buffer->iface .get_base (buffer);
112122
113123 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
238248void ggml_backend_tensor_set (struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) {
239249 ggml_backend_buffer_t buf = tensor->view_src ? tensor->view_src ->buffer : tensor->buffer ;
240250
251+ if (size == 0 ) {
252+ return ;
253+ }
254+
241255 GGML_ASSERT (buf != NULL && " tensor buffer not set" );
242256 GGML_ASSERT (tensor->data != NULL && " tensor not allocated" );
243257 GGML_ASSERT (offset + size <= ggml_nbytes (tensor) && " tensor write out of bounds" );
244258
245- if (!size) {
246- return ;
247- }
248-
249259 buf->iface .set_tensor (buf, tensor, data, offset, size);
250260}
251261
252262void ggml_backend_tensor_get (const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) {
253263 ggml_backend_buffer_t buf = tensor->view_src ? tensor->view_src ->buffer : tensor->buffer ;
254264
265+ if (size == 0 ) {
266+ return ;
267+ }
268+
255269 GGML_ASSERT (buf != NULL && " tensor buffer not set" );
256270 GGML_ASSERT (tensor->data != NULL && " tensor not allocated" );
257271 GGML_ASSERT (offset + size <= ggml_nbytes (tensor) && " tensor read out of bounds" );
258272
259- if (!size) {
260- return ;
261- }
262-
263273 buf->iface .get_tensor (buf, tensor, data, offset, size);
264274}
265275
266276GGML_API void ggml_backend_tensor_memset (struct ggml_tensor * tensor, uint8_t value, size_t offset, size_t size) {
267277 ggml_backend_buffer_t buf = tensor->view_src ? tensor->view_src ->buffer : tensor->buffer ;
268278
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 ) {
274280 return ;
275281 }
276282
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" );
278287
279288 buf->iface .memset_tensor (buf, tensor, value, offset, size);
280289}
@@ -713,12 +722,6 @@ ggml_backend_t ggml_backend_init_best(void) {
713722
714723// backend CPU
715724
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-
722725static void * ggml_backend_cpu_buffer_get_base (ggml_backend_buffer_t buffer) {
723726 uintptr_t data = (uintptr_t )buffer->context ;
724727
@@ -767,7 +770,6 @@ static void ggml_backend_cpu_buffer_clear(ggml_backend_buffer_t buffer, uint8_t
767770}
768771
769772static const struct ggml_backend_buffer_i ggml_backend_cpu_buffer_i = {
770- /* .get_name = */ ggml_backend_cpu_buffer_get_name,
771773 /* .free_buffer = */ ggml_backend_cpu_buffer_free_buffer,
772774 /* .get_base = */ ggml_backend_cpu_buffer_get_base,
773775 /* .init_tensor = */ NULL , // no initialization required
@@ -780,7 +782,6 @@ static const struct ggml_backend_buffer_i ggml_backend_cpu_buffer_i = {
780782};
781783
782784static const struct ggml_backend_buffer_i ggml_backend_cpu_buffer_from_ptr_i = {
783- /* .get_name = */ ggml_backend_cpu_buffer_get_name,
784785 /* .free_buffer = */ NULL , // ptr is not owned by the buffer, so it does not need to be freed
785786 /* .get_base = */ ggml_backend_cpu_buffer_get_base,
786787 /* .init_tensor = */ NULL , // no initialization required
@@ -799,19 +800,14 @@ static const char * ggml_backend_cpu_buffer_type_get_name(ggml_backend_buffer_ty
799800}
800801
801802static 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);
808804
809805 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 );
811807 return NULL ;
812808 }
813809
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 );
815811}
816812
817813static 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 {
13151311 size_t n_buffers;
13161312};
13171313
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-
13241314static void ggml_backend_multi_buffer_free_buffer (ggml_backend_buffer_t buffer) {
13251315 ggml_backend_multi_buffer_context * ctx = (ggml_backend_multi_buffer_context *) buffer->context ;
13261316 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_
13391329}
13401330
13411331static const struct ggml_backend_buffer_i ggml_backend_multi_buffer_i = {
1342- /* .get_name = */ ggml_backend_multi_buffer_get_name,
13431332 /* .free_buffer = */ ggml_backend_multi_buffer_free_buffer,
13441333 /* .get_base = */ NULL ,
13451334 /* .init_tensor = */ NULL ,
@@ -1368,7 +1357,7 @@ ggml_backend_buffer_t ggml_backend_multi_buffer_alloc_buffer(ggml_backend_buffer
13681357}
13691358
13701359bool 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 ;
13721361}
13731362
13741363void ggml_backend_multi_buffer_set_usage (ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage) {
0 commit comments