Introduce backend GUIDs (ggml/743)

* 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 <slarengh@gmail.com>

* Fix brace style to match

Co-authored-by: slaren <slarengh@gmail.com>

* Add void to () in function signature

Co-authored-by: slaren <slarengh@gmail.com>

* 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 <slarengh@gmail.com>
This commit is contained in:
UEXTM.com 2024-02-24 11:27:36 -05:00 committed by Georgi Gerganov
parent a693bea1e6
commit 5f70671856
No known key found for this signature in database
GPG Key ID: BF970631944C16B7
10 changed files with 66 additions and 8 deletions

View File

@ -104,6 +104,8 @@ extern "C" {
}; };
struct ggml_backend { struct ggml_backend {
ggml_guid_t guid;
struct ggml_backend_i iface; struct ggml_backend_i iface;
ggml_backend_context_t context; ggml_backend_context_t context;

View File

@ -12,7 +12,6 @@
#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b))
// backend buffer type // backend buffer type
const char * ggml_backend_buft_name(ggml_backend_buffer_type_t buft) { 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
// backend // backend
ggml_guid_t ggml_backend_guid(ggml_backend_t backend) {
if (backend == NULL) {
return NULL;
}
return backend->guid;
}
const char * ggml_backend_name(ggml_backend_t backend) { const char * ggml_backend_name(ggml_backend_t backend) {
if (backend == NULL) { if (backend == NULL) {
return "NULL"; return "NULL";
@ -781,6 +787,11 @@ static struct ggml_backend_i cpu_backend_i = {
/* .supports_op = */ ggml_backend_cpu_supports_op, /* .supports_op = */ ggml_backend_cpu_supports_op,
}; };
static ggml_guid_t ggml_backend_cpu_guid(void) {
static ggml_guid guid = { 0xaa, 0x67, 0xc7, 0x43, 0x96, 0xe6, 0xa3, 0x8a, 0xe3, 0xaf, 0xea, 0x92, 0x36, 0xbc, 0xfc, 0x89 };
return &guid;
}
ggml_backend_t ggml_backend_cpu_init(void) { ggml_backend_t ggml_backend_cpu_init(void) {
struct ggml_backend_cpu_context * ctx = malloc(sizeof(struct ggml_backend_cpu_context)); struct ggml_backend_cpu_context * ctx = malloc(sizeof(struct ggml_backend_cpu_context));
if (ctx == NULL) { if (ctx == NULL) {
@ -800,6 +811,7 @@ ggml_backend_t ggml_backend_cpu_init(void) {
} }
*cpu_backend = (struct ggml_backend) { *cpu_backend = (struct ggml_backend) {
/* .guid = */ ggml_backend_cpu_guid(),
/* .interface = */ cpu_backend_i, /* .interface = */ cpu_backend_i,
/* .context = */ ctx /* .context = */ ctx
}; };
@ -807,7 +819,7 @@ ggml_backend_t ggml_backend_cpu_init(void) {
} }
GGML_CALL bool ggml_backend_is_cpu(ggml_backend_t backend) { GGML_CALL bool ggml_backend_is_cpu(ggml_backend_t backend) {
return backend && backend->iface.get_name == ggml_backend_cpu_name; return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_cpu_guid());
} }
void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads) { void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads) {

View File

@ -49,7 +49,7 @@ extern "C" {
// Backend // Backend
// //
GGML_API ggml_guid_t ggml_backend_guid(ggml_backend_t backend);
GGML_API const char * ggml_backend_name(ggml_backend_t backend); GGML_API const char * ggml_backend_name(ggml_backend_t backend);
GGML_API void ggml_backend_free(ggml_backend_t backend); GGML_API void ggml_backend_free(ggml_backend_t backend);

View File

@ -12277,6 +12277,11 @@ static ggml_backend_i ggml_backend_cuda_interface = {
/* .supports_op = */ ggml_backend_cuda_supports_op, /* .supports_op = */ ggml_backend_cuda_supports_op,
}; };
static ggml_guid_t ggml_backend_cuda_guid() {
static ggml_guid guid = { 0x2c, 0xdd, 0xe8, 0x1c, 0x65, 0xb3, 0x65, 0x73, 0x6a, 0x12, 0x88, 0x61, 0x1c, 0xc9, 0xdc, 0x25 };
return &guid;
}
GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) { GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
ggml_init_cublas(); // TODO: remove from ggml.c ggml_init_cublas(); // TODO: remove from ggml.c
@ -12294,6 +12299,7 @@ GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
}; };
ggml_backend_t cuda_backend = new ggml_backend { ggml_backend_t cuda_backend = new ggml_backend {
/* .guid = */ ggml_backend_cuda_guid(),
/* .interface = */ ggml_backend_cuda_interface, /* .interface = */ ggml_backend_cuda_interface,
/* .context = */ ctx /* .context = */ ctx
}; };
@ -12302,7 +12308,7 @@ GGML_CALL ggml_backend_t ggml_backend_cuda_init(int device) {
} }
GGML_CALL bool ggml_backend_is_cuda(ggml_backend_t backend) { GGML_CALL bool ggml_backend_is_cuda(ggml_backend_t backend) {
return backend && backend->iface.get_name == ggml_backend_cuda_name; return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_cuda_guid());
} }
GGML_CALL int ggml_backend_cuda_get_device_count() { GGML_CALL int ggml_backend_cuda_get_device_count() {

View File

@ -1953,11 +1953,17 @@ static struct ggml_backend_i kompute_backend_i = {
/* .supports_op = */ ggml_backend_kompute_supports_op, /* .supports_op = */ ggml_backend_kompute_supports_op,
}; };
static ggml_guid_t ggml_backend_kompute_guid() {
static ggml_guid guid = { 0x7b, 0x57, 0xdc, 0xaf, 0xde, 0x12, 0x1d, 0x49, 0xfb, 0x35, 0xfa, 0x9b, 0x18, 0x31, 0x1d, 0xca };
return &guid;
}
ggml_backend_t ggml_backend_kompute_init(int device) { ggml_backend_t ggml_backend_kompute_init(int device) {
GGML_ASSERT(s_kompute_context == nullptr); GGML_ASSERT(s_kompute_context == nullptr);
s_kompute_context = new ggml_kompute_context(device); s_kompute_context = new ggml_kompute_context(device);
ggml_backend_t kompute_backend = new ggml_backend { ggml_backend_t kompute_backend = new ggml_backend {
/* .guid = */ ggml_backend_kompute_guid(),
/* .interface = */ kompute_backend_i, /* .interface = */ kompute_backend_i,
/* .context = */ s_kompute_context, /* .context = */ s_kompute_context,
}; };
@ -1966,7 +1972,7 @@ ggml_backend_t ggml_backend_kompute_init(int device) {
} }
bool ggml_backend_is_kompute(ggml_backend_t backend) { bool ggml_backend_is_kompute(ggml_backend_t backend) {
return backend && backend->iface.get_name == ggml_backend_kompute_name; return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_kompute_guid());
} }
static ggml_backend_t ggml_backend_reg_kompute_init(const char * params, void * user_data) { static ggml_backend_t ggml_backend_reg_kompute_init(const char * params, void * user_data) {

View File

@ -2771,6 +2771,11 @@ void ggml_backend_metal_log_set_callback(ggml_log_callback log_callback, void *
ggml_metal_log_user_data = user_data; ggml_metal_log_user_data = user_data;
} }
static ggml_guid_t ggml_backend_metal_guid(void) {
static ggml_guid guid = { 0x81, 0xa1, 0x8b, 0x1e, 0x71, 0xec, 0x79, 0xed, 0x2b, 0x85, 0xdc, 0x8a, 0x61, 0x98, 0x30, 0xe6 };
return &guid;
}
ggml_backend_t ggml_backend_metal_init(void) { ggml_backend_t ggml_backend_metal_init(void) {
struct ggml_metal_context * ctx = ggml_metal_init(GGML_DEFAULT_N_THREADS); struct ggml_metal_context * ctx = ggml_metal_init(GGML_DEFAULT_N_THREADS);
@ -2781,6 +2786,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
ggml_backend_t metal_backend = malloc(sizeof(struct ggml_backend)); ggml_backend_t metal_backend = malloc(sizeof(struct ggml_backend));
*metal_backend = (struct ggml_backend) { *metal_backend = (struct ggml_backend) {
/* .guid = */ ggml_backend_metal_guid(),
/* .interface = */ ggml_backend_metal_i, /* .interface = */ ggml_backend_metal_i,
/* .context = */ ctx, /* .context = */ ctx,
}; };
@ -2789,7 +2795,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
} }
bool ggml_backend_is_metal(ggml_backend_t backend) { bool ggml_backend_is_metal(ggml_backend_t backend) {
return backend && backend->iface.get_name == ggml_backend_metal_name; return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_metal_guid());
} }
void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) { void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) {

View File

@ -15162,6 +15162,11 @@ static ggml_backend_i ggml_backend_sycl_interface = {
/* .supports_op = */ ggml_backend_sycl_supports_op, /* .supports_op = */ ggml_backend_sycl_supports_op,
}; };
static ggml_guid_t ggml_backend_sycl_guid() {
static ggml_guid guid = { 0x58, 0x05, 0x13, 0x8f, 0xcd, 0x3a, 0x61, 0x9d, 0xe7, 0xcd, 0x98, 0xa9, 0x03, 0xfd, 0x7c, 0x53 };
return &guid;
}
ggml_backend_t ggml_backend_sycl_init(int device) { ggml_backend_t ggml_backend_sycl_init(int device) {
ggml_init_sycl(); // TODO: remove from ggml.c ggml_init_sycl(); // TODO: remove from ggml.c
@ -15179,6 +15184,7 @@ ggml_backend_t ggml_backend_sycl_init(int device) {
}; };
ggml_backend_t sycl_backend = new ggml_backend { ggml_backend_t sycl_backend = new ggml_backend {
/* .guid = */ ggml_backend_sycl_guid(),
/* .interface = */ ggml_backend_sycl_interface, /* .interface = */ ggml_backend_sycl_interface,
/* .context = */ ctx /* .context = */ ctx
}; };
@ -15187,7 +15193,7 @@ ggml_backend_t ggml_backend_sycl_init(int device) {
} }
bool ggml_backend_is_sycl(ggml_backend_t backend) { bool ggml_backend_is_sycl(ggml_backend_t backend) {
return backend->iface.get_name == ggml_backend_sycl_name; return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_sycl_guid());
} }
static ggml_backend_t ggml_backend_reg_sycl_init(const char * params, void * user_data) { static ggml_backend_t ggml_backend_reg_sycl_init(const char * params, void * user_data) {

View File

@ -5244,6 +5244,11 @@ static ggml_backend_i ggml_backend_vk_interface = {
/* .supports_op = */ ggml_backend_vk_supports_op, /* .supports_op = */ ggml_backend_vk_supports_op,
}; };
static ggml_guid_t ggml_backend_vk_guid() {
static ggml_guid guid = { 0xb8, 0xf7, 0x4f, 0x86, 0x40, 0x3c, 0xe1, 0x02, 0x91, 0xc8, 0xdd, 0xe9, 0x02, 0x3f, 0xc0, 0x2b };
return &guid;
}
GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) { GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
if (vk_instance.initialized[idx]) { if (vk_instance.initialized[idx]) {
return vk_instance.backends[idx]; return vk_instance.backends[idx];
@ -5262,6 +5267,7 @@ GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
vk_instance.initialized[idx] = true; vk_instance.initialized[idx] = true;
ggml_backend_t vk_backend = new ggml_backend { ggml_backend_t vk_backend = new ggml_backend {
/* .guid = */ ggml_backend_vk_guid(),
/* .interface = */ ggml_backend_vk_interface, /* .interface = */ ggml_backend_vk_interface,
/* .context = */ &vk_instance.contexts[ctx->idx], /* .context = */ &vk_instance.contexts[ctx->idx],
}; };
@ -5272,7 +5278,7 @@ GGML_CALL ggml_backend_t ggml_backend_vk_init(size_t idx) {
} }
GGML_CALL bool ggml_backend_is_vk(ggml_backend_t backend) { GGML_CALL bool ggml_backend_is_vk(ggml_backend_t backend) {
return backend && backend->iface.get_name == ggml_backend_vk_name; return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_vk_guid());
} }
GGML_CALL int ggml_backend_vk_get_device_count() { GGML_CALL int ggml_backend_vk_get_device_count() {

4
ggml.c
View File

@ -355,6 +355,10 @@ void ggml_fp32_to_fp16_row(const float * x, ggml_fp16_t * y, int n) {
} }
} }
bool ggml_guid_matches(ggml_guid_t guid_a, ggml_guid_t guid_b) {
return memcmp(guid_a, guid_b, sizeof(ggml_guid)) == 0;
}
// //
// timing // timing
// //

10
ggml.h
View File

@ -672,6 +672,16 @@ extern "C" {
GGML_NUMA_STRATEGY_COUNT GGML_NUMA_STRATEGY_COUNT
}; };
//
// GUID
//
// GUID types
typedef uint8_t ggml_guid[16];
typedef ggml_guid * ggml_guid_t;
GGML_API bool ggml_guid_matches(ggml_guid_t guid_a, ggml_guid_t guid_b);
// misc // misc
GGML_API void ggml_time_init(void); // call this once at the beginning of the program GGML_API void ggml_time_init(void); // call this once at the beginning of the program