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
};
@@ -776,6 +783,8 @@ static void ggml_metal_free(struct ggml_backend_metal_context * ctx) {
776
783
}
777
784
778
785
static bool ggml_metal_supports_op (const struct ggml_backend_metal_context * ctx, const struct ggml_tensor * op) {
786
+ GGML_UNUSED (ctx);
787
+
779
788
for (size_t i = 0 , n = 3 ; i < n; ++i) {
780
789
if (op->src [i] != NULL && op->src [i]->type == GGML_TYPE_BF16) {
781
790
return false ;
@@ -3338,15 +3347,13 @@ ggml_backend_buffer_type_t ggml_backend_metal_buffer_type(void) {
3338
3347
/* .get_alloc_size = */ NULL , // defaults to ggml_nbytes
3339
3348
/* .is_host = */ ggml_backend_metal_buffer_type_is_host,
3340
3349
},
3341
- /* .device = */ NULL ,
3350
+ /* .device = */ &g_ggml_backend_metal_device ,
3342
3351
/* .context = */ NULL ,
3343
3352
};
3344
3353
3345
3354
return &ggml_backend_buffer_type_metal;
3346
3355
}
3347
3356
3348
- // buffer from ptr
3349
-
3350
3357
ggml_backend_buffer_t ggml_backend_metal_buffer_from_ptr (void * data, size_t size, size_t max_size) {
3351
3358
struct ggml_backend_metal_buffer_context * ctx = malloc (sizeof (struct ggml_backend_metal_buffer_context));
3352
3359
@@ -3507,7 +3514,7 @@ ggml_backend_t ggml_backend_metal_init(void) {
3507
3514
*backend = (struct ggml_backend) {
3508
3515
/* .guid = */ ggml_backend_metal_guid (),
3509
3516
/* .interface = */ ggml_backend_metal_i,
3510
- /* .device = */ ggml_backend_reg_dev_get ( ggml_backend_metal_reg (), 0 ) ,
3517
+ /* .device = */ &g_ggml_backend_metal_device ,
3511
3518
/* .context = */ ctx,
3512
3519
};
3513
3520
@@ -3544,7 +3551,7 @@ void ggml_backend_metal_capture_next_compute(ggml_backend_t backend) {
3544
3551
ctx->capture_next_compute = true ;
3545
3552
}
3546
3553
3547
- // //////////////////////
3554
+ // backend device
3548
3555
3549
3556
static const char * ggml_backend_metal_device_get_name (ggml_backend_dev_t dev) {
3550
3557
return " Metal" ;
@@ -3638,7 +3645,13 @@ static bool ggml_backend_metal_device_supports_buft(ggml_backend_dev_t dev, ggml
3638
3645
/* .event_synchronize = */ NULL ,
3639
3646
};
3640
3647
3641
- // //////////////////////
3648
+ // backend registry
3649
+
3650
+ static struct ggml_backend_device g_ggml_backend_metal_device = (struct ggml_backend_device) {
3651
+ /* .iface = */ ggml_backend_metal_device_i,
3652
+ /* .reg = */ &g_ggml_backend_metal_reg,
3653
+ /* .context = */ NULL ,
3654
+ };
3642
3655
3643
3656
static const char * ggml_backend_metal_reg_name (ggml_backend_reg_t reg) {
3644
3657
return " Metal" ;
@@ -3655,34 +3668,24 @@ static size_t ggml_backend_metal_reg_device_count(ggml_backend_reg_t reg) {
3655
3668
static ggml_backend_dev_t ggml_backend_metal_reg_device_get (ggml_backend_reg_t reg, size_t index) {
3656
3669
GGML_ASSERT (index == 0 );
3657
3670
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;
3671
+ return &g_ggml_backend_metal_device;
3668
3672
3669
3673
GGML_UNUSED (reg);
3670
3674
GGML_UNUSED (index);
3671
3675
}
3672
3676
3673
- const struct ggml_backend_reg_i ggml_backend_metal_reg_i = {
3677
+ static const struct ggml_backend_reg_i ggml_backend_metal_reg_i = {
3674
3678
/* .get_name = */ ggml_backend_metal_reg_name,
3675
3679
/* .device_count = */ ggml_backend_metal_reg_device_count,
3676
3680
/* .device_get = */ ggml_backend_metal_reg_device_get,
3677
3681
/* .get_proc_address = */ NULL ,
3678
3682
};
3679
3683
3680
- 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
- };
3684
+ static struct ggml_backend_reg g_ggml_backend_metal_reg = {
3685
+ /* .iface = */ ggml_backend_metal_reg_i,
3686
+ /* .context = */ NULL ,
3687
+ };
3685
3688
3686
- return &ggml_backend_metal_reg;
3689
+ ggml_backend_reg_t ggml_backend_metal_reg (void ) {
3690
+ return &g_ggml_backend_metal_reg;
3687
3691
}
3688
-
0 commit comments