Skip to content

Commit 8cd434c

Browse files
committed
add vulkan and kompute
1 parent efdd713 commit 8cd434c

File tree

7 files changed

+246
-250
lines changed

7 files changed

+246
-250
lines changed

ggml/src/CMakeLists.txt

Lines changed: 6 additions & 242 deletions
Original file line numberDiff line numberDiff line change
@@ -244,246 +244,6 @@ if (GGML_SYCL)
244244
endif()
245245
endif()
246246

247-
if (GGML_VULKAN)
248-
find_package(Vulkan COMPONENTS glslc REQUIRED)
249-
250-
if (Vulkan_FOUND)
251-
message(STATUS "Vulkan found")
252-
253-
list(APPEND GGML_CDEF_PUBLIC GGML_USE_VULKAN)
254-
255-
# Workaround to the "can't dereference invalidated vector iterator" bug in clang-cl debug build
256-
# Posssibly relevant: https://stackoverflow.com/questions/74748276/visual-studio-no-displays-the-correct-length-of-stdvector
257-
if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
258-
add_compile_definitions(_ITERATOR_DEBUG_LEVEL=0)
259-
endif()
260-
261-
if (GGML_VULKAN_CHECK_RESULTS)
262-
add_compile_definitions(GGML_VULKAN_CHECK_RESULTS)
263-
endif()
264-
265-
if (GGML_VULKAN_DEBUG)
266-
add_compile_definitions(GGML_VULKAN_DEBUG)
267-
endif()
268-
269-
if (GGML_VULKAN_MEMORY_DEBUG)
270-
add_compile_definitions(GGML_VULKAN_MEMORY_DEBUG)
271-
endif()
272-
273-
if (GGML_VULKAN_SHADER_DEBUG_INFO)
274-
add_compile_definitions(GGML_VULKAN_SHADER_DEBUG_INFO)
275-
endif()
276-
277-
if (GGML_VULKAN_PERF)
278-
add_compile_definitions(GGML_VULKAN_PERF)
279-
endif()
280-
281-
if (GGML_VULKAN_VALIDATE)
282-
add_compile_definitions(GGML_VULKAN_VALIDATE)
283-
endif()
284-
285-
if (GGML_VULKAN_RUN_TESTS)
286-
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
287-
endif()
288-
289-
add_subdirectory(vulkan-shaders)
290-
291-
set (_ggml_vk_genshaders_cmd vulkan-shaders-gen)
292-
set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
293-
set (_ggml_vk_source ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp)
294-
set (_ggml_vk_input_dir ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders)
295-
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
296-
297-
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
298-
299-
add_custom_command(
300-
OUTPUT ${_ggml_vk_header}
301-
${_ggml_vk_source}
302-
303-
COMMAND ${_ggml_vk_genshaders_cmd}
304-
--glslc ${Vulkan_GLSLC_EXECUTABLE}
305-
--input-dir ${_ggml_vk_input_dir}
306-
--output-dir ${_ggml_vk_output_dir}
307-
--target-hpp ${_ggml_vk_header}
308-
--target-cpp ${_ggml_vk_source}
309-
--no-clean
310-
311-
DEPENDS ${_ggml_vk_shader_deps}
312-
COMMENT "Generate vulkan shaders"
313-
)
314-
315-
set(GGML_HEADERS_VULKAN ${CMAKE_CURRENT_SOURCE_DIR}/../include/ggml-vulkan.h ${_ggml_vk_header})
316-
set(GGML_SOURCES_VULKAN ggml-vulkan.cpp ${_ggml_vk_source})
317-
318-
list(APPEND GGML_EXTRA_LIBS_PRIVATE Vulkan::Vulkan)
319-
list(APPEND GGML_EXTRA_INCLUDES ${CMAKE_CURRENT_BINARY_DIR})
320-
else()
321-
message(WARNING "Vulkan not found")
322-
endif()
323-
endif()
324-
325-
if (GGML_KOMPUTE)
326-
add_compile_definitions(VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)
327-
328-
find_package(Vulkan COMPONENTS glslc REQUIRED)
329-
find_program(glslc_executable NAMES glslc HINTS Vulkan::glslc)
330-
331-
if (NOT glslc_executable)
332-
message(FATAL_ERROR "glslc not found")
333-
endif()
334-
335-
function(compile_shader)
336-
set(options)
337-
set(oneValueArgs)
338-
set(multiValueArgs SOURCES)
339-
cmake_parse_arguments(compile_shader "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
340-
foreach(source ${compile_shader_SOURCES})
341-
get_filename_component(filename ${source} NAME)
342-
set(spv_file ${filename}.spv)
343-
add_custom_command(
344-
OUTPUT ${spv_file}
345-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${source}
346-
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/common.comp
347-
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_getrows.comp
348-
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_mul_mv_q_n_pre.comp
349-
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_mul_mv_q_n.comp
350-
COMMAND ${glslc_executable} --target-env=vulkan1.2 -o ${spv_file} ${CMAKE_CURRENT_SOURCE_DIR}/${source}
351-
COMMENT "Compiling ${source} to ${spv_file}"
352-
)
353-
354-
get_filename_component(RAW_FILE_NAME ${spv_file} NAME)
355-
set(FILE_NAME "shader${RAW_FILE_NAME}")
356-
string(REPLACE ".comp.spv" ".h" HEADER_FILE ${FILE_NAME})
357-
string(TOUPPER ${HEADER_FILE} HEADER_FILE_DEFINE)
358-
string(REPLACE "." "_" HEADER_FILE_DEFINE "${HEADER_FILE_DEFINE}")
359-
set(OUTPUT_HEADER_FILE "${HEADER_FILE}")
360-
message(STATUS "${HEADER_FILE} generating ${HEADER_FILE_DEFINE}")
361-
if(CMAKE_GENERATOR MATCHES "Visual Studio")
362-
add_custom_command(
363-
OUTPUT ${OUTPUT_HEADER_FILE}
364-
COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
365-
COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
366-
COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
367-
COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
368-
COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
369-
COMMAND ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
370-
COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
371-
COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
372-
DEPENDS ${spv_file} xxd
373-
COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/xxd"
374-
)
375-
else()
376-
add_custom_command(
377-
OUTPUT ${OUTPUT_HEADER_FILE}
378-
COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
379-
COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
380-
COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
381-
COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
382-
COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
383-
COMMAND ${CMAKE_BINARY_DIR}/bin/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
384-
COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
385-
COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
386-
DEPENDS ${spv_file} xxd
387-
COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR}/bin/xxd"
388-
)
389-
endif()
390-
endforeach()
391-
endfunction()
392-
393-
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/kompute/CMakeLists.txt")
394-
message(STATUS "Kompute found")
395-
set(KOMPUTE_OPT_LOG_LEVEL Error CACHE STRING "Kompute log level")
396-
add_subdirectory(kompute)
397-
398-
# Compile our shaders
399-
compile_shader(SOURCES
400-
kompute-shaders/op_scale.comp
401-
kompute-shaders/op_scale_8.comp
402-
kompute-shaders/op_add.comp
403-
kompute-shaders/op_addrow.comp
404-
kompute-shaders/op_mul.comp
405-
kompute-shaders/op_silu.comp
406-
kompute-shaders/op_relu.comp
407-
kompute-shaders/op_gelu.comp
408-
kompute-shaders/op_softmax.comp
409-
kompute-shaders/op_norm.comp
410-
kompute-shaders/op_rmsnorm.comp
411-
kompute-shaders/op_diagmask.comp
412-
kompute-shaders/op_mul_mat_mat_f32.comp
413-
kompute-shaders/op_mul_mat_f16.comp
414-
kompute-shaders/op_mul_mat_q8_0.comp
415-
kompute-shaders/op_mul_mat_q4_0.comp
416-
kompute-shaders/op_mul_mat_q4_1.comp
417-
kompute-shaders/op_mul_mat_q4_k.comp
418-
kompute-shaders/op_mul_mat_q6_k.comp
419-
kompute-shaders/op_getrows_f32.comp
420-
kompute-shaders/op_getrows_f16.comp
421-
kompute-shaders/op_getrows_q4_0.comp
422-
kompute-shaders/op_getrows_q4_1.comp
423-
kompute-shaders/op_getrows_q6_k.comp
424-
kompute-shaders/op_rope_f16.comp
425-
kompute-shaders/op_rope_f32.comp
426-
kompute-shaders/op_cpy_f16_f16.comp
427-
kompute-shaders/op_cpy_f16_f32.comp
428-
kompute-shaders/op_cpy_f32_f16.comp
429-
kompute-shaders/op_cpy_f32_f32.comp
430-
)
431-
432-
# Create a custom target for our generated shaders
433-
add_custom_target(generated_shaders DEPENDS
434-
shaderop_scale.h
435-
shaderop_scale_8.h
436-
shaderop_add.h
437-
shaderop_addrow.h
438-
shaderop_mul.h
439-
shaderop_silu.h
440-
shaderop_relu.h
441-
shaderop_gelu.h
442-
shaderop_softmax.h
443-
shaderop_norm.h
444-
shaderop_rmsnorm.h
445-
shaderop_diagmask.h
446-
shaderop_mul_mat_mat_f32.h
447-
shaderop_mul_mat_f16.h
448-
shaderop_mul_mat_q8_0.h
449-
shaderop_mul_mat_q4_0.h
450-
shaderop_mul_mat_q4_1.h
451-
shaderop_mul_mat_q4_k.h
452-
shaderop_mul_mat_q6_k.h
453-
shaderop_getrows_f32.h
454-
shaderop_getrows_f16.h
455-
shaderop_getrows_q4_0.h
456-
shaderop_getrows_q4_1.h
457-
shaderop_getrows_q6_k.h
458-
shaderop_rope_f16.h
459-
shaderop_rope_f32.h
460-
shaderop_cpy_f16_f16.h
461-
shaderop_cpy_f16_f32.h
462-
shaderop_cpy_f32_f16.h
463-
shaderop_cpy_f32_f32.h
464-
)
465-
466-
# Create a custom command that depends on the generated_shaders
467-
add_custom_command(
468-
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp
469-
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp
470-
DEPENDS generated_shaders
471-
COMMENT "Ensuring shaders are generated before compiling ggml-kompute.cpp"
472-
)
473-
474-
# Add the stamp to the main sources to ensure dependency tracking
475-
set(GGML_SOURCES_KOMPUTE ggml-kompute.cpp ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp)
476-
set(GGML_HEADERS_KOMPUTE ../include/ggml-kompute.h ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp)
477-
478-
list(APPEND GGML_CDEF_PUBLIC GGML_USE_KOMPUTE)
479-
480-
list(APPEND GGML_EXTRA_LIBS_PRIVATE kompute)
481-
list(APPEND GGML_EXTRA_INCLUDES ${CMAKE_CURRENT_BINARY_DIR})
482-
else()
483-
message(WARNING "Kompute not found")
484-
endif()
485-
endif()
486-
487247
if (GGML_CANN)
488248
if ("cann${CANN_INSTALL_DIR}" STREQUAL "cann" AND DEFINED ENV{ASCEND_TOOLKIT_HOME})
489249
set(CANN_INSTALL_DIR $ENV{ASCEND_TOOLKIT_HOME})
@@ -757,21 +517,25 @@ target_link_libraries(ggml PUBLIC ggml-base ggml-cpu)
757517

