|
|
@@ -200,9 +200,6 @@ if (LLAMA_METAL)
|
|
|
add_compile_definitions(GGML_METAL_NDEBUG)
|
|
|
endif()
|
|
|
|
|
|
- # get full path to the file
|
|
|
- #add_compile_definitions(GGML_METAL_DIR_KERNELS="${CMAKE_CURRENT_SOURCE_DIR}/")
|
|
|
-
|
|
|
# copy ggml-common.h and ggml-metal.metal to bin directory
|
|
|
configure_file(ggml-common.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-common.h COPYONLY)
|
|
|
configure_file(ggml-metal.metal ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.metal COPYONLY)
|
|
|
@@ -211,53 +208,62 @@ if (LLAMA_METAL)
|
|
|
enable_language(ASM)
|
|
|
add_compile_definitions(GGML_METAL_EMBED_LIBRARY)
|
|
|
|
|
|
+ set(METALLIB_COMMON "${CMAKE_CURRENT_SOURCE_DIR}/ggml-common.h")
|
|
|
set(METALLIB_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal")
|
|
|
+
|
|
|
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/autogenerated")
|
|
|
- set(EMBED_METALLIB_ASSEMBLY "${CMAKE_BINARY_DIR}/autogenerated/ggml-embed-metallib.s")
|
|
|
+
|
|
|
+ # merge ggml-common.h and ggml-metal.metal into a single file
|
|
|
+ set(METALLIB_EMBED_ASM "${CMAKE_BINARY_DIR}/autogenerated/ggml-metal-embed.s")
|
|
|
+ set(METALLIB_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-metal-embed.metal")
|
|
|
|
|
|
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}
|
|
|
+ OUTPUT ${METALLIB_EMBED_ASM}
|
|
|
+ COMMAND echo "Embedding Metal library"
|
|
|
+ COMMAND sed -e '/\#include \"ggml-common.h\"/r ${METALLIB_COMMON}' -e '/\#include \"ggml-common.h\"/d' < ${METALLIB_SOURCE} > ${METALLIB_SOURCE_EMBED}
|
|
|
+ COMMAND echo ".section __DATA,__ggml_metallib" > ${METALLIB_EMBED_ASM}
|
|
|
+ COMMAND echo ".globl _ggml_metallib_start" >> ${METALLIB_EMBED_ASM}
|
|
|
+ COMMAND echo "_ggml_metallib_start:" >> ${METALLIB_EMBED_ASM}
|
|
|
+ COMMAND echo ".incbin \\\"${METALLIB_SOURCE_EMBED}\\\"" >> ${METALLIB_EMBED_ASM}
|
|
|
+ COMMAND echo ".globl _ggml_metallib_end" >> ${METALLIB_EMBED_ASM}
|
|
|
+ COMMAND echo "_ggml_metallib_end:" >> ${METALLIB_EMBED_ASM}
|
|
|
+ DEPENDS ggml-metal.metal ggml-common.h
|
|
|
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
|
|
|
- # xcrun -sdk macosx metallib ggml-metal.air -o default.metallib
|
|
|
- #
|
|
|
- # note: this is the only way I found to disable fast-math in Metal. it's ugly, but at least it works
|
|
|
- # disabling fast math is needed in order to pass tests/test-backend-ops
|
|
|
- # note: adding -fno-inline fixes the tests when using MTL_SHADER_VALIDATION=1
|
|
|
- # note: unfortunately, we have to call it default.metallib instead of ggml.metallib
|
|
|
- # ref: https://github.com/ggerganov/whisper.cpp/issues/1720
|
|
|
- set(XC_FLAGS -fno-fast-math -fno-inline -g)
|
|
|
- if (LLAMA_QKK_64)
|
|
|
- set(XC_FLAGS ${XC_FLAGS} -DQK_K=64)
|
|
|
+ set(GGML_SOURCES_METAL ${GGML_SOURCES_METAL} ${METALLIB_EMBED_ASM})
|
|
|
+ else()
|
|
|
+ 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
|
|
|
+ # xcrun -sdk macosx metallib ggml-metal.air -o default.metallib
|
|
|
+ #
|
|
|
+ # note: this is the only way I found to disable fast-math in Metal. it's ugly, but at least it works
|
|
|
+ # disabling fast math is needed in order to pass tests/test-backend-ops
|
|
|
+ # note: adding -fno-inline fixes the tests when using MTL_SHADER_VALIDATION=1
|
|
|
+ # note: unfortunately, we have to call it default.metallib instead of ggml.metallib
|
|
|
+ # ref: https://github.com/ggerganov/whisper.cpp/issues/1720
|
|
|
+ set(XC_FLAGS -fno-fast-math -fno-inline -g)
|
|
|
+ else()
|
|
|
+ set(XC_FLAGS -O3)
|
|
|
endif()
|
|
|
|
|
|
add_custom_command(
|
|
|
OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/default.metallib
|
|
|
COMMAND xcrun -sdk macosx metal ${XC_FLAGS} -c ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.metal -o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.air
|
|
|
COMMAND xcrun -sdk macosx metallib ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.air -o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/default.metallib
|
|
|
- DEPENDS ggml-metal.metal
|
|
|
+ COMMAND rm -f ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.air
|
|
|
+ COMMAND rm -f ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-common.h
|
|
|
+ COMMAND rm -f ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.metal
|
|
|
+ DEPENDS ggml-metal.metal ggml-common.h
|
|
|
COMMENT "Compiling Metal kernels"
|
|
|
- )
|
|
|
+ )
|
|
|
|
|
|
add_custom_target(
|
|
|
ggml-metal ALL
|
|
|
DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/default.metallib
|
|
|
- )
|
|
|
- endif()
|
|
|
+ )
|
|
|
+ endif() # LLAMA_METAL_EMBED_LIBRARY
|
|
|
|
|
|
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS}
|
|
|
${FOUNDATION_LIBRARY}
|