ggml-backend-impl.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #pragma once
  2. // ggml-backend internal header
  3. #include "ggml-backend.h"
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. //
  8. // Backend buffer
  9. //
  10. typedef void * ggml_backend_buffer_context_t;
  11. struct ggml_backend_buffer_i {
  12. void (*free_buffer) (ggml_backend_buffer_t buffer);
  13. void * (*get_base) (ggml_backend_buffer_t buffer); // get base pointer
  14. size_t (*get_alloc_size)(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); // pre-allocation callback
  15. void (*init_tensor) (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); // post-allocation callback
  16. void (*free_tensor) (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); // pre-free callback
  17. };
  18. struct ggml_backend_buffer {
  19. struct ggml_backend_buffer_i iface;
  20. ggml_backend_t backend;
  21. ggml_backend_buffer_context_t context;
  22. size_t size;
  23. };
  24. GGML_API ggml_backend_buffer_t ggml_backend_buffer_init(
  25. struct ggml_backend * backend,
  26. struct ggml_backend_buffer_i iface,
  27. ggml_backend_buffer_context_t context,
  28. size_t size);
  29. //
  30. // Backend
  31. //
  32. typedef void * ggml_backend_context_t;
  33. struct ggml_backend_i {
  34. const char * (*get_name)(ggml_backend_t backend);
  35. void (*free)(ggml_backend_t backend);
  36. // buffer allocation
  37. ggml_backend_buffer_t (*alloc_buffer)(ggml_backend_t backend, size_t size);
  38. // get buffer alignment
  39. size_t (*get_alignment)(ggml_backend_t backend);
  40. // tensor data access
  41. // these functions can be asynchronous, helper functions are provided for synchronous access that automatically call synchronize
  42. void (*set_tensor_async)(ggml_backend_t backend, struct ggml_tensor * tensor, const void * data, size_t offset, size_t size);
  43. void (*get_tensor_async)(ggml_backend_t backend, const struct ggml_tensor * tensor, void * data, size_t offset, size_t size);
  44. void (*synchronize) (ggml_backend_t backend);
  45. // (optional) copy tensor between different backends, allow for single-copy tranfers
  46. void (*cpy_tensor_from)(ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst);
  47. void (*cpy_tensor_to) (ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst);
  48. // compute graph with a plan
  49. ggml_backend_graph_plan_t (*graph_plan_create) (ggml_backend_t backend, struct ggml_cgraph * cgraph);
  50. void (*graph_plan_free) (ggml_backend_t backend, ggml_backend_graph_plan_t plan);
  51. void (*graph_plan_compute)(ggml_backend_t backend, ggml_backend_graph_plan_t plan);
  52. // compute graph without a plan
  53. void (*graph_compute)(ggml_backend_t backend, struct ggml_cgraph * cgraph);
  54. // check if the backend supports an operation
  55. bool (*supports_op)(ggml_backend_t backend, const struct ggml_tensor * op);
  56. };
  57. struct ggml_backend {
  58. struct ggml_backend_i iface;
  59. ggml_backend_context_t context;
  60. };
  61. #ifdef __cplusplus
  62. }
  63. #endif