Skip to content

Commit 5f70671

Browse files
uextmslaren
authored andcommitted
Introduce backend GUIDs (ggml/743)
* Introduce backend GUIDs Initial proposed implementation of backend GUIDs (Discussed in ggml-org/ggml#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]>
1 parent a693bea commit 5f70671

File tree

10 files changed

+66
-8
lines changed

10 files changed

+66
-8
lines changed

ggml-backend-impl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ extern "C" {
104104
};
105105

106106
struct ggml_backend {
107+
ggml_guid_t guid;
108+
107109
struct ggml_backend_i iface;
108110

109111
ggml_backend_context_t context;

ggml-backend.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
#define MAX(a, b) ((a) > (b) ? (a) : (b))
1414

15-
1615
// backend buffer type
1716

1817
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
159158

160159
// backend
161160

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+
162168
const char * ggml_backend_name(ggml_backend_t backend) {
163169
if (backend == NULL) {
164170
return "NULL";
@@ -781,6 +787,11 @@ static struct ggml_backend_i cpu_backend_i = {
781787
/* .supports_op = */ ggml_backend_cpu_supports_op,
782788
};
783789

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+
784795
ggml_backend_t ggml_backend_cpu_init(void) {
785796
struct ggml_backend_cpu_context * ctx = malloc(sizeof(struct ggml_backend_cpu_context));
786797
if (ctx == NULL) {
@@ -800,14 +811,15 @@ ggml_backend_t ggml_backend_cpu_init(void) {
800811
}
801812

802813
*cpu_backend = (struct ggml_backend) {
814+
/* .guid = */ ggml_backend_cpu_guid(),
803815
/* .interface = */ cpu_backend_i,
804816
/* .context = */ ctx
805817
};
806818
return cpu_backend;
807819
}
808820

809821
GGML_CALL bool ggml_backend_is_cpu(ggml_backend_t backend) {
810-
return backend && backend->iface.get_name == ggml_backend_cpu_name;
822+
return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_cpu_guid());
811823
}
812824

813825
void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads) {

ggml-backend.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ extern "C" {
4949
// Backend
5050
//
5151

52-
52+
GGML_API ggml_guid_t ggml_backend_guid(ggml_backend_t backend);
5353
GGML_API const char * ggml_backend_name(ggml_backend_t backend);
5454
GGML_API void ggml_backend_free(ggml_backend_t backend);
5555

ggml-cuda.cu

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12277,6 +12277,11 @@ static ggml_backend_i ggml_backend_cuda_interface = {
1227712277
/* .supports_op = */ ggml_backend_cuda_supports_op,
1227812278
};
1227912279

12280+
static ggml_guid_t ggml_backend_cuda_guid() {
12281+
static ggml_guid guid = { 0x2c, 0xdd, 0xe8, 0x1c, 0x65, 0xb3, 0x65, 0x73, 0x6a, 0x12, 0x88, 0x61, 0x1c, 0xc9, 0xdc, 0x25 };
12282+
return &guid;
12283+
}
12284+
1228012285
GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
1228112286
ggml_init_cublas(); // TODO: remove from ggml.c
1228212287

@@ -12294,6 +12299,7 @@ GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
1229412299
};
1229512300

1229612301
ggml_backend_t cuda_backend = new ggml_backend {
12302+
/* .guid = */ ggml_backend_cuda_guid(),
1229712303
/* .interface = */ ggml_backend_cuda_interface,
1229812304
/* .context = */ ctx
1229912305
};
@@ -12302,7 +12308,7 @@ GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
1230212308
}
1230312309

1230412310
GGML_CALL bool ggml_backend_is_cuda(ggml_backend_t backend) {
12305-
return backend && backend->iface.get_name == ggml_backend_cuda_name;
12311+
return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_cuda_guid());
1230612312
}
1230712313

1230812314
GGML_CALL int ggml_backend_cuda_get_device_count() {

ggml-kompute.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1953,11 +1953,17 @@ static struct ggml_backend_i kompute_backend_i = {
19531953
/* .supports_op = */ ggml_backend_kompute_supports_op,
19541954
};
19551955

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+
19561961
ggml_backend_t ggml_backend_kompute_init(int device) {
19571962
GGML_ASSERT(s_kompute_context == nullptr);
19581963
s_kompute_context = new ggml_kompute_context(device);
19591964

19601965
ggml_backend_t kompute_backend = new ggml_backend {
1966+
/* .guid = */ ggml_backend_kompute_guid(),
19611967
/* .interface = */ kompute_backend_i,
19621968
/* .context = */ s_kompute_context,
19631969
};
@@ -1966,7 +1972,7 @@ ggml_backend_t ggml_backend_kompute_init(int device) {
19661972
}
19671973

19681974
bool ggml_backend_is_kompute(ggml_backend_t backend) {
1969-
return backend && backend->iface.get_name == ggml_backend_kompute_name;
1975+
return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_kompute_guid());
19701976
}
19711977

19721978
static ggml_backend_t ggml_backend_reg_kompute_init(const char * params, void * user_data) {

ggml-metal.m

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2771,6 +2771,11 @@ void ggml_backend_metal_log_set_callback(ggml_log_callback log_callback, void *
27712771
ggml_metal_log_user_data = user_data;
27722772
}
27732773

2774+
static ggml_guid_t ggml_backend_metal_guid(void) {
2775+
static ggml_guid guid = { 0x81, 0xa1, 0x8b, 0x1e, 0x71, 0xec, 0x79, 0xed, 0x2b, 0x85, 0xdc, 0x8a, 0x61, 0x98, 0x30, 0xe6 };
2776+
return &guid;
2777+
}
2778+
27742779
ggml_backend_t ggml_backend_metal_init(void) {
27752780
struct ggml_metal_context * ctx = ggml_metal_init(GGML_DEFAULT_N_THREADS);
27762781

@@ -2781,6 +2786,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
27812786
ggml_backend_t metal_backend = malloc(sizeof(struct ggml_backend));
27822787

27832788
*metal_backend = (struct ggml_backend) {
2789+
/* .guid = */ ggml_backend_metal_guid(),
27842790
/* .interface = */ ggml_backend_metal_i,
27852791
/* .context = */ ctx,
27862792
};
@@ -2789,7 +2795,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
27892795
}
27902796

27912797
bool ggml_backend_is_metal(ggml_backend_t backend) {
2792-
return backend && backend->iface.get_name == ggml_backend_metal_name;
2798+
return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_metal_guid());
27932799
}
27942800

27952801
void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) {

ggml-sycl.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15162,6 +15162,11 @@ static ggml_backend_i ggml_backend_sycl_interface = {
1516215162
/* .supports_op = */ ggml_backend_sycl_supports_op,
1516315163
};
1516415164

15165+
static ggml_guid_t ggml_backend_sycl_guid() {
15166+
static ggml_guid guid = { 0x58, 0x05, 0x13, 0x8f, 0xcd, 0x3a, 0x61, 0x9d, 0xe7, 0xcd, 0x98, 0xa9, 0x03, 0xfd, 0x7c, 0x53 };
15167+
return &guid;
15168+
}
15169+
1516515170
ggml_backend_t ggml_backend_sycl_init(int device) {
1516615171
ggml_init_sycl(); // TODO: remove from ggml.c
1516715172

@@ -15179,6 +15184,7 @@ ggml_backend_t ggml_backend_sycl_init(int device) {
1517915184
};
1518015185

1518115186
ggml_backend_t sycl_backend = new ggml_backend {
15187+
/* .guid = */ ggml_backend_sycl_guid(),
1518215188
/* .interface = */ ggml_backend_sycl_interface,
1518315189
/* .context = */ ctx
1518415190
};
@@ -15187,7 +15193,7 @@ ggml_backend_t ggml_backend_sycl_init(int device) {
1518715193
}
1518815194

1518915195
bool ggml_backend_is_sycl(ggml_backend_t backend) {
15190-
return backend->iface.get_name == ggml_backend_sycl_name;
15196+
return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_sycl_guid());
1519115197
}
1519215198

1519315199
static ggml_backend_t ggml_backend_reg_sycl_init(const char * params, void * user_data) {

ggml-vulkan.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5244,6 +5244,11 @@ static ggml_backend_i ggml_backend_vk_interface = {
52445244
/* .supports_op = */ ggml_backend_vk_supports_op,
52455245
};
52465246

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+
52475252
GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
52485253
if (vk_instance.initialized[idx]) {
52495254
return vk_instance.backends[idx];
@@ -5262,6 +5267,7 @@ GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
52625267
vk_instance.initialized[idx] = true;
52635268

52645269
ggml_backend_t vk_backend = new ggml_backend {
5270+
/* .guid = */ ggml_backend_vk_guid(),
52655271
/* .interface = */ ggml_backend_vk_interface,
52665272
/* .context = */ &vk_instance.contexts[ctx->idx],
52675273
};
@@ -5272,7 +5278,7 @@ GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
52725278
}
52735279

52745280
GGML_CALL bool ggml_backend_is_vk(ggml_backend_t backend) {
5275-
return backend && backend->iface.get_name == ggml_backend_vk_name;
5281+
return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_vk_guid());
52765282
}
52775283

52785284
GGML_CALL int ggml_backend_vk_get_device_count() {

ggml.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,10 @@ void ggml_fp32_to_fp16_row(const float * x, ggml_fp16_t * y, int n) {
355355
}
356356
}
357357

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+
358362
//
359363
// timing
360364
//

ggml.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,16 @@ extern "C" {
672672
GGML_NUMA_STRATEGY_COUNT
673673
};
674674

675+
//
676+
// GUID
677+
//
678+
679+
// GUID types
680+
typedef uint8_t ggml_guid[16];
681+
typedef ggml_guid * ggml_guid_t;
682+
683+
GGML_API bool ggml_guid_matches(ggml_guid_t guid_a, ggml_guid_t guid_b);
684+
675685
// misc
676686

677687
GGML_API void ggml_time_init(void); // call this once at the beginning of the program

0 commit comments

Comments
 (0)