diff --git a/ggml-metal.h b/ggml-metal.h index 14ab5029c..bf52d9cd3 100644 --- a/ggml-metal.h +++ b/ggml-metal.h @@ -98,9 +98,13 @@ GGML_API ggml_backend_t ggml_backend_metal_init(void); GGML_API bool ggml_backend_is_metal(ggml_backend_t backend); +GGML_API void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb); GGML_API ggml_backend_buffer_type_t ggml_backend_metal_buffer_type(void); -GGML_API void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb); +// helper to check if the device supports a specific family +// ideally, the user code should be doing these checks +// ref: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf +GGML_API bool ggml_backend_metal_supports_family(ggml_backend_t backend, int family); #ifdef __cplusplus } diff --git a/ggml-metal.m b/ggml-metal.m index 4ef970572..90bbdffd8 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -2092,6 +2092,14 @@ void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) { ggml_metal_set_n_cb(ctx, n_cb); } +bool ggml_backend_metal_supports_family(ggml_backend_t backend, int family) { + GGML_UNUSED(ggml_backend_is_metal(backend)); + + struct ggml_metal_context * ctx = (struct ggml_metal_context *)backend->context; + + return [ctx->device supportsFamily:(MTLGPUFamilyApple1 + family - 1)]; +} + ggml_backend_t ggml_backend_reg_metal_init(const char * params, void * user_data); // silence warning ggml_backend_t ggml_backend_reg_metal_init(const char * params, void * user_data) {