0013-sort-devices-by-score.patch 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Michael Yang <mxyng@pm.me>
  3. Date: Tue, 14 Jan 2025 12:01:24 -0800
  4. Subject: [PATCH] sort devices by score
  5. ---
  6. ggml/src/ggml-backend-reg.cpp | 21 +++++++++++++--------
  7. 1 file changed, 13 insertions(+), 8 deletions(-)
  8. diff --git a/ggml/src/ggml-backend-reg.cpp b/ggml/src/ggml-backend-reg.cpp
  9. index 95036ef8..98d5e14d 100644
  10. --- a/ggml/src/ggml-backend-reg.cpp
  11. +++ b/ggml/src/ggml-backend-reg.cpp
  12. @@ -150,7 +150,7 @@ struct ggml_backend_reg_entry {
  13. struct ggml_backend_registry {
  14. std::vector<ggml_backend_reg_entry> backends;
  15. - std::vector<ggml_backend_dev_t> devices;
  16. + std::vector<std::pair<ggml_backend_dev_t, int>> devices;
  17. ggml_backend_registry() {
  18. #ifdef GGML_USE_CUDA
  19. @@ -195,7 +195,7 @@ struct ggml_backend_registry {
  20. }
  21. }
  22. - void register_backend(ggml_backend_reg_t reg, dl_handle_ptr handle = nullptr) {
  23. + void register_backend(ggml_backend_reg_t reg, int score = -1, dl_handle_ptr handle = nullptr) {
  24. if (!reg) {
  25. return;
  26. }
  27. @@ -206,15 +206,20 @@ struct ggml_backend_registry {
  28. #endif
  29. backends.push_back({ reg, std::move(handle) });
  30. for (size_t i = 0; i < ggml_backend_reg_dev_count(reg); i++) {
  31. - register_device(ggml_backend_reg_dev_get(reg, i));
  32. + register_device(ggml_backend_reg_dev_get(reg, i), score);
  33. }
  34. }
  35. - void register_device(ggml_backend_dev_t device) {
  36. + void register_device(ggml_backend_dev_t device, int score = -1) {
  37. #ifndef NDEBUG
  38. GGML_LOG_DEBUG("%s: registered device %s (%s)\n", __func__, ggml_backend_dev_name(device), ggml_backend_dev_description(device));
  39. #endif
  40. - devices.push_back(device);
  41. + devices.push_back({device, score});
  42. + std::stable_sort(devices.begin(), devices.end(),
  43. + [](const auto & a, const auto & b) {
  44. + return a.second > b.second;
  45. + }
  46. + );
  47. }
  48. ggml_backend_reg_t load_backend(const std::wstring & path, bool silent) {
  49. @@ -257,7 +262,7 @@ struct ggml_backend_registry {
  50. GGML_LOG_INFO("%s: loaded %s backend from %s\n", __func__, ggml_backend_reg_name(reg), utf16_to_utf8(path).c_str());
  51. - register_backend(reg, std::move(handle));
  52. + register_backend(reg, score_fn ? score_fn() : -1, std::move(handle));
  53. return reg;
  54. }
  55. @@ -280,7 +285,7 @@ struct ggml_backend_registry {
  56. // remove devices
  57. devices.erase(
  58. std::remove_if(devices.begin(), devices.end(),
  59. - [reg](ggml_backend_dev_t dev) { return ggml_backend_dev_backend_reg(dev) == reg; }),
  60. + [reg](std::pair<ggml_backend_dev_t, int> dev) { return ggml_backend_dev_backend_reg(dev.first) == reg; }),
  61. devices.end());
  62. // remove backend
  63. @@ -338,7 +343,7 @@ size_t ggml_backend_dev_count() {
  64. ggml_backend_dev_t ggml_backend_dev_get(size_t index) {
  65. GGML_ASSERT(index < ggml_backend_dev_count());
  66. - return get_reg().devices[index];
  67. + return get_reg().devices[index].first;
  68. }
  69. ggml_backend_dev_t ggml_backend_dev_by_name(const char * name) {