ggml-backend-reg.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "ggml-backend-impl.h"
  2. #include "ggml-backend.h"
  3. #include "ggml-cpu.h"
  4. #include "ggml-impl.h"
  5. #include <cstring>
  6. #include <vector>
  7. // Backend registry
  8. #ifdef GGML_USE_CUDA
  9. #include "ggml-cuda.h"
  10. #endif
  11. #ifdef GGML_USE_METAL
  12. #include "ggml-metal.h"
  13. #endif
  14. #ifdef GGML_USE_SYCL
  15. #include "ggml-sycl.h"
  16. #endif
  17. #ifdef GGML_USE_VULKAN
  18. #include "ggml-vulkan.h"
  19. #endif
  20. #ifdef GGML_USE_BLAS
  21. #include "ggml-blas.h"
  22. #endif
  23. #ifdef GGML_USE_RPC
  24. #include "ggml-rpc.h"
  25. #endif
  26. #ifdef GGML_USE_AMX
  27. # include "ggml-amx.h"
  28. #endif
  29. #ifdef GGML_USE_CANN
  30. #include "ggml-cann.h"
  31. #endif
  32. #ifdef GGML_USE_KOMPUTE
  33. #include "ggml-kompute.h"
  34. #endif
  35. struct ggml_backend_registry {
  36. std::vector<ggml_backend_reg_t> backends;
  37. std::vector<ggml_backend_dev_t> devices;
  38. ggml_backend_registry() {
  39. #ifdef GGML_USE_CUDA
  40. register_backend(ggml_backend_cuda_reg());
  41. #endif
  42. #ifdef GGML_USE_METAL
  43. register_backend(ggml_backend_metal_reg());
  44. #endif
  45. #ifdef GGML_USE_SYCL
  46. register_backend(ggml_backend_sycl_reg());
  47. #endif
  48. #ifdef GGML_USE_VULKAN
  49. register_backend(ggml_backend_vk_reg());
  50. #endif
  51. #ifdef GGML_USE_CANN
  52. register_backend(ggml_backend_cann_reg());
  53. #endif
  54. #ifdef GGML_USE_BLAS
  55. register_backend(ggml_backend_blas_reg());
  56. #endif
  57. #ifdef GGML_USE_RPC
  58. register_backend(ggml_backend_rpc_reg());
  59. #endif
  60. #ifdef GGML_USE_AMX
  61. register_backend(ggml_backend_amx_reg());
  62. #endif
  63. #ifdef GGML_USE_KOMPUTE
  64. register_backend(ggml_backend_kompute_reg());
  65. #endif
  66. register_backend(ggml_backend_cpu_reg());
  67. }
  68. void register_backend(ggml_backend_reg_t reg) {
  69. if (!reg) {
  70. return;
  71. }
  72. #ifndef NDEBUG
  73. GGML_LOG_DEBUG("%s: registered backend %s (%zu devices)\n",
  74. __func__, ggml_backend_reg_name(reg), ggml_backend_reg_dev_count(reg));
  75. #endif
  76. backends.push_back(reg);
  77. for (size_t i = 0; i < ggml_backend_reg_dev_count(reg); i++) {
  78. register_device(ggml_backend_reg_dev_get(reg, i));
  79. }
  80. }
  81. void register_device(ggml_backend_dev_t device) {
  82. #ifndef NDEBUG
  83. GGML_LOG_DEBUG("%s: registered device %s (%s)\n", __func__, ggml_backend_dev_name(device), ggml_backend_dev_description(device));
  84. #endif
  85. devices.push_back(device);
  86. }
  87. };
  88. static ggml_backend_registry & get_reg() {
  89. static ggml_backend_registry reg;
  90. return reg;
  91. }
  92. // Internal API
  93. void ggml_backend_register(ggml_backend_reg_t reg) {
  94. get_reg().register_backend(reg);
  95. }
  96. void ggml_backend_device_register(ggml_backend_dev_t device) {
  97. get_reg().register_device(device);
  98. }
  99. // Backend (reg) enumeration
  100. size_t ggml_backend_reg_count() {
  101. return get_reg().backends.size();
  102. }
  103. ggml_backend_reg_t ggml_backend_reg_get(size_t index) {
  104. GGML_ASSERT(index < ggml_backend_reg_count());
  105. return get_reg().backends[index];
  106. }
  107. ggml_backend_reg_t ggml_backend_reg_by_name(const char * name) {
  108. for (size_t i = 0; i < ggml_backend_reg_count(); i++) {
  109. ggml_backend_reg_t reg = ggml_backend_reg_get(i);
  110. if (std::strcmp(ggml_backend_reg_name(reg), name) == 0) {
  111. return reg;
  112. }
  113. }
  114. return NULL;
  115. }
  116. // Device enumeration
  117. size_t ggml_backend_dev_count() {
  118. return get_reg().devices.size();
  119. }
  120. ggml_backend_dev_t ggml_backend_dev_get(size_t index) {
  121. GGML_ASSERT(index < ggml_backend_dev_count());
  122. return get_reg().devices[index];
  123. }
  124. ggml_backend_dev_t ggml_backend_dev_by_name(const char * name) {
  125. for (size_t i = 0; i < ggml_backend_dev_count(); i++) {
  126. ggml_backend_dev_t dev = ggml_backend_dev_get(i);
  127. if (strcmp(ggml_backend_dev_name(dev), name) == 0) {
  128. return dev;
  129. }
  130. }
  131. return NULL;
  132. }
  133. ggml_backend_dev_t ggml_backend_dev_by_type(enum ggml_backend_dev_type type) {
  134. for (size_t i = 0; i < ggml_backend_dev_count(); i++) {
  135. ggml_backend_dev_t dev = ggml_backend_dev_get(i);
  136. if (ggml_backend_dev_type(dev) == type) {
  137. return dev;
  138. }
  139. }
  140. return NULL;
  141. }
  142. // Convenience functions
  143. ggml_backend_t ggml_backend_init_by_name(const char * name, const char * params) {
  144. ggml_backend_dev_t dev = ggml_backend_dev_by_name(name);
  145. if (!dev) {
  146. return NULL;
  147. }
  148. return ggml_backend_dev_init(dev, params);
  149. }
  150. ggml_backend_t ggml_backend_init_by_type(enum ggml_backend_dev_type type, const char * params) {
  151. ggml_backend_dev_t dev = ggml_backend_dev_by_type(type);
  152. if (!dev) {
  153. return NULL;
  154. }
  155. return ggml_backend_dev_init(dev, params);
  156. }
  157. ggml_backend_t ggml_backend_init_best(void) {
  158. ggml_backend_dev_t dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_GPU);
  159. if (!dev) {
  160. dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU);
  161. }
  162. if (!dev) {
  163. return NULL;
  164. }
  165. return ggml_backend_dev_init(dev, NULL);
  166. }