Skip to content

Commit 058430f

Browse files
committed
metal : global registry and device instances
ggml-ci
1 parent ae9fd54 commit 058430f

File tree

1 file changed

+36
-30
lines changed

1 file changed

+36
-30
lines changed

ggml/src/ggml-metal.m

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020

2121
#define UNUSED(x) (void)(x)
2222

23+
// globals
24+
25+
static struct ggml_backend_reg g_ggml_backend_metal_reg;
26+
static struct ggml_backend_device g_ggml_backend_metal_device;
27+
2328
// global information about the Metal device
2429
// note: assumes single GPU device - the default one
2530
static struct ggml_metal_state {
@@ -61,6 +66,8 @@ static void ggml_backend_metal_free_device(void) {
6166
}
6267
}
6368

69+
// kernels
70+
6471
struct ggml_metal_kernel {
6572
id<MTLComputePipelineState> pipeline;
6673
};
@@ -3338,15 +3345,13 @@ ggml_backend_buffer_type_t ggml_backend_metal_buffer_type(void) {
33383345
/* .get_alloc_size = */ NULL, // defaults to ggml_nbytes
33393346
/* .is_host = */ ggml_backend_metal_buffer_type_is_host,
33403347
},
3341-
/* .device = */ NULL,
3348+
/* .device = */ &g_ggml_backend_metal_device,
33423349
/* .context = */ NULL,
33433350
};
33443351

33453352
return &ggml_backend_buffer_type_metal;
33463353
}
33473354

3348-
// buffer from ptr
3349-
33503355
ggml_backend_buffer_t ggml_backend_metal_buffer_from_ptr(void * data, size_t size, size_t max_size) {
33513356
struct ggml_backend_metal_buffer_context * ctx = malloc(sizeof(struct ggml_backend_metal_buffer_context));
33523357

@@ -3507,7 +3512,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
35073512
*backend = (struct ggml_backend) {
35083513
/* .guid = */ ggml_backend_metal_guid(),
35093514
/* .interface = */ ggml_backend_metal_i,
3510-
/* .device = */ ggml_backend_reg_dev_get(ggml_backend_metal_reg(), 0),
3515+
/* .device = */ &g_ggml_backend_metal_device,
35113516
/* .context = */ ctx,
35123517
};
35133518

@@ -3544,7 +3549,7 @@ void ggml_backend_metal_capture_next_compute(ggml_backend_t backend) {
35443549
ctx->capture_next_compute = true;
35453550
}
35463551

3547-
////////////////////////
3552+
// backend device
35483553

35493554
static const char * ggml_backend_metal_device_get_name(ggml_backend_dev_t dev) {
35503555
return "Metal";
@@ -3638,7 +3643,30 @@ static bool ggml_backend_metal_device_supports_buft(ggml_backend_dev_t dev, ggml
36383643
/* .event_synchronize = */ NULL,
36393644
};
36403645

3641-
////////////////////////
3646+
// backend registry
3647+
3648+
static const char * ggml_backend_metal_reg_name (ggml_backend_reg_t reg);
3649+
static size_t ggml_backend_metal_reg_device_count(ggml_backend_reg_t reg);
3650+
static ggml_backend_dev_t ggml_backend_metal_reg_device_get (ggml_backend_reg_t reg, size_t index);
3651+
3652+
static const struct ggml_backend_reg_i ggml_backend_metal_reg_i = {
3653+
/* .get_name = */ ggml_backend_metal_reg_name,
3654+
/* .device_count = */ ggml_backend_metal_reg_device_count,
3655+
/* .device_get = */ ggml_backend_metal_reg_device_get,
3656+
/* .get_proc_address = */ NULL,
3657+
};
3658+
3659+
static struct ggml_backend_reg g_ggml_backend_metal_reg = {
3660+
/* .iface = */ ggml_backend_metal_reg_i,
3661+
/* .context = */ NULL,
3662+
};
3663+
3664+
3665+
static struct ggml_backend_device g_ggml_backend_metal_device = (struct ggml_backend_device) {
3666+
/* .iface = */ ggml_backend_metal_device_i,
3667+
/* .reg = */ &g_ggml_backend_metal_reg,
3668+
/* .context = */ NULL,
3669+
};
36423670

36433671
static const char * ggml_backend_metal_reg_name(ggml_backend_reg_t reg) {
36443672
return "Metal";
@@ -3655,34 +3683,12 @@ static size_t ggml_backend_metal_reg_device_count(ggml_backend_reg_t reg) {
36553683
static ggml_backend_dev_t ggml_backend_metal_reg_device_get(ggml_backend_reg_t reg, size_t index) {
36563684
GGML_ASSERT(index == 0);
36573685

3658-
static struct ggml_backend_device ggml_backend_metal_device = (struct ggml_backend_device) {
3659-
/* .iface = */ ggml_backend_metal_device_i,
3660-
/* .reg = */ NULL,
3661-
/* .context = */ NULL,
3662-
};
3663-
3664-
// TODO: fix me (initializer element is not compile-time constant)
3665-
ggml_backend_metal_device.reg = reg;
3666-
3667-
return &ggml_backend_metal_device;
3686+
return &g_ggml_backend_metal_device;
36683687

36693688
GGML_UNUSED(reg);
36703689
GGML_UNUSED(index);
36713690
}
36723691

3673-
const struct ggml_backend_reg_i ggml_backend_metal_reg_i = {
3674-
/* .get_name = */ ggml_backend_metal_reg_name,
3675-
/* .device_count = */ ggml_backend_metal_reg_device_count,
3676-
/* .device_get = */ ggml_backend_metal_reg_device_get,
3677-
/* .get_proc_address = */ NULL,
3678-
};
3679-
36803692
ggml_backend_reg_t ggml_backend_metal_reg(void) {
3681-
static struct ggml_backend_reg ggml_backend_metal_reg = {
3682-
/* .iface = */ ggml_backend_metal_reg_i,
3683-
/* .context = */ NULL,
3684-
};
3685-
3686-
return &ggml_backend_metal_reg;
3693+
return &g_ggml_backend_metal_reg;
36873694
}
3688-

0 commit comments

Comments
 (0)