Skip to content

Commit 35c9b1f

Browse files
forforever73lvyichen
andauthored
metal : add apple device id (ggml-org#23566)
Co-authored-by: lvyichen <lvyichen@stepfun.com>
1 parent 4bead4e commit 35c9b1f

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

ggml/src/ggml-metal/ggml-metal-device.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,30 @@ void ggml_metal_rsets_free(ggml_metal_rsets_t rsets);
215215
// device
216216
//
217217

218+
enum ggml_metal_device_id {
219+
GGML_METAL_DEVICE_GENERIC = 0,
220+
221+
GGML_METAL_DEVICE_M1,
222+
GGML_METAL_DEVICE_M1_PRO,
223+
GGML_METAL_DEVICE_M1_MAX,
224+
GGML_METAL_DEVICE_M1_ULTRA,
225+
GGML_METAL_DEVICE_M2,
226+
GGML_METAL_DEVICE_M2_PRO,
227+
GGML_METAL_DEVICE_M2_MAX,
228+
GGML_METAL_DEVICE_M2_ULTRA,
229+
GGML_METAL_DEVICE_M3,
230+
GGML_METAL_DEVICE_M3_PRO,
231+
GGML_METAL_DEVICE_M3_MAX,
232+
GGML_METAL_DEVICE_M3_ULTRA,
233+
GGML_METAL_DEVICE_M4,
234+
GGML_METAL_DEVICE_M4_PRO,
235+
GGML_METAL_DEVICE_M4_MAX,
236+
GGML_METAL_DEVICE_M5,
237+
GGML_METAL_DEVICE_M5_PRO,
238+
GGML_METAL_DEVICE_M5_MAX,
239+
GGML_METAL_DEVICE_M5_ULTRA,
240+
};
241+
218242
struct ggml_metal_device_props {
219243
int device;
220244
char name[128];
@@ -234,6 +258,8 @@ struct ggml_metal_device_props {
234258

235259
bool supports_gpu_family_apple7;
236260

261+
enum ggml_metal_device_id device_id;
262+
237263
int op_offload_min_batch_size;
238264
};
239265

ggml/src/ggml-metal/ggml-metal-device.m

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
631675
ggml_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

Comments
 (0)