UEXTM.com slaren commited on
Commit
a7eb9f6
·
unverified ·
1 Parent(s): 3fd8b4d

Introduce backend GUIDs (ggml/743)

Browse files

* Introduce backend GUIDs

Initial proposed implementation of backend GUIDs
(Discussed in https://github.com/ggerganov/ggml/pull/741)

Hardcoded CPU backend GUID (for now)
Change ggml_backend_is_cpu logic to use GUID

* Remove redundant functions

Remove redundant functions `ggml_backend_i::get_name` and `ggml_backend_guid` which are not desired for future expansion

* Add spaces to match style

Co-authored-by: slaren <[email protected]>

* Fix brace style to match

Co-authored-by: slaren <[email protected]>

* Add void to () in function signature

Co-authored-by: slaren <[email protected]>

* Add back ggml_backend_guid and make CPU_GUID a local static in ggml_backend_cpu_guid

* add guids to all backends

ggml-ci

---------

Co-authored-by: slaren <[email protected]>

Files changed (10) hide show
  1. ggml-backend-impl.h +2 -0
  2. ggml-backend.c +14 -2
  3. ggml-backend.h +1 -1
  4. ggml-cuda.cu +7 -1
  5. ggml-kompute.cpp +7 -1
  6. ggml-metal.m +7 -1
  7. ggml-sycl.cpp +7 -1
  8. ggml-vulkan.cpp +7 -1
  9. ggml.c +4 -0
  10. ggml.h +10 -0
ggml-backend-impl.h CHANGED
@@ -104,6 +104,8 @@ extern "C" {
104
  };
105
 
106
  struct ggml_backend {
 
 
107
  struct ggml_backend_i iface;
108
 
109
  ggml_backend_context_t context;
 
104
  };
105
 
106
  struct ggml_backend {
107
+ ggml_guid_t guid;
108
+
109
  struct ggml_backend_i iface;
110
 
111
  ggml_backend_context_t context;
ggml-backend.c CHANGED
@@ -12,7 +12,6 @@
12
 
13
  #define MAX(a, b) ((a) > (b) ? (a) : (b))
14
 
15
-
16
  // backend buffer type
17
 
18
  const char * ggml_backend_buft_name(ggml_backend_buffer_type_t buft) {
@@ -159,6 +158,13 @@ bool ggml_backend_buffer_copy_tensor(const struct ggml_tensor * src, struct ggml
159
 
160
  // backend
161
 
 
 
 
 
 
 
 
162
  const char * ggml_backend_name(ggml_backend_t backend) {
163
  if (backend == NULL) {
164
  return "NULL";
@@ -781,6 +787,11 @@ static struct ggml_backend_i cpu_backend_i = {
781
  /* .supports_op = */ ggml_backend_cpu_supports_op,
782
  };
783
 
 
 
 
 
 
784
  ggml_backend_t ggml_backend_cpu_init(void) {
785
  struct ggml_backend_cpu_context * ctx = malloc(sizeof(struct ggml_backend_cpu_context));
786
  if (ctx == NULL) {
@@ -800,6 +811,7 @@ ggml_backend_t ggml_backend_cpu_init(void) {
800
  }
801
 
802
  *cpu_backend = (struct ggml_backend) {
 
803
  /* .interface = */ cpu_backend_i,
804
  /* .context = */ ctx
805
  };
@@ -807,7 +819,7 @@ ggml_backend_t ggml_backend_cpu_init(void) {
807
  }
808
 
809
  GGML_CALL bool ggml_backend_is_cpu(ggml_backend_t backend) {
810
- return backend && backend->iface.get_name == ggml_backend_cpu_name;
811
  }
812
 
813
  void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads) {
 
12
 
13
  #define MAX(a, b) ((a) > (b) ? (a) : (b))
14
 
 
15
  // backend buffer type
16
 
17
  const char * ggml_backend_buft_name(ggml_backend_buffer_type_t buft) {
 
158
 
159
  // backend
160
 
161
+ ggml_guid_t ggml_backend_guid(ggml_backend_t backend) {
162
+ if (backend == NULL) {
163
+ return NULL;
164
+ }
165
+ return backend->guid;
166
+ }
167
+
168
  const char * ggml_backend_name(ggml_backend_t backend) {
169
  if (backend == NULL) {
170
  return "NULL";
 
787
  /* .supports_op = */ ggml_backend_cpu_supports_op,
788
  };
789
 
790
+ static ggml_guid_t ggml_backend_cpu_guid(void) {
791
+ static ggml_guid guid = { 0xaa, 0x67, 0xc7, 0x43, 0x96, 0xe6, 0xa3, 0x8a, 0xe3, 0xaf, 0xea, 0x92, 0x36, 0xbc, 0xfc, 0x89 };
792
+ return &guid;
793
+ }
794
+
795
  ggml_backend_t ggml_backend_cpu_init(void) {
796
  struct ggml_backend_cpu_context * ctx = malloc(sizeof(struct ggml_backend_cpu_context));
797
  if (ctx == NULL) {
 
811
  }
812
 
813
  *cpu_backend = (struct ggml_backend) {
814
+ /* .guid = */ ggml_backend_cpu_guid(),
815
  /* .interface = */ cpu_backend_i,
816
  /* .context = */ ctx
817
  };
 
819
  }
820
 
821
  GGML_CALL bool ggml_backend_is_cpu(ggml_backend_t backend) {
822
+ return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_cpu_guid());
823
  }
824
 
825
  void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads) {
ggml-backend.h CHANGED
@@ -49,7 +49,7 @@ extern "C" {
49
  // Backend
50
  //
51
 
52
-
53
  GGML_API const char * ggml_backend_name(ggml_backend_t backend);
54
  GGML_API void ggml_backend_free(ggml_backend_t backend);
55
 
 
49
  // Backend
50
  //
51
 
52
+ GGML_API ggml_guid_t ggml_backend_guid(ggml_backend_t backend);
53
  GGML_API const char * ggml_backend_name(ggml_backend_t backend);
54
  GGML_API void ggml_backend_free(ggml_backend_t backend);
55
 
ggml-cuda.cu CHANGED
@@ -11647,6 +11647,11 @@ static ggml_backend_i ggml_backend_cuda_interface = {
11647
  /* .supports_op = */ ggml_backend_cuda_supports_op,
11648
  };
11649
 
 
 
 
 
 
11650
  GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
11651
  ggml_init_cublas(); // TODO: remove from ggml.c
11652
 
@@ -11664,6 +11669,7 @@ GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
11664
  };
11665
 
11666
  ggml_backend_t cuda_backend = new ggml_backend {
 
11667
  /* .interface = */ ggml_backend_cuda_interface,
11668
  /* .context = */ ctx
11669
  };
@@ -11672,7 +11678,7 @@ GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
11672
  }
11673
 
11674
  GGML_CALL bool ggml_backend_is_cuda(ggml_backend_t backend) {
11675
- return backend && backend->iface.get_name == ggml_backend_cuda_name;
11676
  }
11677
 
11678
  GGML_CALL int ggml_backend_cuda_get_device_count() {
 
11647
  /* .supports_op = */ ggml_backend_cuda_supports_op,
11648
  };
11649
 
11650
+ static ggml_guid_t ggml_backend_cuda_guid() {
11651
+ static ggml_guid guid = { 0x2c, 0xdd, 0xe8, 0x1c, 0x65, 0xb3, 0x65, 0x73, 0x6a, 0x12, 0x88, 0x61, 0x1c, 0xc9, 0xdc, 0x25 };
11652
+ return &guid;
11653
+ }
11654
+
11655
  GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
11656
  ggml_init_cublas(); // TODO: remove from ggml.c
11657
 
 
11669
  };
11670
 
11671
  ggml_backend_t cuda_backend = new ggml_backend {
11672
+ /* .guid = */ ggml_backend_cuda_guid(),
11673
  /* .interface = */ ggml_backend_cuda_interface,
11674
  /* .context = */ ctx
11675
  };
 
11678
  }
11679
 
11680
  GGML_CALL bool ggml_backend_is_cuda(ggml_backend_t backend) {
11681
+ return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_cuda_guid());
11682
  }
11683
 
11684
  GGML_CALL int ggml_backend_cuda_get_device_count() {
ggml-kompute.cpp CHANGED
@@ -1953,11 +1953,17 @@ static struct ggml_backend_i kompute_backend_i = {
1953
  /* .supports_op = */ ggml_backend_kompute_supports_op,
1954
  };
1955
 
 
 
 
 
 
1956
  ggml_backend_t ggml_backend_kompute_init(int device) {
1957
  GGML_ASSERT(s_kompute_context == nullptr);
1958
  s_kompute_context = new ggml_kompute_context(device);
1959
 
1960
  ggml_backend_t kompute_backend = new ggml_backend {
 
1961
  /* .interface = */ kompute_backend_i,
1962
  /* .context = */ s_kompute_context,
1963
  };
@@ -1966,7 +1972,7 @@ ggml_backend_t ggml_backend_kompute_init(int device) {
1966
  }
1967
 
1968
  bool ggml_backend_is_kompute(ggml_backend_t backend) {
1969
- return backend && backend->iface.get_name == ggml_backend_kompute_name;
1970
  }
1971
 
1972
  static ggml_backend_t ggml_backend_reg_kompute_init(const char * params, void * user_data) {
 
1953
  /* .supports_op = */ ggml_backend_kompute_supports_op,
1954
  };
1955
 
1956
+ static ggml_guid_t ggml_backend_kompute_guid() {
1957
+ static ggml_guid guid = { 0x7b, 0x57, 0xdc, 0xaf, 0xde, 0x12, 0x1d, 0x49, 0xfb, 0x35, 0xfa, 0x9b, 0x18, 0x31, 0x1d, 0xca };
1958
+ return &guid;
1959
+ }
1960
+
1961
  ggml_backend_t ggml_backend_kompute_init(int device) {
1962
  GGML_ASSERT(s_kompute_context == nullptr);
1963
  s_kompute_context = new ggml_kompute_context(device);
1964
 
1965
  ggml_backend_t kompute_backend = new ggml_backend {
1966
+ /* .guid = */ ggml_backend_kompute_guid(),
1967
  /* .interface = */ kompute_backend_i,
1968
  /* .context = */ s_kompute_context,
1969
  };
 
1972
  }
1973
 
1974
  bool ggml_backend_is_kompute(ggml_backend_t backend) {
1975
+ return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_kompute_guid());
1976
  }
1977
 
1978
  static ggml_backend_t ggml_backend_reg_kompute_init(const char * params, void * user_data) {
ggml-metal.m CHANGED
@@ -2696,6 +2696,11 @@ void ggml_backend_metal_log_set_callback(ggml_log_callback log_callback, void *
2696
  ggml_metal_log_user_data = user_data;
2697
  }
2698
 
 
 
 
 
 
2699
  ggml_backend_t ggml_backend_metal_init(void) {
2700
  struct ggml_metal_context * ctx = ggml_metal_init(GGML_DEFAULT_N_THREADS);
2701
 
@@ -2706,6 +2711,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
2706
  ggml_backend_t metal_backend = malloc(sizeof(struct ggml_backend));
2707
 
2708
  *metal_backend = (struct ggml_backend) {
 
2709
  /* .interface = */ ggml_backend_metal_i,
2710
  /* .context = */ ctx,
2711
  };
@@ -2714,7 +2720,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
2714
  }
2715
 
2716
  bool ggml_backend_is_metal(ggml_backend_t backend) {
2717
- return backend && backend->iface.get_name == ggml_backend_metal_name;
2718
  }
2719
 
2720
  void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) {
 
2696
  ggml_metal_log_user_data = user_data;
2697
  }
2698
 
2699
+ static ggml_guid_t ggml_backend_metal_guid(void) {
2700
+ static ggml_guid guid = { 0x81, 0xa1, 0x8b, 0x1e, 0x71, 0xec, 0x79, 0xed, 0x2b, 0x85, 0xdc, 0x8a, 0x61, 0x98, 0x30, 0xe6 };
2701
+ return &guid;
2702
+ }
2703
+
2704
  ggml_backend_t ggml_backend_metal_init(void) {
2705
  struct ggml_metal_context * ctx = ggml_metal_init(GGML_DEFAULT_N_THREADS);
2706
 
 
2711
  ggml_backend_t metal_backend = malloc(sizeof(struct ggml_backend));
2712
 
2713
  *metal_backend = (struct ggml_backend) {
2714
+ /* .guid = */ ggml_backend_metal_guid(),
2715
  /* .interface = */ ggml_backend_metal_i,
2716
  /* .context = */ ctx,
2717
  };
 
2720
  }
2721
 
2722
  bool ggml_backend_is_metal(ggml_backend_t backend) {
2723
+ return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_metal_guid());
2724
  }
2725
 
2726
  void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) {
ggml-sycl.cpp CHANGED
@@ -15078,6 +15078,11 @@ static ggml_backend_i ggml_backend_sycl_interface = {
15078
  /* .supports_op = */ ggml_backend_sycl_supports_op,
15079
  };
15080
 
 
 
 
 
 
15081
  ggml_backend_t ggml_backend_sycl_init(int device) {
15082
  ggml_init_sycl(); // TODO: remove from ggml.c
15083
 
@@ -15095,6 +15100,7 @@ ggml_backend_t ggml_backend_sycl_init(int device) {
15095
  };
15096
 
15097
  ggml_backend_t sycl_backend = new ggml_backend {
 
15098
  /* .interface = */ ggml_backend_sycl_interface,
15099
  /* .context = */ ctx
15100
  };
@@ -15103,7 +15109,7 @@ ggml_backend_t ggml_backend_sycl_init(int device) {
15103
  }
15104
 
15105
  bool ggml_backend_is_sycl(ggml_backend_t backend) {
15106
- return backend->iface.get_name == ggml_backend_sycl_name;
15107
  }
15108
 
15109
  static ggml_backend_t ggml_backend_reg_sycl_init(const char * params, void * user_data) {
 
15078
  /* .supports_op = */ ggml_backend_sycl_supports_op,
15079
  };
15080
 
15081
+ static ggml_guid_t ggml_backend_sycl_guid() {
15082
+ static ggml_guid guid = { 0x58, 0x05, 0x13, 0x8f, 0xcd, 0x3a, 0x61, 0x9d, 0xe7, 0xcd, 0x98, 0xa9, 0x03, 0xfd, 0x7c, 0x53 };
15083
+ return &guid;
15084
+ }
15085
+
15086
  ggml_backend_t ggml_backend_sycl_init(int device) {
15087
  ggml_init_sycl(); // TODO: remove from ggml.c
15088
 
 
15100
  };
15101
 
15102
  ggml_backend_t sycl_backend = new ggml_backend {
15103
+ /* .guid = */ ggml_backend_sycl_guid(),
15104
  /* .interface = */ ggml_backend_sycl_interface,
15105
  /* .context = */ ctx
15106
  };
 
15109
  }
15110
 
15111
  bool ggml_backend_is_sycl(ggml_backend_t backend) {
15112
+ return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_sycl_guid());
15113
  }
15114
 
15115
  static ggml_backend_t ggml_backend_reg_sycl_init(const char * params, void * user_data) {
ggml-vulkan.cpp CHANGED
@@ -5244,6 +5244,11 @@ static ggml_backend_i ggml_backend_vk_interface = {
5244
  /* .supports_op = */ ggml_backend_vk_supports_op,
5245
  };
5246
 
 
 
 
 
 
5247
  GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
5248
  if (vk_instance.initialized[idx]) {
5249
  return vk_instance.backends[idx];
@@ -5262,6 +5267,7 @@ GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
5262
  vk_instance.initialized[idx] = true;
5263
 
5264
  ggml_backend_t vk_backend = new ggml_backend {
 
5265
  /* .interface = */ ggml_backend_vk_interface,
5266
  /* .context = */ &vk_instance.contexts[ctx->idx],
5267
  };
@@ -5272,7 +5278,7 @@ GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
5272
  }
5273
 
5274
  GGML_CALL bool ggml_backend_is_vk(ggml_backend_t backend) {
5275
- return backend && backend->iface.get_name == ggml_backend_vk_name;
5276
  }
5277
 
5278
  GGML_CALL int ggml_backend_vk_get_device_count() {
 
5244
  /* .supports_op = */ ggml_backend_vk_supports_op,
5245
  };
5246
 
5247
+ static ggml_guid_t ggml_backend_vk_guid() {
5248
+ static ggml_guid guid = { 0xb8, 0xf7, 0x4f, 0x86, 0x40, 0x3c, 0xe1, 0x02, 0x91, 0xc8, 0xdd, 0xe9, 0x02, 0x3f, 0xc0, 0x2b };
5249
+ return &guid;
5250
+ }
5251
+
5252
  GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
5253
  if (vk_instance.initialized[idx]) {
5254
  return vk_instance.backends[idx];
 
5267
  vk_instance.initialized[idx] = true;
5268
 
5269
  ggml_backend_t vk_backend = new ggml_backend {
5270
+ /* .guid = */ ggml_backend_vk_guid(),
5271
  /* .interface = */ ggml_backend_vk_interface,
5272
  /* .context = */ &vk_instance.contexts[ctx->idx],
5273
  };
 
5278
  }
5279
 
5280
  GGML_CALL bool ggml_backend_is_vk(ggml_backend_t backend) {
5281
+ return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_vk_guid());
5282
  }
5283
 
5284
  GGML_CALL int ggml_backend_vk_get_device_count() {
ggml.c CHANGED
@@ -355,6 +355,10 @@ void ggml_fp32_to_fp16_row(const float * x, ggml_fp16_t * y, int n) {
355
  }
356
  }
357
 
 
 
 
 
358
  //
359
  // timing
360
  //
 
355
  }
356
  }
357
 
358
+ bool ggml_guid_matches(ggml_guid_t guid_a, ggml_guid_t guid_b) {
359
+ return memcmp(guid_a, guid_b, sizeof(ggml_guid)) == 0;
360
+ }
361
+
362
  //
363
  // timing
364
  //
ggml.h CHANGED
@@ -666,6 +666,16 @@ extern "C" {
666
  GGML_NUMA_STRATEGY_COUNT
667
  };
668
 
 
 
 
 
 
 
 
 
 
 
669
  // misc
670
 
671
  GGML_API void ggml_time_init(void); // call this once at the beginning of the program
 
666
  GGML_NUMA_STRATEGY_COUNT
667
  };
668
 
669
+ //
670
+ // GUID
671
+ //
672
+
673
+ // GUID types
674
+ typedef uint8_t ggml_guid[16];
675
+ typedef ggml_guid * ggml_guid_t;
676
+
677
+ GGML_API bool ggml_guid_matches(ggml_guid_t guid_a, ggml_guid_t guid_b);
678
+
679
  // misc
680
 
681
  GGML_API void ggml_time_init(void); // call this once at the beginning of the program