758518
function(ggml_add_backend backend)
759519
string(TOUPPER "GGML_${backend}" backend_id)
760-
string(TOLOWER "ggml-${backend}" backend_target)
761520
if (${backend_id})
521+
string(TOLOWER "ggml-${backend}" backend_target)
762522
add_subdirectory(${backend_target})
763523
if (${BUILD_SHARED_LIBS})
764524
target_compile_definitions(${backend_target} PRIVATE GGML_BACKEND_BUILD)
765-
target_compile_definitions(${backend_target} PUBLIC GGML_BABKEND_SHARED)
525+
target_compile_definitions(${backend_target} PUBLIC GGML_BACKEND_SHARED)
766526
endif()
767527
target_link_libraries(ggml PUBLIC ${backend_target})
528+
string(TOUPPER "GGML_USE_${backend}" backend_use)
529+
#set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} ${backend_use} PARENT_SCOPE)
530+
target_compile_definitions(ggml PUBLIC ${backend_use})
768531
endif()
769532
endfunction()
770533

771534
ggml_add_backend(CUDA)
772535
ggml_add_backend(METAL)
773536
ggml_add_backend(BLAS)
774537
ggml_add_backend(RPC)
538+
ggml_add_backend(Vulkan)
775539

776540
if (EMSCRIPTEN)
777541
set_target_properties(ggml PROPERTIES COMPILE_FLAGS "-msimd128")

ggml/src/ggml-blas/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,6 @@ if (BLAS_FOUND)
7878
#add_compile_options(${BLAS_LINKER_FLAGS})
7979
target_compile_options(ggml-blas PRIVATE ${BLAS_LINKER_FLAGS})
8080

81-
set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} GGML_USE_BLAS PARENT_SCOPE)
82-
8381
if (${BLAS_INCLUDE_DIRS} MATCHES "mkl" AND (${GGML_BLAS_VENDOR} MATCHES "Generic" OR ${GGML_BLAS_VENDOR} MATCHES "Intel"))
8482
add_compile_definitions(GGML_BLAS_USE_MKL)
8583
endif()

ggml/src/ggml-cuda/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ if (CUDAToolkit_FOUND)
5151
target_link_libraries(ggml-cuda PRIVATE ggml-base)
5252
target_include_directories(ggml-cuda PRIVATE . ..)
5353

54-
set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} GGML_USE_CUDA PARENT_SCOPE)
55-
5654
# TODO: change the definitions to this target only
5755

5856
add_compile_definitions(GGML_CUDA_DMMV_X=${GGML_CUDA_DMMV_X})

0 commit comments

Comments
 (0)