Skip to content

Commit 8dbbd75

Browse files
metal : add build system support for embedded metal library (#5604)
* add build support for embedded metal library * Update Makefile --------- Co-authored-by: Haoxiang Fei <feihaoxiang@idea.edu.cn> Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
1 parent c0a8c6d commit 8dbbd75

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

CMakeLists.txt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ option(LLAMA_VULKAN_RUN_TESTS "llama: run Vulkan tests"
110110
option(LLAMA_METAL "llama: use Metal" ${LLAMA_METAL_DEFAULT})
111111
option(LLAMA_METAL_NDEBUG "llama: disable Metal debugging" OFF)
112112
option(LLAMA_METAL_SHADER_DEBUG "llama: compile Metal with -fno-fast-math" OFF)
113+
option(LLAMA_METAL_EMBED_LIBRARY "llama: embed Metal library" OFF)
113114
option(LLAMA_KOMPUTE "llama: use Kompute" OFF)
114115
option(LLAMA_MPI "llama: use MPI" OFF)
115116
option(LLAMA_QKK_64 "llama: use super-block size of 64 for k-quants" OFF)
@@ -201,6 +202,29 @@ if (LLAMA_METAL)
201202
# copy ggml-metal.metal to bin directory
202203
configure_file(ggml-metal.metal ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.metal COPYONLY)
203204

205+
if (LLAMA_METAL_EMBED_LIBRARY)
206+
enable_language(ASM)
207+
add_compile_definitions(GGML_METAL_EMBED_LIBRARY)
208+
209+
set(METALLIB_SOURCE "${CMAKE_SOURCE_DIR}/ggml-metal.metal")
210+
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/autogenerated")
211+
set(EMBED_METALLIB_ASSEMBLY "${CMAKE_BINARY_DIR}/autogenerated/ggml-embed-metallib.s")
212+
213+
add_custom_command(
214+
OUTPUT ${EMBED_METALLIB_ASSEMBLY}
215+
COMMAND echo ".section __DATA,__ggml_metallib" > ${EMBED_METALLIB_ASSEMBLY}
216+
COMMAND echo ".globl _ggml_metallib_start" >> ${EMBED_METALLIB_ASSEMBLY}
217+
COMMAND echo "_ggml_metallib_start:" >> ${EMBED_METALLIB_ASSEMBLY}
218+
COMMAND echo ".incbin \\\"${METALLIB_SOURCE}\\\"" >> ${EMBED_METALLIB_ASSEMBLY}
219+
COMMAND echo ".globl _ggml_metallib_end" >> ${EMBED_METALLIB_ASSEMBLY}
220+
COMMAND echo "_ggml_metallib_end:" >> ${EMBED_METALLIB_ASSEMBLY}
221+
DEPENDS ${METALLIB_SOURCE}
222+
COMMENT "Generate assembly for embedded Metal library"
223+
)
224+
225+
set(GGML_SOURCES_METAL ${GGML_SOURCES_METAL} ${EMBED_METALLIB_ASSEMBLY})
226+
endif()
227+
204228
if (LLAMA_METAL_SHADER_DEBUG)
205229
# custom command to do the following:
206230
# xcrun -sdk macosx metal -fno-fast-math -c ggml-metal.metal -o ggml-metal.air

Makefile

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,11 +533,29 @@ ifdef LLAMA_METAL
533533
ifdef LLAMA_METAL_NDEBUG
534534
MK_CPPFLAGS += -DGGML_METAL_NDEBUG
535535
endif
536+
ifdef LLAMA_METAL_EMBED_LIBRARY
537+
MK_CPPFLAGS += -DGGML_METAL_EMBED_LIBRARY
538+
OBJS += ggml-metal-embed.o
539+
endif
536540
endif # LLAMA_METAL
537541

538542
ifdef LLAMA_METAL
539543
ggml-metal.o: ggml-metal.m ggml-metal.h
540544
$(CC) $(CFLAGS) -c $< -o $@
545+
546+
ifdef LLAMA_METAL_EMBED_LIBRARY
547+
ggml-metal-embed.o: ggml-metal.metal
548+
@echo "Embedding Metal library"
549+
$(eval TEMP_ASSEMBLY=$(shell mktemp))
550+
@echo ".section __DATA, __ggml_metallib" > $(TEMP_ASSEMBLY)
551+
@echo ".globl _ggml_metallib_start" >> $(TEMP_ASSEMBLY)
552+
@echo "_ggml_metallib_start:" >> $(TEMP_ASSEMBLY)
553+
@echo ".incbin \"$<\"" >> $(TEMP_ASSEMBLY)
554+
@echo ".globl _ggml_metallib_end" >> $(TEMP_ASSEMBLY)
555+
@echo "_ggml_metallib_end:" >> $(TEMP_ASSEMBLY)
556+
@$(AS) $(TEMP_ASSEMBLY) -o $@
557+
@rm -f ${TEMP_ASSEMBLY}
558+
endif
541559
endif # LLAMA_METAL
542560

543561
ifdef LLAMA_MPI

0 commit comments

Comments
 (0)