option(WHISPER_METAL_NDEBUG "whisper: disable Metal debugging" OFF)
option(WHISPER_COREML "whisper: enable Core ML framework" OFF)
option(WHISPER_COREML_ALLOW_FALLBACK "whisper: allow non-CoreML fallback" OFF)
+ option(WHISPER_METAL_EMBED_LIBRARY "whisper: embed Metal library" OFF)
else()
option(WHISPER_BLAS "whisper: use BLAS libraries" OFF)
option(WHISPER_BLAS_VENDOR "whisper: BLAS library vendor" Generic)
# copy ggml-metal.metal to bin directory
configure_file(ggml-metal.metal bin/ggml-metal.metal COPYONLY)
+
+ if (WHISPER_METAL_EMBED_LIBRARY)
+ enable_language(ASM)
+ set(WHISPER_EXTRA_FLAGS ${WHISPER_EXTRA_FLAGS} -DGGML_METAL_EMBED_LIBRARY)
+
+ set(METALLIB_SOURCE "${CMAKE_SOURCE_DIR}/ggml-metal.metal")
+
+ file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/autogenerated")
+ set(EMBED_METALLIB_ASSEMBLY "${CMAKE_BINARY_DIR}/autogenerated/ggml-embed-metallib.s")
+
+ add_custom_command(
+ OUTPUT ${EMBED_METALLIB_ASSEMBLY}
+ COMMAND echo ".section __DATA,__ggml_metallib" > ${EMBED_METALLIB_ASSEMBLY}
+ COMMAND echo ".globl _ggml_metallib_start" >> ${EMBED_METALLIB_ASSEMBLY}
+ COMMAND echo "_ggml_metallib_start:" >> ${EMBED_METALLIB_ASSEMBLY}
+ COMMAND echo ".incbin \\\"${METALLIB_SOURCE}\\\"" >> ${EMBED_METALLIB_ASSEMBLY}
+ COMMAND echo ".globl _ggml_metallib_end" >> ${EMBED_METALLIB_ASSEMBLY}
+ COMMAND echo "_ggml_metallib_end:" >> ${EMBED_METALLIB_ASSEMBLY}
+ DEPENDS ${METALLIB_SOURCE}
+ COMMENT "Generate assembly for embedded Metal library"
+ )
+
+ set(GGML_SOURCES_METAL ${GGML_SOURCES_METAL} ${EMBED_METALLIB_ASSEMBLY})
+ endif()
endif()
if (WHISPER_COREML)
$(CC) $(CFLAGS) -c $< -o $@
WHISPER_OBJ += ggml-metal.o
+
+ifdef WHISPER_METAL_EMBED_LIBRARY
+CFLAGS += -DGGML_METAL_EMBED_LIBRARY
+
+ggml-metal-embed.o: ggml-metal.metal
+ @echo "Embedding Metal library"
+ $(eval TEMP_ASSEMBLY=$(shell mktemp))
+ @echo ".section __DATA, __ggml_metallib" > $(TEMP_ASSEMBLY)
+ @echo ".globl _ggml_metallib_start" >> $(TEMP_ASSEMBLY)
+ @echo "_ggml_metallib_start:" >> $(TEMP_ASSEMBLY)
+ @echo ".incbin \"$<\"" >> $(TEMP_ASSEMBLY)
+ @echo ".globl _ggml_metallib_end" >> $(TEMP_ASSEMBLY)
+ @echo "_ggml_metallib_end:" >> $(TEMP_ASSEMBLY)
+ @$(AS) $(TEMP_ASSEMBLY) -o $@
+ @rm -f ${TEMP_ASSEMBLY}
+
+WHISPER_OBJ += ggml-metal-embed.o
+endif
endif
libwhisper.a: $(WHISPER_OBJ)
return NULL;
}
} else {
+#if GGML_METAL_EMBED_LIBRARY
+ GGML_METAL_LOG_INFO("%s: using embedded metal library\n", __func__);
+
+ extern const char ggml_metallib_start[];
+ extern const char ggml_metallib_end[];
+
+ NSString * src = [[NSString alloc] initWithBytes:ggml_metallib_start length:(ggml_metallib_end-ggml_metallib_start) encoding:NSUTF8StringEncoding];
+#else
GGML_METAL_LOG_INFO("%s: default.metallib not found, loading from source\n", __func__);
NSString * sourcePath;
GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]);
return NULL;
}
+#endif
@autoreleasepool {
// dictionary of preprocessor macros