20
20
21
21
#define UNUSED (x ) (void )(x)
22
22
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
+
23
28
// global information about the Metal device
24
29
// note: assumes single GPU device - the default one
25
30
static struct ggml_metal_state {
@@ -61,6 +66,8 @@ static void ggml_backend_metal_free_device(void) {
61
66
}
62
67
}
63
68
69
+ // kernels
70
+
64
71
struct ggml_metal_kernel {
65
72
id <MTLComputePipelineState > pipeline;
66
73
};
@@ -3338,15 +3345,13 @@ ggml_backend_buffer_type_t ggml_backend_metal_buffer_type(void) {
3338
3345
/* .get_alloc_size = */ NULL , // defaults to ggml_nbytes
3339
3346
/* .is_host = */ ggml_backend_metal_buffer_type_is_host,
3340
3347
},
3341
- /* .device = */ NULL ,
3348
+ /* .device = */ &g_ggml_backend_metal_device ,
3342
3349
/* .context = */ NULL ,
3343
3350
};
3344
3351
3345
3352
return &ggml_backend_buffer_type_metal;
3346
3353
}
3347
3354
3348
- // buffer from ptr
3349
-
3350
3355
ggml_backend_buffer_t ggml_backend_metal_buffer_from_ptr (void * data, size_t size, size_t max_size) {
3351
3356
struct ggml_backend_metal_buffer_context * ctx = malloc (sizeof (struct ggml_backend_metal_buffer_context));
3352
3357
@@ -3507,7 +3512,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
3507
3512
*backend = (struct ggml_backend) {
3508
3513
/* .guid = */ ggml_backend_metal_guid (),
3509
3514
/* .interface = */ ggml_backend_metal_i,
3510
- /* .device = */ ggml_backend_reg_dev_get ( ggml_backend_metal_reg (), 0 ) ,
3515
+ /* .device = */ &g_ggml_backend_metal_device ,
3511
3516
/* .context = */ ctx,
3512
3517
};
3513
3518
@@ -3544,7 +3549,7 @@ void ggml_backend_metal_capture_next_compute(ggml_backend_t backend) {
3544
3549
ctx->capture_next_compute = true ;
3545
3550
}
3546
3551
3547
- // //////////////////////
3552
+ // backend device
3548
3553
3549
3554
static const char * ggml_backend_metal_device_get_name (ggml_backend_dev_t dev) {
3550
3555
return " Metal" ;
@@ -3638,7 +3643,30 @@ static bool ggml_backend_metal_device_supports_buft(ggml_backend_dev_t dev, ggml
3638
3643
/* .event_synchronize = */ NULL ,
3639
3644
};
3640
3645
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
+ };
3642
3670
3643
3671
static const char * ggml_backend_metal_reg_name (ggml_backend_reg_t reg) {
3644
3672
return " Metal" ;
@@ -3655,34 +3683,12 @@ static size_t ggml_backend_metal_reg_device_count(ggml_backend_reg_t reg) {
3655
3683
static ggml_backend_dev_t ggml_backend_metal_reg_device_get (ggml_backend_reg_t reg, size_t index) {
3656
3684
GGML_ASSERT (index == 0 );
3657
3685
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;
3668
3687
3669
3688
GGML_UNUSED (reg);
3670
3689
GGML_UNUSED (index);
3671
3690
}
3672
3691
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
-
3680
3692
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;
3687
3694
}
3688
-
0 commit comments