Spaces:
Running
Running
UEXTM.com
slaren
commited on
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]>
- ggml-backend-impl.h +2 -0
- ggml-backend.c +14 -2
- ggml-backend.h +1 -1
- ggml-cuda.cu +7 -1
- ggml-kompute.cpp +7 -1
- ggml-metal.m +7 -1
- ggml-sycl.cpp +7 -1
- ggml-vulkan.cpp +7 -1
- ggml.c +4 -0
- 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->
|
| 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->
|
| 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->
|
| 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->
|
| 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->
|
| 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->
|
| 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
|