Skip to content

Commit d050bbe

Browse files
committed
ggml-backend : remove backend self-registration
1 parent ba03f9c commit d050bbe

File tree

4 files changed

+48
-41
lines changed

4 files changed

+48
-41
lines changed

ggml-backend-impl.h

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -105,36 +105,7 @@ extern "C" {
105105

106106
typedef ggml_backend_t (*ggml_backend_init_fn)(const char * params, void * user_data);
107107

108-
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);
109-
110-
111-
// Register a int function to be called at program startup
112-
#if defined(__GNUC__) || defined(__clang__)
113-
#define GGML_CONSTRUCTOR(init_fn) \
114-
static void __attribute__((constructor)) init_fn ## _ggml_constructor(void) { \
115-
init_fn(); \
116-
}
117-
#elif defined(_MSC_VER)
118-
#ifdef __cplusplus
119-
#define GGML_CONSTRUCTOR(init_fn) \
120-
static int init_fn ## _ggml_constructor_dummy = init_fn();
121-
#else
122-
#define GGML_CONSTRUCTOR(init_fn) \
123-
__pragma(section(".CRT$XCV", read)) \
124-
__declspec(allocate(".CRT$XCV")) int (*init_fn ## _ggml_constructor)(void) = init_fn; \
125-
__pragma(comment(linker, "/include:" #init_fn "_ggml_constructor"))
126-
#endif
127-
#else
128-
#error "GGML_CONSTRUCTOR not implemented for this compiler"
129-
#endif
130-
131-
132-
// Register a backend
133-
#define GGML_BACKEND_REGISTER(name, init_fn, buft, user_data) \
134-
static void init_fn ## _backend_register(void) { \
135-
ggml_backend_register(name, init_fn, buft, user_data); \
136-
} \
137-
GGML_CONSTRUCTOR(init_fn ## _backend_register)
108+
void ggml_backend_register(const char * name, ggml_backend_init_fn init_fn, ggml_backend_buffer_type_t default_buffer_type, void * user_data);
138109

139110
#ifdef __cplusplus
140111
}

ggml-backend.c

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,18 +241,45 @@ void ggml_backend_tensor_copy(struct ggml_tensor * src, struct ggml_tensor * dst
241241

242242
// backend registry
243243

244+
#define GGML_MAX_BACKENDS_REG 16
245+
244246
struct ggml_backend_reg {
245247
char name[128];
246248
ggml_backend_init_fn init_fn;
247249
ggml_backend_buffer_type_t default_buffer_type;
248250
void * user_data;
249251
};
250252

251-
#define GGML_MAX_BACKENDS_REG 16
252253
static struct ggml_backend_reg ggml_backend_registry[GGML_MAX_BACKENDS_REG];
253254
static size_t ggml_backend_registry_count = 0;
254255

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) {
256283
GGML_ASSERT(ggml_backend_registry_count < GGML_MAX_BACKENDS_REG);
257284

258285
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
271298
#endif
272299

273300
ggml_backend_registry_count++;
274-
return ggml_backend_registry_count - 1;
275301
}
276302

277-
278303
size_t ggml_backend_reg_get_count(void) {
304+
ggml_backend_registry_init();
305+
279306
return ggml_backend_registry_count;
280307
}
281308

282309
size_t ggml_backend_reg_find_by_name(const char * name) {
310+
ggml_backend_registry_init();
311+
283312
for (size_t i = 0; i < ggml_backend_registry_count; i++) {
284313
// TODO: case insensitive in a portable way
285314
if (strcmp(ggml_backend_registry[i].name, name) == 0) {
@@ -291,6 +320,8 @@ size_t ggml_backend_reg_find_by_name(const char * name) {
291320

292321
// init from backend:params string
293322
ggml_backend_t ggml_backend_reg_init_backend_from_str(const char * backend_str) {
323+
ggml_backend_registry_init();
324+
294325
const char * params = strchr(backend_str, ':');
295326
char backend_name[128];
296327
if (params == NULL) {
@@ -312,21 +343,29 @@ ggml_backend_t ggml_backend_reg_init_backend_from_str(const char * backend_str)
312343
}
313344

314345
const char * ggml_backend_reg_get_name(size_t i) {
346+
ggml_backend_registry_init();
347+
315348
GGML_ASSERT(i < ggml_backend_registry_count);
316349
return ggml_backend_registry[i].name;
317350
}
318351

319352
ggml_backend_t ggml_backend_reg_init_backend(size_t i, const char * params) {
353+
ggml_backend_registry_init();
354+
320355
GGML_ASSERT(i < ggml_backend_registry_count);
321356
return ggml_backend_registry[i].init_fn(params, ggml_backend_registry[i].user_data);
322357
}
323358

324359
ggml_backend_buffer_type_t ggml_backend_reg_get_default_buffer_type(size_t i) {
360+
ggml_backend_registry_init();
361+
325362
GGML_ASSERT(i < ggml_backend_registry_count);
326363
return ggml_backend_registry[i].default_buffer_type;
327364
}
328365

329366
ggml_backend_buffer_t ggml_backend_reg_alloc_buffer(size_t i, size_t size) {
367+
ggml_backend_registry_init();
368+
330369
GGML_ASSERT(i < ggml_backend_registry_count);
331370
return ggml_backend_buft_alloc_buffer(ggml_backend_registry[i].default_buffer_type, size);
332371
}
@@ -569,7 +608,6 @@ static ggml_backend_t ggml_backend_reg_cpu_init(const char * params, void * user
569608
GGML_UNUSED(user_data);
570609
}
571610

572-
GGML_BACKEND_REGISTER("CPU", ggml_backend_reg_cpu_init, ggml_backend_cpu_buffer_type(), NULL)
573611

574612
// scheduler
575613

ggml-cuda.cu

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9264,7 +9264,7 @@ static ggml_backend_t ggml_backend_reg_cuda_init(const char * params, void * use
92649264
UNUSED(params);
92659265
}
92669266

9267-
static int ggml_backend_cuda_reg_devices() {
9267+
extern "C" int ggml_backend_cuda_reg_devices() {
92689268
int device_count = ggml_cuda_get_device_count();
92699269
//int device_count = 1; // DEBUG: some tools require delaying CUDA initialization
92709270
for (int i = 0; i < device_count; i++) {
@@ -9274,5 +9274,3 @@ static int ggml_backend_cuda_reg_devices() {
92749274
}
92759275
return device_count;
92769276
}
9277-
9278-
GGML_CONSTRUCTOR(ggml_backend_cuda_reg_devices)

ggml-metal.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2092,11 +2092,11 @@ void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) {
20922092
ggml_metal_set_n_cb(ctx, n_cb);
20932093
}
20942094

2095-
static ggml_backend_t ggml_backend_reg_metal_init(const char * params, void * user_data) {
2095+
ggml_backend_t ggml_backend_reg_metal_init(const char * params, void * user_data); // silence warning
2096+
2097+
ggml_backend_t ggml_backend_reg_metal_init(const char * params, void * user_data) {
20962098
return ggml_backend_metal_init();
20972099

20982100
GGML_UNUSED(params);
20992101
GGML_UNUSED(user_data);
21002102
}
2101-
2102-
GGML_BACKEND_REGISTER("Metal", ggml_backend_reg_metal_init, ggml_backend_metal_buffer_type(), NULL)

0 commit comments

Comments
 (0)