ggml-alloc.h 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #pragma once
  2. #include "ggml.h"
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. struct ggml_backend;
  7. struct ggml_backend_buffer;
  8. //
  9. // Legacy API
  10. //
  11. typedef struct ggml_allocr * ggml_allocr_t;
  12. // initialize allocator for use with CPU backend only
  13. GGML_API ggml_allocr_t ggml_allocr_new(void * data, size_t size, size_t alignment);
  14. GGML_API ggml_allocr_t ggml_allocr_new_measure(size_t alignment);
  15. // initialize allocator for use with ggml-backend
  16. GGML_API ggml_allocr_t ggml_allocr_new_from_buffer(struct ggml_backend_buffer * buffer);
  17. GGML_API ggml_allocr_t ggml_allocr_new_from_backend(struct ggml_backend * backend, size_t size); // allocates an owned buffer
  18. GGML_API ggml_allocr_t ggml_allocr_new_measure_from_backend(struct ggml_backend * backend);
  19. GGML_API struct ggml_backend_buffer * ggml_allocr_get_buffer(ggml_allocr_t alloc);
  20. // tell the allocator to parse nodes following the order described in the list
  21. // you should call this if your graph are optimized to execute out-of-order
  22. GGML_API void ggml_allocr_set_parse_seq(ggml_allocr_t alloc, const int * list, int n);
  23. GGML_API void ggml_allocr_free (ggml_allocr_t alloc);
  24. GGML_API bool ggml_allocr_is_measure (ggml_allocr_t alloc);
  25. GGML_API void ggml_allocr_reset (ggml_allocr_t alloc);
  26. GGML_API void ggml_allocr_alloc (ggml_allocr_t alloc, struct ggml_tensor * tensor);
  27. GGML_API size_t ggml_allocr_max_size (ggml_allocr_t alloc);
  28. GGML_API size_t ggml_allocr_alloc_graph(ggml_allocr_t alloc, struct ggml_cgraph * graph);
  29. //
  30. // ggml-backend v2 API
  31. //
  32. // Seperate tensor and graph allocator objects
  33. // This is necessary for multi-backend allocation because the graph allocator needs to use multiple tensor allocators
  34. // The original API is kept as a wrapper around the new API
  35. // Tensor allocator
  36. typedef struct ggml_tallocr * ggml_tallocr_t;
  37. GGML_API ggml_tallocr_t ggml_tallocr_new(void * data, size_t size, size_t alignment);
  38. GGML_API ggml_tallocr_t ggml_tallocr_new_measure(size_t alignment);
  39. GGML_API ggml_tallocr_t ggml_tallocr_new_from_buffer(struct ggml_backend_buffer * buffer);
  40. GGML_API ggml_tallocr_t ggml_tallocr_new_from_backend(struct ggml_backend * backend, size_t size); // allocates an owned buffer
  41. GGML_API ggml_tallocr_t ggml_tallocr_new_measure_from_backend(struct ggml_backend * backend);
  42. GGML_API struct ggml_backend_buffer * ggml_tallocr_get_buffer(ggml_tallocr_t talloc);
  43. GGML_API void ggml_tallocr_free (ggml_tallocr_t talloc);
  44. GGML_API bool ggml_tallocr_is_measure (ggml_tallocr_t talloc);
  45. GGML_API void ggml_tallocr_reset (ggml_tallocr_t talloc);
  46. GGML_API void ggml_tallocr_alloc (ggml_tallocr_t talloc, struct ggml_tensor * tensor);
  47. GGML_API size_t ggml_tallocr_max_size (ggml_tallocr_t talloc);
  48. // Graph allocator
  49. typedef struct ggml_gallocr * ggml_gallocr_t;
  50. GGML_API ggml_gallocr_t ggml_gallocr_new(void);
  51. GGML_API void ggml_gallocr_free(ggml_gallocr_t galloc);
  52. GGML_API void ggml_gallocr_set_parse_seq(ggml_gallocr_t galloc, const int * list, int n);
  53. GGML_API size_t ggml_gallocr_alloc_graph(ggml_gallocr_t galloc, ggml_tallocr_t talloc, struct ggml_cgraph * graph);
  54. // Allocate tensors from the allocators given by the hash table
  55. GGML_API void ggml_gallocr_alloc_graph_n(
  56. ggml_gallocr_t galloc,
  57. struct ggml_cgraph * graph,
  58. struct ggml_hash_set hash_set,
  59. ggml_tallocr_t * hash_node_talloc);
  60. #ifdef __cplusplus
  61. }
  62. #endif