@@ -246,6 +246,22 @@ GGML_CALL void ggml_backend_tensor_get(const struct ggml_tensor * tensor, void *
246246 buf -> iface .get_tensor (buf , tensor , data , offset , size );
247247}
248248
249+ GGML_API GGML_CALL void ggml_backend_tensor_memset (struct ggml_tensor * tensor , uint8_t value , size_t offset , size_t size ) {
250+ ggml_backend_buffer_t buf = tensor -> view_src ? tensor -> view_src -> buffer : tensor -> buffer ;
251+
252+ GGML_ASSERT (buf != NULL && "tensor buffer not set" );
253+ GGML_ASSERT (tensor -> data != NULL && "tensor not allocated" );
254+ GGML_ASSERT (offset + size <= ggml_nbytes (tensor ) && "tensor write out of bounds" );
255+
256+ if (!size ) {
257+ return ;
258+ }
259+
260+ GGML_ASSERT (buf -> iface .memset_tensor != NULL && "memset not supported by backend buffer" );
261+
262+ buf -> iface .memset_tensor (buf , tensor , value , offset , size );
263+ }
264+
249265void ggml_backend_synchronize (ggml_backend_t backend ) {
250266 if (backend -> iface .synchronize == NULL ) {
251267 return ;
@@ -569,6 +585,12 @@ GGML_CALL static void ggml_backend_cpu_buffer_free_buffer(ggml_backend_buffer_t
569585 free (buffer -> context );
570586}
571587
588+ GGML_CALL static void ggml_backend_cpu_buffer_memset_tensor (ggml_backend_buffer_t buffer , struct ggml_tensor * tensor , uint8_t value , size_t offset , size_t size ) {
589+ memset ((char * )tensor -> data + offset , value , size );
590+
591+ GGML_UNUSED (buffer );
592+ }
593+
572594GGML_CALL static void ggml_backend_cpu_buffer_set_tensor (ggml_backend_buffer_t buffer , struct ggml_tensor * tensor , const void * data , size_t offset , size_t size ) {
573595 memcpy ((char * )tensor -> data + offset , data , size );
574596
@@ -600,6 +622,7 @@ static struct ggml_backend_buffer_i cpu_backend_buffer_i = {
600622 /* .free_buffer = */ ggml_backend_cpu_buffer_free_buffer ,
601623 /* .get_base = */ ggml_backend_cpu_buffer_get_base ,
602624 /* .init_tensor = */ NULL , // no initialization required
625+ /* .memset_tensor = */ ggml_backend_cpu_buffer_memset_tensor ,
603626 /* .set_tensor = */ ggml_backend_cpu_buffer_set_tensor ,
604627 /* .get_tensor = */ ggml_backend_cpu_buffer_get_tensor ,
605628 /* .cpy_tensor = */ ggml_backend_cpu_buffer_cpy_tensor ,
@@ -613,6 +636,7 @@ static struct ggml_backend_buffer_i cpu_backend_buffer_i_from_ptr = {
613636 /* .free_buffer = */ NULL , // ptr is not owned by the buffer, so it does not need to be freed
614637 /* .get_base = */ ggml_backend_cpu_buffer_get_base ,
615638 /* .init_tensor = */ NULL , // no initialization required
639+ /* .memset_tensor = */ ggml_backend_cpu_buffer_memset_tensor ,
616640 /* .set_tensor = */ ggml_backend_cpu_buffer_set_tensor ,
617641 /* .get_tensor = */ ggml_backend_cpu_buffer_get_tensor ,
618642 /* .cpy_tensor = */ ggml_backend_cpu_buffer_cpy_tensor ,
@@ -980,6 +1004,7 @@ static struct ggml_backend_buffer_i ggml_backend_multi_buffer_context_interface(
9801004 /* .free_buffer = */ ggml_backend_multi_buffer_free_buffer ,
9811005 /* .get_base = */ NULL ,
9821006 /* .init_tensor = */ NULL ,
1007+ /* .memset_tensor = */ NULL ,
9831008 /* .set_tensor = */ NULL ,
9841009 /* .get_tensor = */ NULL ,
9851010 /* .cpy_tensor = */ NULL ,
0 commit comments