summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJhen-Jie Hong <iainst0409@gmail.com>2023-10-07 03:40:27 -0500
committerGitHub <noreply@github.com>2023-10-07 11:40:27 +0300
commitc26765a0a148b47e5b541df32438c3ad2a0a8314 (patch)
tree3bc81aee4e5f3f38c39dfbdf97c0cd0651296015
parent0e797c2fc571b866090f7d60ac7d39d8533593f2 (diff)
metal : support default.metallib load & reuse code for swift package (#3522)
* metal : support load default.metallib & reuse code for swift package * metal : use SWIFT_PACKAGE def instead of define GGML_SWIFT
-rw-r--r--.gitignore1
-rw-r--r--Package.swift8
-rw-r--r--ggml-metal.m68
3 files changed, 35 insertions, 42 deletions
diff --git a/.gitignore b/.gitignore
index 4d5767d2..420e0d6d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@
*.gcno
*.gcda
*.dot
+*.metallib
.DS_Store
.build/
.cache/
diff --git a/Package.swift b/Package.swift
index 3ee3b2a2..1ea414cc 100644
--- a/Package.swift
+++ b/Package.swift
@@ -10,15 +10,18 @@ let platforms: [SupportedPlatform]? = [
.tvOS(.v14)
]
let exclude: [String] = []
-let additionalSources: [String] = ["ggml-metal.m", "ggml-metal.metal"]
+let resources: [Resource] = [
+ .process("ggml-metal.metal")
+]
+let additionalSources: [String] = ["ggml-metal.m"]
let additionalSettings: [CSetting] = [
.unsafeFlags(["-fno-objc-arc"]),
- .define("GGML_SWIFT"),
.define("GGML_USE_METAL")
]
#else
let platforms: [SupportedPlatform]? = nil
let exclude: [String] = ["ggml-metal.metal"]
+let resources: [Resource] = []
let additionalSources: [String] = []
let additionalSettings: [CSetting] = []
#endif
@@ -40,6 +43,7 @@ let package = Package(
"ggml-alloc.c",
"k_quants.c",
] + additionalSources,
+ resources: resources,
publicHeadersPath: "spm-headers",
cSettings: [
.unsafeFlags(["-Wno-shorten-64-to-32"]),
diff --git a/ggml-metal.m b/ggml-metal.m
index c7fb8905..f8fa05dd 100644
--- a/ggml-metal.m
+++ b/ggml-metal.m
@@ -185,56 +185,44 @@ struct ggml_metal_context * ggml_metal_init(int n_cb) {
ctx->d_queue = dispatch_queue_create("ggml-metal", DISPATCH_QUEUE_CONCURRENT);
-#ifdef GGML_SWIFT
- // load the default.metallib file
+ // load library
{
- NSError * error = nil;
-
- NSBundle * bundle = [NSBundle bundleForClass:[GGMLMetalClass class]];
- NSString * llamaBundlePath = [bundle pathForResource:@"llama_llama" ofType:@"bundle"];
- NSBundle * llamaBundle = [NSBundle bundleWithPath:llamaBundlePath];
- NSString * libPath = [llamaBundle pathForResource:@"default" ofType:@"metallib"];
- NSURL * libURL = [NSURL fileURLWithPath:libPath];
-
- // Load the metallib file into a Metal library
- ctx->library = [ctx->device newLibraryWithURL:libURL error:&error];
-
- if (error) {
- GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]);
- return NULL;
- }
- }
+ NSBundle * bundle = nil;
+#ifdef SWIFT_PACKAGE
+ bundle = SWIFTPM_MODULE_BUNDLE;
#else
- UNUSED(msl_library_source);
-
- // read the source from "ggml-metal.metal" into a string and use newLibraryWithSource
- {
+ bundle = [NSBundle bundleForClass:[GGMLMetalClass class]];
+#endif
NSError * error = nil;
+ NSString * libPath = [bundle pathForResource:@"default" ofType:@"metallib"];
+ if (libPath != nil) {
+ NSURL * libURL = [NSURL fileURLWithPath:libPath];
+ GGML_METAL_LOG_INFO("%s: loading '%s'\n", __func__, [libPath UTF8String]);
+ ctx->library = [ctx->device newLibraryWithURL:libURL error:&error];
+ } else {
+ GGML_METAL_LOG_INFO("%s: default.metallib not found, loading from source\n", __func__);
+
+ NSString * sourcePath = [bundle pathForResource:@"ggml-metal" ofType:@"metal"];
+ GGML_METAL_LOG_INFO("%s: loading '%s'\n", __func__, [sourcePath UTF8String]);
+ NSString * src = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:&error];
+ if (error) {
+ GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]);
+ return NULL;
+ }
- //NSString * path = [[NSBundle mainBundle] pathForResource:@"../../examples/metal/metal" ofType:@"metal"];
- NSBundle * bundle = [NSBundle bundleForClass:[GGMLMetalClass class]];
- NSString * path = [bundle pathForResource:@"ggml-metal" ofType:@"metal"];
- GGML_METAL_LOG_INFO("%s: loading '%s'\n", __func__, [path UTF8String]);
-
- NSString * src = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
- if (error) {
- GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]);
- return NULL;
- }
-
+ MTLCompileOptions* options = nil;
#ifdef GGML_QKK_64
- MTLCompileOptions* options = [MTLCompileOptions new];
- options.preprocessorMacros = @{ @"QK_K" : @(64) };
- ctx->library = [ctx->device newLibraryWithSource:src options:options error:&error];
-#else
- ctx->library = [ctx->device newLibraryWithSource:src options:nil error:&error];
+ options = [MTLCompileOptions new];
+ options.preprocessorMacros = @{ @"QK_K" : @(64) };
#endif
+ ctx->library = [ctx->device newLibraryWithSource:src options:options error:&error];
+ }
+
if (error) {
GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]);
return NULL;
}
}
-#endif
// load kernels
{
@@ -437,7 +425,7 @@ static id<MTLBuffer> ggml_metal_get_buffer(struct ggml_metal_context * ctx, stru
for (int i = 0; i < ctx->n_buffers; ++i) {
const int64_t ioffs = (int64_t) t->data - (int64_t) ctx->buffers[i].data;
- //metal_printf("ioffs = %10ld, tsize = %10ld, sum = %10ld, ctx->buffers[%d].size = %10ld, name = %s\n", ioffs, tsize, ioffs + tsize, i, ctx->buffers[i].size, ctx->buffers[i].name);
+ //GGML_METAL_LOG_INFO("ioffs = %10ld, tsize = %10ld, sum = %10ld, ctx->buffers[%d].size = %10ld, name = %s\n", ioffs, tsize, ioffs + tsize, i, ctx->buffers[i].size, ctx->buffers[i].name);
if (ioffs >= 0 && ioffs + tsize <= (int64_t) ctx->buffers[i].size) {
*offs = (size_t) ioffs;