@@ -103,6 +103,7 @@ option(LLAMA_VULKAN "llama: use Vulkan"
103103option (LLAMA_METAL "llama: use Metal" ${LLAMA_METAL_DEFAULT} )
104104option (LLAMA_METAL_NDEBUG "llama: disable Metal debugging" OFF )
105105option (LLAMA_METAL_SHADER_DEBUG "llama: compile Metal with -fno-fast-math" OFF )
106+ option (LLAMA_KOMPUTE "llama: use Kompute" OFF )
106107option (LLAMA_MPI "llama: use MPI" OFF )
107108option (LLAMA_QKK_64 "llama: use super-block size of 64 for k-quants" OFF )
108109option (LLAMA_SYCL "llama: use SYCL" OFF )
@@ -484,7 +485,6 @@ if (LLAMA_HIPBLAS)
484485 endif ()
485486endif ()
486487
487-
488488if (LLAMA_SYCL)
489489 if ( NOT DEFINED ENV{ONEAPI_ROOT})
490490 message (FATAL_ERROR "Not detect ENV {ONEAPI_ROOT}, please install oneAPI & source it, like: source /opt/intel/oneapi/setvars.sh" )
@@ -510,6 +510,160 @@ if (LLAMA_SYCL)
510510 set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} sycl OpenCL mkl_core pthread m dl mkl_sycl_blas mkl_intel_ilp64 mkl_tbb_thread)
511511endif ()
512512
513+ if (LLAMA_KOMPUTE)
514+ add_compile_definitions (VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)
515+ find_package (Vulkan COMPONENTS glslc REQUIRED)
516+ find_program (glslc_executable NAMES glslc HINTS Vulkan::glslc)
517+ if (NOT glslc_executable)
518+ message (FATAL_ERROR "glslc not found" )
519+ endif ()
520+
521+ function (compile_shader)
522+ set (options )
523+ set (oneValueArgs)
524+ set (multiValueArgs SOURCES )
525+ cmake_parse_arguments (compile_shader "${options} " "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
526+ foreach (source ${compile_shader_SOURCES} )
527+ get_filename_component (filename ${source} NAME )
528+ set (spv_file ${filename} .spv)
529+ add_custom_command (
530+ OUTPUT ${spv_file}
531+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /${source}
532+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/common.comp
533+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/op_getrows.comp
534+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/op_mul_mv_q_n_pre.comp
535+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/op_mul_mv_q_n.comp
536+ COMMAND ${glslc_executable} --target -env=vulkan1.2 -o ${spv_file} ${CMAKE_CURRENT_SOURCE_DIR} /${source}
537+ COMMENT "Compiling ${source} to ${spv_file} "
538+ )
539+
540+ get_filename_component (RAW_FILE_NAME ${spv_file} NAME )
541+ set (FILE_NAME "shader${RAW_FILE_NAME} " )
542+ string (REPLACE ".comp.spv" ".h" HEADER_FILE ${FILE_NAME} )
543+ string (TOUPPER ${HEADER_FILE} HEADER_FILE_DEFINE)
544+ string (REPLACE "." "_" HEADER_FILE_DEFINE "${HEADER_FILE_DEFINE} " )
545+ set (OUTPUT_HEADER_FILE "${HEADER_FILE} " )
546+ message (STATUS "${HEADER_FILE} generating ${HEADER_FILE_DEFINE} " )
547+ if (CMAKE_GENERATOR MATCHES "Visual Studio" )
548+ add_custom_command (
549+ OUTPUT ${OUTPUT_HEADER_FILE}
550+ COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
551+ COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
552+ COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
553+ COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
554+ COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
555+ COMMAND ${CMAKE_BINARY_DIR} /bin/$<CONFIG>/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
556+ COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
557+ COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
558+ DEPENDS ${spv_file} xxd
559+ COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR} /bin/$<CONFIG>/xxd"
560+ )
561+ else ()
562+ add_custom_command (
563+ OUTPUT ${OUTPUT_HEADER_FILE}
564+ COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
565+ COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
566+ COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
567+ COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
568+ COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
569+ COMMAND ${CMAKE_BINARY_DIR} /bin/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
570+ COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
571+ COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
572+ DEPENDS ${spv_file} xxd
573+ COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR} /bin/xxd"
574+ )
575+ endif ()
576+ endforeach ()
577+ endfunction ()
578+
579+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR} /kompute/CMakeLists.txt" )
580+ message (STATUS "Kompute found" )
581+ set (KOMPUTE_OPT_LOG_LEVEL Error CACHE STRING "Kompute log level" )
582+ add_subdirectory (kompute)
583+
584+ # Compile our shaders
585+ compile_shader(SOURCES
586+ kompute-shaders/op_scale.comp
587+ kompute-shaders/op_scale_8.comp
588+ kompute-shaders/op_add.comp
589+ kompute-shaders/op_addrow.comp
590+ kompute-shaders/op_mul.comp
591+ kompute-shaders/op_silu.comp
592+ kompute-shaders/op_relu.comp
593+ kompute-shaders/op_gelu.comp
594+ kompute-shaders/op_softmax.comp
595+ kompute-shaders/op_norm.comp
596+ kompute-shaders/op_rmsnorm.comp
597+ kompute-shaders/op_diagmask.comp
598+ kompute-shaders/op_mul_mat_mat_f32.comp
599+ kompute-shaders/op_mul_mat_f16.comp
600+ kompute-shaders/op_mul_mat_q8_0.comp
601+ kompute-shaders/op_mul_mat_q4_0.comp
602+ kompute-shaders/op_mul_mat_q4_1.comp
603+ kompute-shaders/op_mul_mat_q6_k.comp
604+ kompute-shaders/op_getrows_f16.comp
605+ kompute-shaders/op_getrows_q4_0.comp
606+ kompute-shaders/op_getrows_q4_1.comp
607+ kompute-shaders/op_getrows_q6_k.comp
608+ kompute-shaders/op_rope_f16.comp
609+ kompute-shaders/op_rope_f32.comp
610+ kompute-shaders/op_cpy_f16_f16.comp
611+ kompute-shaders/op_cpy_f16_f32.comp
612+ kompute-shaders/op_cpy_f32_f16.comp
613+ kompute-shaders/op_cpy_f32_f32.comp
614+ )
615+
616+ # Create a custom target for our generated shaders
617+ add_custom_target (generated_shaders DEPENDS
618+ shaderop_scale.h
619+ shaderop_scale_8.h
620+ shaderop_add.h
621+ shaderop_addrow.h
622+ shaderop_mul.h
623+ shaderop_silu.h
624+ shaderop_relu.h
625+ shaderop_gelu.h
626+ shaderop_softmax.h
627+ shaderop_norm.h
628+ shaderop_rmsnorm.h
629+ shaderop_diagmask.h
630+ shaderop_mul_mat_mat_f32.h
631+ shaderop_mul_mat_f16.h
632+ shaderop_mul_mat_q8_0.h
633+ shaderop_mul_mat_q4_0.h
634+ shaderop_mul_mat_q4_1.h
635+ shaderop_mul_mat_q6_k.h
636+ shaderop_getrows_f16.h
637+ shaderop_getrows_q4_0.h
638+ shaderop_getrows_q4_1.h
639+ shaderop_getrows_q6_k.h
640+ shaderop_rope_f16.h
641+ shaderop_rope_f32.h
642+ shaderop_cpy_f16_f16.h
643+ shaderop_cpy_f16_f32.h
644+ shaderop_cpy_f32_f16.h
645+ shaderop_cpy_f32_f32.h
646+ )
647+
648+ # Create a custom command that depends on the generated_shaders
649+ add_custom_command (
650+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp
651+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp
652+ DEPENDS generated_shaders
653+ COMMENT "Ensuring shaders are generated before compiling ggml-kompute.cpp"
654+ )
655+
656+ # Add the stamp to the main sources to ensure dependency tracking
657+ set (GGML_SOURCES_KOMPUTE ggml-kompute.cpp ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp)
658+ set (GGML_HEADERS_KOMPUTE ggml-kompute.h ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp)
659+ add_compile_definitions (GGML_USE_KOMPUTE)
660+ set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} kompute)
661+ set (LLAMA_EXTRA_INCLUDES ${LLAMA_EXTRA_INCLUDES} ${CMAKE_BINARY_DIR} )
662+ else ()
663+ message (WARNING "Kompute not found" )
664+ endif ()
665+ endif ()
666+
513667function (get_flags CCID CCVER)
514668 set (C_FLAGS "" )
515669 set (CXX_FLAGS "" )
@@ -852,13 +1006,14 @@ add_library(ggml OBJECT
8521006 ggml-backend.h
8531007 ggml-quants.c
8541008 ggml-quants.h
855- ${GGML_SOURCES_CUDA} ${GGML_HEADERS_CUDA}
856- ${GGML_SOURCES_OPENCL} ${GGML_HEADERS_OPENCL}
857- ${GGML_SOURCES_VULKAN} ${GGML_HEADERS_VULKAN}
858- ${GGML_SOURCES_METAL} ${GGML_HEADERS_METAL}
859- ${GGML_SOURCES_MPI} ${GGML_HEADERS_MPI}
860- ${GGML_SOURCES_EXTRA} ${GGML_HEADERS_EXTRA}
861- ${GGML_SOURCES_SYCL} ${GGML_HEADERS_SYCL}
1009+ ${GGML_SOURCES_CUDA} ${GGML_HEADERS_CUDA}
1010+ ${GGML_SOURCES_OPENCL} ${GGML_HEADERS_OPENCL}
1011+ ${GGML_SOURCES_VULKAN} ${GGML_HEADERS_VULKAN}
1012+ ${GGML_SOURCES_METAL} ${GGML_HEADERS_METAL}
1013+ ${GGML_SOURCES_MPI} ${GGML_HEADERS_MPI}
1014+ ${GGML_SOURCES_EXTRA} ${GGML_HEADERS_EXTRA}
1015+ ${GGML_SOURCES_SYCL} ${GGML_HEADERS_SYCL}
1016+ ${GGML_SOURCES_KOMPUTE} ${GGML_HEADERS_KOMPUTE}
8621017 )
8631018
8641019target_include_directories (ggml PUBLIC . ${LLAMA_EXTRA_INCLUDES} )
0 commit comments