if (GGML_OPENCL_EMBED_KERNELS)
add_compile_definitions(GGML_OPENCL_EMBED_KERNELS)
- set(OPENCL_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl.cl.h")
- set(OPENCL_MM_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_mm.cl.h")
- set(OPENCL_CVT_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_cvt.cl.h")
+ set(EMBED_KERNEL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/kernels/embed_kernel.py")
+ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/autogenerated")
- set(OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_gemv_noshuffle.cl.h")
- set(OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_gemv_noshuffle_general.cl.h")
- set(OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_mul_mat_Ab_Bi_8x4.cl.h")
- set(OPENCL_TRANSPOSE_16_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_16.cl.h")
- set(OPENCL_TRANSPOSE_32_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_32.cl.h")
- set(OPENCL_TRANSPOSE_32_16_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_32_16.cl.h")
-
- set(EMBED_KERNEL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/kernels/embed_kernel.py")
- file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/autogenerated")
-
- include_directories("${CMAKE_BINARY_DIR}/autogenerated")
-
- # Python must be accessible from command line
- add_custom_command(
- OUTPUT ${OPENCL_CL_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl.cl
- ${OPENCL_CL_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_MM_CL_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_mm.cl
- ${OPENCL_MM_CL_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_mm.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_mm.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_CVT_CL_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_cvt.cl
- ${OPENCL_CVT_CL_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_cvt.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_cvt.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_gemv_noshuffle.cl
- ${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_gemv_noshuffle.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_gemv_noshuffle.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_gemv_noshuffle_general.cl
- ${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_gemv_noshuffle_general.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_gemv_noshuffle_general.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl
- ${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_mul_mat_Ab_Bi_8x4.cl.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_TRANSPOSE_16_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_16.cl
- ${OPENCL_TRANSPOSE_16_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_transpose_16.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_transpose_16.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_TRANSPOSE_32_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_32.cl
- ${OPENCL_TRANSPOSE_32_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_transpose_32.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_transpose_32.cl.h"
- )
-
- add_custom_command(
- OUTPUT ${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED}
- COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
- ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_32_16.cl
- ${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED}
- DEPENDS kernels/ggml-opencl_transpose_32_16.cl ${EMBED_KERNEL_SCRIPT}
- COMMENT "Generate ggml-opencl_transpose_32_16.cl.h"
- )
-
- target_sources(${TARGET_NAME} PRIVATE
- ${OPENCL_CL_SOURCE_EMBED}
- ${OPENCL_MM_CL_SOURCE_EMBED}
- ${OPENCL_CVT_CL_SOURCE_EMBED}
- ${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED}
- ${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED}
- ${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED}
- ${OPENCL_TRANSPOSE_16_SOURCE_EMBED}
- ${OPENCL_TRANSPOSE_32_SOURCE_EMBED}
- ${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED})
-else ()
- # copy ggml-opencl.cl to bin directory
- configure_file(kernels/ggml-opencl.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl.cl COPYONLY)
- configure_file(kernels/ggml-opencl_mm.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_mm.cl COPYONLY)
- configure_file(kernels/ggml-opencl_cvt.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_cvt.cl COPYONLY)
-
- configure_file(kernels/ggml-opencl_gemv_noshuffle.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_gemv_noshuffle.cl COPYONLY)
- configure_file(kernels/ggml-opencl_gemv_noshuffle_general.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_gemv_noshuffle_general.cl COPYONLY)
- configure_file(kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_mul_mat_Ab_Bi_8x4.cl COPYONLY)
- configure_file(kernels/ggml-opencl_transpose_16.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_16.cl COPYONLY)
- configure_file(kernels/ggml-opencl_transpose_32.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_32.cl COPYONLY)
- configure_file(kernels/ggml-opencl_transpose_32_16.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_32_16.cl COPYONLY)
+ target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/autogenerated")
endif ()
+
+function(ggml_opencl_add_kernel KNAME)
+ set(KERN_HDR ${CMAKE_CURRENT_BINARY_DIR}/autogenerated/${KNAME}.cl.h)
+ set(KERN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/kernels/${KNAME}.cl)
+
+ if (GGML_OPENCL_EMBED_KERNELS)
+ message(STATUS "opencl: embedding kernel ${KNAME}")
+
+ # Python must be accessible from command line
+ add_custom_command(
+ OUTPUT ${KERN_HDR}
+ COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} ${KERN_SRC} ${KERN_HDR}
+ DEPENDS ${KERN_SRC} ${EMBED_KERNEL_SCRIPT}
+ COMMENT "Generate ${KERN_HDR}"
+ )
+
+ target_sources(${TARGET_NAME} PRIVATE ${KERN_HDR})
+ else ()
+ message(STATUS "opencl: adding kernel ${KNAME}")
+ configure_file(${KERN_SRC} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${KNAME}.cl COPYONLY)
+ endif ()
+endfunction()
+
+set(GGML_OPENCL_KERNELS
+ ggml-opencl
+ ggml-opencl_mm
+ ggml-opencl_cvt
+ ggml-opencl_gemv_noshuffle
+ ggml-opencl_gemv_noshuffle_general
+ ggml-opencl_mul_mat_Ab_Bi_8x4
+ ggml-opencl_transpose_16
+ ggml-opencl_transpose_32
+ ggml-opencl_transpose_32_16
+)
+
+foreach (K ${GGML_OPENCL_KERNELS})
+ ggml_opencl_add_kernel(${K})
+endforeach()