@@ -628,6 +628,50 @@ void ggml_metal_rsets_free(ggml_metal_rsets_t rsets) {
628628 free (rsets);
629629}
630630
631+ static enum ggml_metal_device_id ggml_metal_device_id_parse (const char * name) {
632+ if (!name) {
633+ return GGML_METAL_DEVICE_GENERIC ;
634+ }
635+
636+ static const char prefix[] = " Apple " ;
637+ if (strncmp (name, prefix, sizeof (prefix) - 1 ) != 0 ) {
638+ return GGML_METAL_DEVICE_GENERIC ;
639+ }
640+ const char * suffix = name + sizeof (prefix) - 1 ;
641+
642+ static const struct {
643+ const char * name;
644+ enum ggml_metal_device_id id ;
645+ } table[] = {
646+ {" M1" , GGML_METAL_DEVICE_M1 },
647+ {" M1 Pro" , GGML_METAL_DEVICE_M1_PRO },
648+ {" M1 Max" , GGML_METAL_DEVICE_M1_MAX },
649+ {" M1 Ultra" , GGML_METAL_DEVICE_M1_ULTRA },
650+ {" M2" , GGML_METAL_DEVICE_M2 },
651+ {" M2 Pro" , GGML_METAL_DEVICE_M2_PRO },
652+ {" M2 Max" , GGML_METAL_DEVICE_M2_MAX },
653+ {" M2 Ultra" , GGML_METAL_DEVICE_M2_ULTRA },
654+ {" M3" , GGML_METAL_DEVICE_M3 },
655+ {" M3 Pro" , GGML_METAL_DEVICE_M3_PRO },
656+ {" M3 Max" , GGML_METAL_DEVICE_M3_MAX },
657+ {" M3 Ultra" , GGML_METAL_DEVICE_M3_ULTRA },
658+ {" M4" , GGML_METAL_DEVICE_M4 },
659+ {" M4 Pro" , GGML_METAL_DEVICE_M4_PRO },
660+ {" M4 Max" , GGML_METAL_DEVICE_M4_MAX },
661+ {" M5" , GGML_METAL_DEVICE_M5 },
662+ {" M5 Pro" , GGML_METAL_DEVICE_M5_PRO },
663+ {" M5 Max" , GGML_METAL_DEVICE_M5_MAX },
664+ {" M5 Ultra" , GGML_METAL_DEVICE_M5_ULTRA },
665+ };
666+
667+ for (size_t i = 0 ; i < sizeof (table)/sizeof (table[0 ]); ++i) {
668+ if (strcmp (suffix, table[i].name ) == 0 ) {
669+ return table[i].id ;
670+ }
671+ }
672+ return GGML_METAL_DEVICE_GENERIC ;
673+ }
674+
631675ggml_metal_device_t ggml_metal_device_init (int device) {
632676 ggml_metal_device_t dev = calloc (1 , sizeof (struct ggml_metal_device));
633677
@@ -795,6 +839,8 @@ ggml_metal_device_t ggml_metal_device_init(int device) {
795839
796840 dev->props .supports_gpu_family_apple7 = [dev->mtl_device supportsFamily: MTLGPUFamilyApple7];
797841
842+ dev->props .device_id = ggml_metal_device_id_parse ([[dev->mtl_device name ] UTF8String ]);
843+
798844 dev->props .op_offload_min_batch_size = getenv (" GGML_OP_OFFLOAD_MIN_BATCH" ) ? atoi (getenv (" GGML_OP_OFFLOAD_MIN_BATCH" )) : 32 ;
799845
800846 dev->props .max_buffer_size = dev->mtl_device .maxBufferLength ;
0 commit comments