option(LLAMA_METAL "llama: use Metal" ${LLAMA_METAL_DEFAULT})
option(LLAMA_METAL_NDEBUG "llama: disable Metal debugging" OFF)
option(LLAMA_METAL_SHADER_DEBUG "llama: compile Metal with -fno-fast-math" OFF)
+option(LLAMA_METAL_EMBED_LIBRARY "llama: embed Metal library" OFF)
option(LLAMA_KOMPUTE "llama: use Kompute" OFF)
option(LLAMA_MPI "llama: use MPI" OFF)
option(LLAMA_QKK_64 "llama: use super-block size of 64 for k-quants" OFF)
# copy ggml-metal.metal to bin directory
configure_file(ggml-metal.metal ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.metal COPYONLY)
+ if (LLAMA_METAL_EMBED_LIBRARY)
+ enable_language(ASM)
+ add_compile_definitions(GGML_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()
+
if (LLAMA_METAL_SHADER_DEBUG)
# custom command to do the following:
# xcrun -sdk macosx metal -fno-fast-math -c ggml-metal.metal -o ggml-metal.air
ifdef LLAMA_METAL_NDEBUG
MK_CPPFLAGS += -DGGML_METAL_NDEBUG
endif
+ifdef LLAMA_METAL_EMBED_LIBRARY
+ MK_CPPFLAGS += -DGGML_METAL_EMBED_LIBRARY
+ OBJS += ggml-metal-embed.o
+endif
endif # LLAMA_METAL
ifdef LLAMA_METAL
ggml-metal.o: ggml-metal.m ggml-metal.h
$(CC) $(CFLAGS) -c $< -o $@
+
+ifdef LLAMA_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}
+endif
endif # LLAMA_METAL
ifdef LLAMA_MPI