Skip to content

Commit 2b65ae3

Browse files
opencl: simplify kernel embedding logic in cmakefile (ggml-org#12503)
Co-authored-by: Max Krasnyansky <[email protected]>
1 parent 48d7021 commit 2b65ae3

File tree

1 file changed

+41
-119
lines changed

1 file changed

+41
-119
lines changed

ggml/src/ggml-opencl/CMakeLists.txt

Lines changed: 41 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -25,124 +25,46 @@ endif ()
2525
if (GGML_OPENCL_EMBED_KERNELS)
2626
add_compile_definitions(GGML_OPENCL_EMBED_KERNELS)
2727

28-
set(OPENCL_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl.cl.h")
29-
set(OPENCL_MM_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_mm.cl.h")
30-
set(OPENCL_CVT_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_cvt.cl.h")
28+
set(EMBED_KERNEL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/kernels/embed_kernel.py")
29+
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/autogenerated")
3130

32-
set(OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_gemv_noshuffle.cl.h")
33-
set(OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_gemv_noshuffle_general.cl.h")
34-
set(OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_mul_mat_Ab_Bi_8x4.cl.h")
35-
set(OPENCL_TRANSPOSE_16_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_16.cl.h")
36-
set(OPENCL_TRANSPOSE_32_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_32.cl.h")
37-
set(OPENCL_TRANSPOSE_32_16_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_32_16.cl.h")
38-
39-
set(EMBED_KERNEL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/kernels/embed_kernel.py")
40-
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/autogenerated")
41-
42-
include_directories("${CMAKE_BINARY_DIR}/autogenerated")
43-
44-
# Python must be accessible from command line
45-
add_custom_command(
46-
OUTPUT ${OPENCL_CL_SOURCE_EMBED}
47-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
48-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl.cl
49-
${OPENCL_CL_SOURCE_EMBED}
50-
DEPENDS kernels/ggml-opencl.cl ${EMBED_KERNEL_SCRIPT}
51-
COMMENT "Generate ggml-opencl.cl.h"
52-
)
53-
54-
add_custom_command(
55-
OUTPUT ${OPENCL_MM_CL_SOURCE_EMBED}
56-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
57-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_mm.cl
58-
${OPENCL_MM_CL_SOURCE_EMBED}
59-
DEPENDS kernels/ggml-opencl_mm.cl ${EMBED_KERNEL_SCRIPT}
60-
COMMENT "Generate ggml-opencl_mm.cl.h"
61-
)
62-
63-
add_custom_command(
64-
OUTPUT ${OPENCL_CVT_CL_SOURCE_EMBED}
65-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
66-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_cvt.cl
67-
${OPENCL_CVT_CL_SOURCE_EMBED}
68-
DEPENDS kernels/ggml-opencl_cvt.cl ${EMBED_KERNEL_SCRIPT}
69-
COMMENT "Generate ggml-opencl_cvt.cl.h"
70-
)
71-
72-
add_custom_command(
73-
OUTPUT ${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED}
74-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
75-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_gemv_noshuffle.cl
76-
${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED}
77-
DEPENDS kernels/ggml-opencl_gemv_noshuffle.cl ${EMBED_KERNEL_SCRIPT}
78-
COMMENT "Generate ggml-opencl_gemv_noshuffle.cl.h"
79-
)
80-
81-
add_custom_command(
82-
OUTPUT ${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED}
83-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
84-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_gemv_noshuffle_general.cl
85-
${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED}
86-
DEPENDS kernels/ggml-opencl_gemv_noshuffle_general.cl ${EMBED_KERNEL_SCRIPT}
87-
COMMENT "Generate ggml-opencl_gemv_noshuffle_general.cl.h"
88-
)
89-
90-
add_custom_command(
91-
OUTPUT ${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED}
92-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
93-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl
94-
${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED}
95-
DEPENDS kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl ${EMBED_KERNEL_SCRIPT}
96-
COMMENT "Generate ggml-opencl_mul_mat_Ab_Bi_8x4.cl.cl.h"
97-
)
98-
99-
add_custom_command(
100-
OUTPUT ${OPENCL_TRANSPOSE_16_SOURCE_EMBED}
101-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
102-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_16.cl
103-
${OPENCL_TRANSPOSE_16_SOURCE_EMBED}
104-
DEPENDS kernels/ggml-opencl_transpose_16.cl ${EMBED_KERNEL_SCRIPT}
105-
COMMENT "Generate ggml-opencl_transpose_16.cl.h"
106-
)
107-
108-
add_custom_command(
109-
OUTPUT ${OPENCL_TRANSPOSE_32_SOURCE_EMBED}
110-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
111-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_32.cl
112-
${OPENCL_TRANSPOSE_32_SOURCE_EMBED}
113-
DEPENDS kernels/ggml-opencl_transpose_32.cl ${EMBED_KERNEL_SCRIPT}
114-
COMMENT "Generate ggml-opencl_transpose_32.cl.h"
115-
)
116-
117-
add_custom_command(
118-
OUTPUT ${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED}
119-
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT}
120-
${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_32_16.cl
121-
${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED}
122-
DEPENDS kernels/ggml-opencl_transpose_32_16.cl ${EMBED_KERNEL_SCRIPT}
123-
COMMENT "Generate ggml-opencl_transpose_32_16.cl.h"
124-
)
125-
126-
target_sources(${TARGET_NAME} PRIVATE
127-
${OPENCL_CL_SOURCE_EMBED}
128-
${OPENCL_MM_CL_SOURCE_EMBED}
129-
${OPENCL_CVT_CL_SOURCE_EMBED}
130-
${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED}
131-
${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED}
132-
${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED}
133-
${OPENCL_TRANSPOSE_16_SOURCE_EMBED}
134-
${OPENCL_TRANSPOSE_32_SOURCE_EMBED}
135-
${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED})
136-
else ()
137-
# copy ggml-opencl.cl to bin directory
138-
configure_file(kernels/ggml-opencl.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl.cl COPYONLY)
139-
configure_file(kernels/ggml-opencl_mm.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_mm.cl COPYONLY)
140-
configure_file(kernels/ggml-opencl_cvt.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_cvt.cl COPYONLY)
141-
142-
configure_file(kernels/ggml-opencl_gemv_noshuffle.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_gemv_noshuffle.cl COPYONLY)
143-
configure_file(kernels/ggml-opencl_gemv_noshuffle_general.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_gemv_noshuffle_general.cl COPYONLY)
144-
configure_file(kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_mul_mat_Ab_Bi_8x4.cl COPYONLY)
145-
configure_file(kernels/ggml-opencl_transpose_16.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_16.cl COPYONLY)
146-
configure_file(kernels/ggml-opencl_transpose_32.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_32.cl COPYONLY)
147-
configure_file(kernels/ggml-opencl_transpose_32_16.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_32_16.cl COPYONLY)
31+
target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/autogenerated")
14832
endif ()
33+
34+
function(ggml_opencl_add_kernel KNAME)
35+
set(KERN_HDR ${CMAKE_CURRENT_BINARY_DIR}/autogenerated/${KNAME}.cl.h)
36+
set(KERN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/kernels/${KNAME}.cl)
37+
38+
if (GGML_OPENCL_EMBED_KERNELS)
39+
message(STATUS "opencl: embedding kernel ${KNAME}")
40+
41+
# Python must be accessible from command line
42+
add_custom_command(
43+
OUTPUT ${KERN_HDR}
44+
COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} ${KERN_SRC} ${KERN_HDR}
45+
DEPENDS ${KERN_SRC} ${EMBED_KERNEL_SCRIPT}
46+
COMMENT "Generate ${KERN_HDR}"
47+
)
48+
49+
target_sources(${TARGET_NAME} PRIVATE ${KERN_HDR})
50+
else ()
51+
message(STATUS "opencl: adding kernel ${KNAME}")
52+
configure_file(${KERN_SRC} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${KNAME}.cl COPYONLY)
53+
endif ()
54+
endfunction()
55+
56+
set(GGML_OPENCL_KERNELS
57+
ggml-opencl
58+
ggml-opencl_mm
59+
ggml-opencl_cvt
60+
ggml-opencl_gemv_noshuffle
61+
ggml-opencl_gemv_noshuffle_general
62+
ggml-opencl_mul_mat_Ab_Bi_8x4
63+
ggml-opencl_transpose_16
64+
ggml-opencl_transpose_32
65+
ggml-opencl_transpose_32_16
66+
)
67+
68+
foreach (K ${GGML_OPENCL_KERNELS})
69+
ggml_opencl_add_kernel(${K})
70+
endforeach()

0 commit comments

Comments
 (0)