Akarshan Biswas commited on
Commit
3f95f2b
·
1 Parent(s): a73f01f

SYCL: implement memset ggml backend buffer interface (llama/12580)

Browse files

* SYCL: implement memset ggml backend buffer interface

* use GGML_ABORT macro

* Do not wait for all queues to finish for memset operation

Files changed (1) hide show
  1. ggml/src/ggml-sycl/ggml-sycl.cpp +19 -1
ggml/src/ggml-sycl/ggml-sycl.cpp CHANGED
@@ -37,6 +37,7 @@
37
  #include "ggml-backend-impl.h"
38
 
39
  #include "ggml-sycl/backend.hpp"
 
40
  #include "ggml-sycl/presets.hpp"
41
  #include "ggml-sycl/gemm.hpp"
42
  #include "ggml-sycl/sycl_hw.hpp"
@@ -490,6 +491,23 @@ catch (sycl::exception const &exc) {
490
  std::exit(1);
491
  }
492
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493
  static void ggml_backend_sycl_buffer_reset(ggml_backend_buffer_t buffer) {
494
  GGML_SYCL_DEBUG("[SYCL] call %s\n", __func__);
495
  if (buffer == nullptr) {
@@ -510,7 +528,7 @@ static const ggml_backend_buffer_i ggml_backend_sycl_buffer_interface = {
510
  /* .free_buffer = */ ggml_backend_sycl_buffer_free_buffer,
511
  /* .get_base = */ ggml_backend_sycl_buffer_get_base,
512
  /* .init_tensor = */ ggml_backend_sycl_buffer_init_tensor,
513
- /* .memset_tensor = */ NULL,
514
  /* .set_tensor = */ ggml_backend_sycl_buffer_set_tensor,
515
  /* .get_tensor = */ ggml_backend_sycl_buffer_get_tensor,
516
  /* .cpy_tensor = */ ggml_backend_sycl_buffer_cpy_tensor,
 
37
  #include "ggml-backend-impl.h"
38
 
39
  #include "ggml-sycl/backend.hpp"
40
+ #include "ggml-sycl/common.hpp"
41
  #include "ggml-sycl/presets.hpp"
42
  #include "ggml-sycl/gemm.hpp"
43
  #include "ggml-sycl/sycl_hw.hpp"
 
491
  std::exit(1);
492
  }
493
 
494
+ static void ggml_backend_sycl_buffer_memset_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, uint8_t value,
495
+ size_t offset, size_t size) {
496
+ GGML_SYCL_DEBUG(" [SYCL] call %s\n", __func__);
497
+ ggml_backend_sycl_buffer_context * ctx = (ggml_backend_sycl_buffer_context *) buffer->context;
498
+ SYCL_CHECK(ggml_sycl_set_device(ctx->device));
499
+ auto stream = &(dpct::dev_mgr::instance().get_device(ctx->device).default_queue());
500
+ if (size == 0) {
501
+ return; // Nothing to do
502
+ }
503
+ if (tensor->data == nullptr) {
504
+ GGML_ABORT("Error: Tensor data pointer is null.\n");
505
+ }
506
+ void * target_ptr = static_cast<char *>(tensor->data) + offset;
507
+ SYCL_CHECK(CHECK_TRY_ERROR((*stream).memset(target_ptr, value, size)));
508
+ SYCL_CHECK(CHECK_TRY_ERROR((*stream).wait()));
509
+ }
510
+
511
  static void ggml_backend_sycl_buffer_reset(ggml_backend_buffer_t buffer) {
512
  GGML_SYCL_DEBUG("[SYCL] call %s\n", __func__);
513
  if (buffer == nullptr) {
 
528
  /* .free_buffer = */ ggml_backend_sycl_buffer_free_buffer,
529
  /* .get_base = */ ggml_backend_sycl_buffer_get_base,
530
  /* .init_tensor = */ ggml_backend_sycl_buffer_init_tensor,
531
+ /* .memset_tensor = */ ggml_backend_sycl_buffer_memset_tensor,
532
  /* .set_tensor = */ ggml_backend_sycl_buffer_set_tensor,
533
  /* .get_tensor = */ ggml_backend_sycl_buffer_get_tensor,
534
  /* .cpy_tensor = */ ggml_backend_sycl_buffer_cpy_tensor,