@@ -241,18 +241,45 @@ void ggml_backend_tensor_copy(struct ggml_tensor * src, struct ggml_tensor * dst
241
241
242
242
// backend registry
243
243
244
+ #define GGML_MAX_BACKENDS_REG 16
245
+
244
246
struct ggml_backend_reg {
245
247
char name [128 ];
246
248
ggml_backend_init_fn init_fn ;
247
249
ggml_backend_buffer_type_t default_buffer_type ;
248
250
void * user_data ;
249
251
};
250
252
251
- #define GGML_MAX_BACKENDS_REG 16
252
253
static struct ggml_backend_reg ggml_backend_registry [GGML_MAX_BACKENDS_REG ];
253
254
static size_t ggml_backend_registry_count = 0 ;
254
255
255
- size_t ggml_backend_register (const char * name , ggml_backend_init_fn init_fn , ggml_backend_buffer_type_t default_buffer_type , void * user_data ) {
256
+ static ggml_backend_t ggml_backend_reg_cpu_init (const char * params , void * user_data );
257
+
258
+ static void ggml_backend_registry_init (void ) {
259
+ static bool initialized = false;
260
+
261
+ if (initialized ) {
262
+ return ;
263
+ }
264
+
265
+ initialized = true;
266
+
267
+ ggml_backend_register ("CPU" , ggml_backend_reg_cpu_init , ggml_backend_cpu_buffer_type (), NULL );
268
+
269
+ // add forward decls here to avoid including the backend headers
270
+ #ifdef GGML_USE_CUBLAS
271
+ extern void ggml_backend_cuda_reg_devices (void );
272
+ ggml_backend_cuda_reg_devices ();
273
+ #endif
274
+
275
+ #ifdef GGML_USE_METAL
276
+ extern ggml_backend_t ggml_backend_reg_metal_init (const char * params , void * user_data );
277
+ extern ggml_backend_buffer_type_t ggml_backend_metal_buffer_type (void );
278
+ ggml_backend_register ("Metal" , ggml_backend_reg_metal_init , ggml_backend_metal_buffer_type (), NULL );
279
+ #endif
280
+ }
281
+
282
+ void ggml_backend_register (const char * name , ggml_backend_init_fn init_fn , ggml_backend_buffer_type_t default_buffer_type , void * user_data ) {
256
283
GGML_ASSERT (ggml_backend_registry_count < GGML_MAX_BACKENDS_REG );
257
284
258
285
int id = ggml_backend_registry_count ;
@@ -271,15 +298,17 @@ size_t ggml_backend_register(const char * name, ggml_backend_init_fn init_fn, gg
271
298
#endif
272
299
273
300
ggml_backend_registry_count ++ ;
274
- return ggml_backend_registry_count - 1 ;
275
301
}
276
302
277
-
278
303
size_t ggml_backend_reg_get_count (void ) {
304
+ ggml_backend_registry_init ();
305
+
279
306
return ggml_backend_registry_count ;
280
307
}
281
308
282
309
size_t ggml_backend_reg_find_by_name (const char * name ) {
310
+ ggml_backend_registry_init ();
311
+
283
312
for (size_t i = 0 ; i < ggml_backend_registry_count ; i ++ ) {
284
313
// TODO: case insensitive in a portable way
285
314
if (strcmp (ggml_backend_registry [i ].name , name ) == 0 ) {
@@ -291,6 +320,8 @@ size_t ggml_backend_reg_find_by_name(const char * name) {
291
320
292
321
// init from backend:params string
293
322
ggml_backend_t ggml_backend_reg_init_backend_from_str (const char * backend_str ) {
323
+ ggml_backend_registry_init ();
324
+
294
325
const char * params = strchr (backend_str , ':' );
295
326
char backend_name [128 ];
296
327
if (params == NULL ) {
@@ -312,21 +343,29 @@ ggml_backend_t ggml_backend_reg_init_backend_from_str(const char * backend_str)
312
343
}
313
344
314
345
const char * ggml_backend_reg_get_name (size_t i ) {
346
+ ggml_backend_registry_init ();
347
+
315
348
GGML_ASSERT (i < ggml_backend_registry_count );
316
349
return ggml_backend_registry [i ].name ;
317
350
}
318
351
319
352
ggml_backend_t ggml_backend_reg_init_backend (size_t i , const char * params ) {
353
+ ggml_backend_registry_init ();
354
+
320
355
GGML_ASSERT (i < ggml_backend_registry_count );
321
356
return ggml_backend_registry [i ].init_fn (params , ggml_backend_registry [i ].user_data );
322
357
}
323
358
324
359
ggml_backend_buffer_type_t ggml_backend_reg_get_default_buffer_type (size_t i ) {
360
+ ggml_backend_registry_init ();
361
+
325
362
GGML_ASSERT (i < ggml_backend_registry_count );
326
363
return ggml_backend_registry [i ].default_buffer_type ;
327
364
}
328
365
329
366
ggml_backend_buffer_t ggml_backend_reg_alloc_buffer (size_t i , size_t size ) {
367
+ ggml_backend_registry_init ();
368
+
330
369
GGML_ASSERT (i < ggml_backend_registry_count );
331
370
return ggml_backend_buft_alloc_buffer (ggml_backend_registry [i ].default_buffer_type , size );
332
371
}
@@ -569,7 +608,6 @@ static ggml_backend_t ggml_backend_reg_cpu_init(const char * params, void * user
569
608
GGML_UNUSED (user_data );
570
609
}
571
610
572
- GGML_BACKEND_REGISTER ("CPU" , ggml_backend_reg_cpu_init , ggml_backend_cpu_buffer_type (), NULL )
573
611
574
612
// scheduler
575
613
0 commit comments