@@ -200,9 +200,6 @@ if (LLAMA_METAL)
200
200
add_compile_definitions (GGML_METAL_NDEBUG)
201
201
endif ()
202
202
203
- # get full path to the file
204
- #add_compile_definitions(GGML_METAL_DIR_KERNELS="${CMAKE_CURRENT_SOURCE_DIR}/")
205
-
206
203
# copy ggml-common.h and ggml-metal.metal to bin directory
207
204
configure_file (ggml-common.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-common.h COPYONLY )
208
205
configure_file (ggml-metal.metal ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-metal.metal COPYONLY )
@@ -211,53 +208,62 @@ if (LLAMA_METAL)
211
208
enable_language (ASM)
212
209
add_compile_definitions (GGML_METAL_EMBED_LIBRARY)
213
210
211
+ set (METALLIB_COMMON "${CMAKE_CURRENT_SOURCE_DIR} /ggml-common.h" )
214
212
set (METALLIB_SOURCE "${CMAKE_CURRENT_SOURCE_DIR} /ggml-metal.metal" )
213
+
215
214
file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR} /autogenerated" )
216
- set (EMBED_METALLIB_ASSEMBLY "${CMAKE_BINARY_DIR} /autogenerated/ggml-embed-metallib.s" )
215
+
216
+ # merge ggml-common.h and ggml-metal.metal into a single file
217
+ set (METALLIB_EMBED_ASM "${CMAKE_BINARY_DIR} /autogenerated/ggml-metal-embed.s" )
218
+ set (METALLIB_SOURCE_EMBED "${CMAKE_BINARY_DIR} /autogenerated/ggml-metal-embed.metal" )
217
219
218
220
add_custom_command (
219
- OUTPUT ${EMBED_METALLIB_ASSEMBLY}
220
- COMMAND echo ".section __DATA,__ggml_metallib" > ${EMBED_METALLIB_ASSEMBLY}
221
- COMMAND echo ".globl _ggml_metallib_start" >> ${EMBED_METALLIB_ASSEMBLY}
222
- COMMAND echo "_ggml_metallib_start:" >> ${EMBED_METALLIB_ASSEMBLY}
223
- COMMAND echo ".incbin \\\" ${METALLIB_SOURCE} \\\" " >> ${EMBED_METALLIB_ASSEMBLY}
224
- COMMAND echo ".globl _ggml_metallib_end" >> ${EMBED_METALLIB_ASSEMBLY}
225
- COMMAND echo "_ggml_metallib_end:" >> ${EMBED_METALLIB_ASSEMBLY}
226
- DEPENDS ${METALLIB_SOURCE}
221
+ OUTPUT ${METALLIB_EMBED_ASM}
222
+ COMMAND echo "Embedding Metal library"
223
+ COMMAND sed -e '/\#include \"ggml-common.h\"/r ${METALLIB_COMMON}' -e '/\#include \"ggml-common.h\"/d' < ${METALLIB_SOURCE} > ${METALLIB_SOURCE_EMBED}
224
+ COMMAND echo ".section __DATA,__ggml_metallib" > ${METALLIB_EMBED_ASM}
225
+ COMMAND echo ".globl _ggml_metallib_start" >> ${METALLIB_EMBED_ASM}
226
+ COMMAND echo "_ggml_metallib_start:" >> ${METALLIB_EMBED_ASM}
227
+ COMMAND echo ".incbin \\\" ${METALLIB_SOURCE_EMBED} \\\" " >> ${METALLIB_EMBED_ASM}
228
+ COMMAND echo ".globl _ggml_metallib_end" >> ${METALLIB_EMBED_ASM}
229
+ COMMAND echo "_ggml_metallib_end:" >> ${METALLIB_EMBED_ASM}
230
+ DEPENDS ggml-metal.metal ggml-common.h
227
231
COMMENT "Generate assembly for embedded Metal library"
228
232
)
229
233
230
- set (GGML_SOURCES_METAL ${GGML_SOURCES_METAL} ${EMBED_METALLIB_ASSEMBLY} )
231
- endif ()
232
-
233
- if (LLAMA_METAL_SHADER_DEBUG)
234
- # custom command to do the following:
235
- # xcrun -sdk macosx metal -fno-fast-math -c ggml-metal.metal -o ggml-metal.air
236
- # xcrun -sdk macosx metallib ggml-metal.air -o default.metallib
237
- #
238
- # note: this is the only way I found to disable fast-math in Metal. it's ugly, but at least it works
239
- # disabling fast math is needed in order to pass tests/test-backend-ops
240
- # note: adding -fno-inline fixes the tests when using MTL_SHADER_VALIDATION=1
241
- # note: unfortunately, we have to call it default.metallib instead of ggml.metallib
242
- # ref: https://github.com/ggerganov/whisper.cpp/issues/1720
243
- set (XC_FLAGS -fno-fast-math -fno-inline -g)
244
- if (LLAMA_QKK_64)
245
- set (XC_FLAGS ${XC_FLAGS} -DQK_K=64)
234
+ set (GGML_SOURCES_METAL ${GGML_SOURCES_METAL} ${METALLIB_EMBED_ASM} )
235
+ else ()
236
+ if (LLAMA_METAL_SHADER_DEBUG)
237
+ # custom command to do the following:
238
+ # xcrun -sdk macosx metal -fno-fast-math -c ggml-metal.metal -o ggml-metal.air
239
+ # xcrun -sdk macosx metallib ggml-metal.air -o default.metallib
240
+ #
241
+ # note: this is the only way I found to disable fast-math in Metal. it's ugly, but at least it works
242
+ # disabling fast math is needed in order to pass tests/test-backend-ops
243
+ # note: adding -fno-inline fixes the tests when using MTL_SHADER_VALIDATION=1
244
+ # note: unfortunately, we have to call it default.metallib instead of ggml.metallib
245
+ # ref: https://github.com/ggerganov/whisper.cpp/issues/1720
246
+ set (XC_FLAGS -fno-fast-math -fno-inline -g)
247
+ else ()
248
+ set (XC_FLAGS -O3)
246
249
endif ()
247
250
248
251
add_custom_command (
249
252
OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /default.metallib
250
253
COMMAND xcrun -sdk macosx metal ${XC_FLAGS} -c ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-metal.metal -o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-metal.air
251
254
COMMAND xcrun -sdk macosx metallib ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-metal.air -o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /default.metallib
252
- DEPENDS ggml-metal.metal
255
+ COMMAND rm -f ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-metal.air
256
+ COMMAND rm -f ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-common.h
257
+ COMMAND rm -f ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /ggml-metal.metal
258
+ DEPENDS ggml-metal.metal ggml-common.h
253
259
COMMENT "Compiling Metal kernels"
254
- )
260
+ )
255
261
256
262
add_custom_target (
257
263
ggml-metal ALL
258
264
DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /default.metallib
259
- )
260
- endif ()
265
+ )
266
+ endif () # LLAMA_METAL_EMBED_LIBRARY
261
267
262
268
set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS}
263
269
${FOUNDATION_LIBRARY}
0 commit comments