|
|
@@ -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;
|
|
|
|