Skip to content

Commit 018edf5

Browse files
pminevmglambda
authored andcommitted
ggml : fix GGMLMetalClass ODR (ggml-org#12200)
-- it might happen if ggml is loaded from 2 separate libraries since each one of them will expose the class. This is more of a guard since we want to use only Metal as embedded library and don't care about the other case.
1 parent f171618 commit 018edf5

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

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

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -467,11 +467,13 @@ static void ggml_backend_metal_device_rel(struct ggml_backend_metal_device_conte
467467
// for now it is easier to work in a separate file
468468
// static NSString * const msl_library_source = @"see metal.metal";
469469

470+
#if !GGML_METAL_EMBED_LIBRARY
470471
// Here to assist with NSBundle Path Hack
471472
@interface GGMLMetalClass : NSObject
472473
@end
473474
@implementation GGMLMetalClass
474475
@end
476+
#endif
475477

476478
static void * ggml_metal_host_malloc(size_t n) {
477479
void * data = NULL;
@@ -520,7 +522,7 @@ @implementation GGMLMetalClass
520522

521523
ctx->d_queue = dispatch_queue_create("ggml-metal", DISPATCH_QUEUE_CONCURRENT);
522524

523-
id<MTLLibrary> metal_library;
525+
id<MTLLibrary> metal_library = nil;
524526

525527
// load library
526528
//
@@ -529,19 +531,23 @@ @implementation GGMLMetalClass
529531
// - if not found, load the source and compile it
530532
// - if that fails, return NULL
531533
{
532-
NSBundle * bundle = nil;
533-
#ifdef SWIFT_PACKAGE
534-
bundle = SWIFTPM_MODULE_BUNDLE;
535-
#else
536-
bundle = [NSBundle bundleForClass:[GGMLMetalClass class]];
537-
#endif
538-
539534
NSError * error = nil;
535+
NSString * src = nil;
540536

541537
#if GGML_METAL_EMBED_LIBRARY
542-
const bool try_metallib = false;
538+
GGML_LOG_INFO("%s: using embedded metal library\n", __func__);
539+
540+
extern const char ggml_metallib_start[];
541+
extern const char ggml_metallib_end[];
542+
543+
src = [[NSString alloc] initWithBytes:ggml_metallib_start length:(ggml_metallib_end-ggml_metallib_start) encoding:NSUTF8StringEncoding];
544+
545+
#else
546+
547+
#ifdef SWIFT_PACKAGE
548+
NSBundle * bundle = SWIFTPM_MODULE_BUNDLE;
543549
#else
544-
const bool try_metallib = true;
550+
NSBundle * bundle = [NSBundle bundleForClass:[GGMLMetalClass class]];
545551
#endif
546552

547553
NSString * path_lib = [bundle pathForResource:@"default" ofType:@"metallib"];
@@ -574,7 +580,7 @@ @implementation GGMLMetalClass
574580
path_lib = default_metallib_path;
575581
}
576582

577-
if (try_metallib && path_lib != nil) {
583+
if (path_lib != nil) {
578584
// pre-compiled library found
579585
NSURL * libURL = [NSURL fileURLWithPath:path_lib];
580586
GGML_LOG_INFO("%s: loading '%s'\n", __func__, [path_lib UTF8String]);
@@ -585,14 +591,6 @@ @implementation GGMLMetalClass
585591
return NULL;
586592
}
587593
} else {
588-
#if GGML_METAL_EMBED_LIBRARY
589-
GGML_LOG_INFO("%s: using embedded metal library\n", __func__);
590-
591-
extern const char ggml_metallib_start[];
592-
extern const char ggml_metallib_end[];
593-
594-
NSString * src = [[NSString alloc] initWithBytes:ggml_metallib_start length:(ggml_metallib_end-ggml_metallib_start) encoding:NSUTF8StringEncoding];
595-
#else
596594
GGML_LOG_INFO("%s: default.metallib not found, loading from source\n", __func__);
597595

598596
NSString * path_source;
@@ -613,13 +611,15 @@ @implementation GGMLMetalClass
613611

614612
GGML_LOG_INFO("%s: loading '%s'\n", __func__, [path_source UTF8String]);
615613

616-
NSString * src = [NSString stringWithContentsOfFile:path_source encoding:NSUTF8StringEncoding error:&error];
614+
src = [NSString stringWithContentsOfFile:path_source encoding:NSUTF8StringEncoding error:&error];
617615
if (error) {
618616
GGML_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]);
619617
return NULL;
620618
}
621-
#endif // GGML_METAL_EMBED_LIBRARY
619+
}
620+
#endif
622621

622+
if (!metal_library) {
623623
@autoreleasepool {
624624
// dictionary of preprocessor macros
625625
NSMutableDictionary * prep = [NSMutableDictionary dictionary];
@@ -647,10 +647,11 @@ @implementation GGMLMetalClass
647647
[options release];
648648
#endif
649649
}
650+
}
651+
650652
#if GGML_METAL_EMBED_LIBRARY
651-
[src release];
653+
[src release];
652654
#endif // GGML_METAL_EMBED_LIBRARY
653-
}
654655
}
655656

656657
// print MTL GPU family:

0 commit comments

Comments
 (0)