@@ -103,6 +103,7 @@ option(LLAMA_VULKAN "llama: use Vulkan"
103
103
option (LLAMA_METAL "llama: use Metal" ${LLAMA_METAL_DEFAULT} )
104
104
option (LLAMA_METAL_NDEBUG "llama: disable Metal debugging" OFF )
105
105
option (LLAMA_METAL_SHADER_DEBUG "llama: compile Metal with -fno-fast-math" OFF )
106
+ option (LLAMA_KOMPUTE "llama: use Kompute" OFF )
106
107
option (LLAMA_MPI "llama: use MPI" OFF )
107
108
option (LLAMA_QKK_64 "llama: use super-block size of 64 for k-quants" OFF )
108
109
option (LLAMA_SYCL "llama: use SYCL" OFF )
@@ -422,7 +423,13 @@ if (LLAMA_VULKAN)
422
423
if (Vulkan_FOUND)
423
424
message (STATUS "Vulkan found" )
424
425
426
+ set (GGML_HEADERS_VULKAN ggml-vulkan.h)
427
+ set (GGML_SOURCES_VULKAN ggml-vulkan.cpp)
428
+
425
429
add_library (ggml-vulkan STATIC ggml-vulkan.cpp ggml-vulkan.h)
430
+ if (BUILD_SHARED_LIBS )
431
+ set_target_properties (ggml-vulkan PROPERTIES POSITION_INDEPENDENT_CODE ON )
432
+ endif ()
426
433
target_link_libraries (ggml-vulkan PRIVATE Vulkan::Vulkan)
427
434
428
435
add_compile_definitions (GGML_USE_VULKAN)
@@ -478,7 +485,6 @@ if (LLAMA_HIPBLAS)
478
485
endif ()
479
486
endif ()
480
487
481
-
482
488
if (LLAMA_SYCL)
483
489
if ( NOT DEFINED ENV{ONEAPI_ROOT})
484
490
message (FATAL_ERROR "Not detect ENV {ONEAPI_ROOT}, please install oneAPI & source it, like: source /opt/intel/oneapi/setvars.sh" )
@@ -501,7 +507,165 @@ if (LLAMA_SYCL)
501
507
set (GGML_HEADERS_SYCL ggml.h ggml-sycl.h)
502
508
set (GGML_SOURCES_SYCL ggml-sycl.cpp)
503
509
504
- set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} sycl OpenCL mkl_core pthread m dl mkl_sycl_blas mkl_intel_ilp64 mkl_tbb_thread)
510
+ if (WIN32 )
511
+ set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} -fsycl sycl7 OpenCL mkl_sycl_blas_dll.lib mkl_intel_ilp64_dll.lib mkl_sequential_dll.lib mkl_core_dll.lib)
512
+ else ()
513
+ set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} -fsycl OpenCL mkl_core pthread m dl mkl_sycl_blas mkl_intel_ilp64 mkl_tbb_thread)
514
+ endif ()
515
+ endif ()
516
+
517
+ if (LLAMA_KOMPUTE)
518
+ add_compile_definitions (VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)
519
+ find_package (Vulkan COMPONENTS glslc REQUIRED)
520
+ find_program (glslc_executable NAMES glslc HINTS Vulkan::glslc)
521
+ if (NOT glslc_executable)
522
+ message (FATAL_ERROR "glslc not found" )
523
+ endif ()
524
+
525
+ function (compile_shader)
526
+ set (options )
527
+ set (oneValueArgs)
528
+ set (multiValueArgs SOURCES )
529
+ cmake_parse_arguments (compile_shader "${options} " "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
530
+ foreach (source ${compile_shader_SOURCES} )
531
+ get_filename_component (filename ${source} NAME )
532
+ set (spv_file ${filename} .spv)
533
+ add_custom_command (
534
+ OUTPUT ${spv_file}
535
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /${source}
536
+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/common.comp
537
+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/op_getrows.comp
538
+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/op_mul_mv_q_n_pre.comp
539
+ ${CMAKE_CURRENT_SOURCE_DIR} /kompute-shaders/op_mul_mv_q_n.comp
540
+ COMMAND ${glslc_executable} --target -env=vulkan1.2 -o ${spv_file} ${CMAKE_CURRENT_SOURCE_DIR} /${source}
541
+ COMMENT "Compiling ${source} to ${spv_file} "
542
+ )
543
+
544
+ get_filename_component (RAW_FILE_NAME ${spv_file} NAME )
545
+ set (FILE_NAME "shader${RAW_FILE_NAME} " )
546
+ string (REPLACE ".comp.spv" ".h" HEADER_FILE ${FILE_NAME} )
547
+ string (TOUPPER ${HEADER_FILE} HEADER_FILE_DEFINE)
548
+ string (REPLACE "." "_" HEADER_FILE_DEFINE "${HEADER_FILE_DEFINE} " )
549
+ set (OUTPUT_HEADER_FILE "${HEADER_FILE} " )
550
+ message (STATUS "${HEADER_FILE} generating ${HEADER_FILE_DEFINE} " )
551
+ if (CMAKE_GENERATOR MATCHES "Visual Studio" )
552
+ add_custom_command (
553
+ OUTPUT ${OUTPUT_HEADER_FILE}
554
+ COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
555
+ COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
556
+ COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
557
+ COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
558
+ COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
559
+ COMMAND ${CMAKE_BINARY_DIR} /bin/$<CONFIG>/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
560
+ COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
561
+ COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
562
+ DEPENDS ${spv_file} xxd
563
+ COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR} /bin/$<CONFIG>/xxd"
564
+ )
565
+ else ()
566
+ add_custom_command (
567
+ OUTPUT ${OUTPUT_HEADER_FILE}
568
+ COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
569
+ COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
570
+ COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
571
+ COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
572
+ COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
573
+ COMMAND ${CMAKE_BINARY_DIR} /bin/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
574
+ COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
575
+ COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
576
+ DEPENDS ${spv_file} xxd
577
+ COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR} /bin/xxd"
578
+ )
579
+ endif ()
580
+ endforeach ()
581
+ endfunction ()
582
+
583
+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR} /kompute/CMakeLists.txt" )
584
+ message (STATUS "Kompute found" )
585
+ set (KOMPUTE_OPT_LOG_LEVEL Error CACHE STRING "Kompute log level" )
586
+ add_subdirectory (kompute)
587
+
588
+ # Compile our shaders
589
+ compile_shader(SOURCES
590
+ kompute-shaders/op_scale.comp
591
+ kompute-shaders/op_scale_8.comp
592
+ kompute-shaders/op_add.comp
593
+ kompute-shaders/op_addrow.comp
594
+ kompute-shaders/op_mul.comp
595
+ kompute-shaders/op_silu.comp
596
+ kompute-shaders/op_relu.comp
597
+ kompute-shaders/op_gelu.comp
598
+ kompute-shaders/op_softmax.comp
599
+ kompute-shaders/op_norm.comp
600
+ kompute-shaders/op_rmsnorm.comp
601
+ kompute-shaders/op_diagmask.comp
602
+ kompute-shaders/op_mul_mat_mat_f32.comp
603
+ kompute-shaders/op_mul_mat_f16.comp
604
+ kompute-shaders/op_mul_mat_q8_0.comp
605
+ kompute-shaders/op_mul_mat_q4_0.comp
606
+ kompute-shaders/op_mul_mat_q4_1.comp
607
+ kompute-shaders/op_mul_mat_q6_k.comp
608
+ kompute-shaders/op_getrows_f16.comp
609
+ kompute-shaders/op_getrows_q4_0.comp
610
+ kompute-shaders/op_getrows_q4_1.comp
611
+ kompute-shaders/op_getrows_q6_k.comp
612
+ kompute-shaders/op_rope_f16.comp
613
+ kompute-shaders/op_rope_f32.comp
614
+ kompute-shaders/op_cpy_f16_f16.comp
615
+ kompute-shaders/op_cpy_f16_f32.comp
616
+ kompute-shaders/op_cpy_f32_f16.comp
617
+ kompute-shaders/op_cpy_f32_f32.comp
618
+ )
619
+
620
+ # Create a custom target for our generated shaders
621
+ add_custom_target (generated_shaders DEPENDS
622
+ shaderop_scale.h
623
+ shaderop_scale_8.h
624
+ shaderop_add.h
625
+ shaderop_addrow.h
626
+ shaderop_mul.h
627
+ shaderop_silu.h
628
+ shaderop_relu.h
629
+ shaderop_gelu.h
630
+ shaderop_softmax.h
631
+ shaderop_norm.h
632
+ shaderop_rmsnorm.h
633
+ shaderop_diagmask.h
634
+ shaderop_mul_mat_mat_f32.h
635
+ shaderop_mul_mat_f16.h
636
+ shaderop_mul_mat_q8_0.h
637
+ shaderop_mul_mat_q4_0.h
638
+ shaderop_mul_mat_q4_1.h
639
+ shaderop_mul_mat_q6_k.h
640
+ shaderop_getrows_f16.h
641
+ shaderop_getrows_q4_0.h
642
+ shaderop_getrows_q4_1.h
643
+ shaderop_getrows_q6_k.h
644
+ shaderop_rope_f16.h
645
+ shaderop_rope_f32.h
646
+ shaderop_cpy_f16_f16.h
647
+ shaderop_cpy_f16_f32.h
648
+ shaderop_cpy_f32_f16.h
649
+ shaderop_cpy_f32_f32.h
650
+ )
651
+
652
+ # Create a custom command that depends on the generated_shaders
653
+ add_custom_command (
654
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp
655
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp
656
+ DEPENDS generated_shaders
657
+ COMMENT "Ensuring shaders are generated before compiling ggml-kompute.cpp"
658
+ )
659
+
660
+ # Add the stamp to the main sources to ensure dependency tracking
661
+ set (GGML_SOURCES_KOMPUTE ggml-kompute.cpp ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp)
662
+ set (GGML_HEADERS_KOMPUTE ggml-kompute.h ${CMAKE_CURRENT_BINARY_DIR} /ggml-kompute.stamp)
663
+ add_compile_definitions (GGML_USE_KOMPUTE)
664
+ set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} kompute)
665
+ set (LLAMA_EXTRA_INCLUDES ${LLAMA_EXTRA_INCLUDES} ${CMAKE_BINARY_DIR} )
666
+ else ()
667
+ message (WARNING "Kompute not found" )
668
+ endif ()
505
669
endif ()
506
670
507
671
function (get_flags CCID CCVER)
@@ -846,12 +1010,14 @@ add_library(ggml OBJECT
846
1010
ggml-backend.h
847
1011
ggml-quants.c
848
1012
ggml-quants.h
849
- ${GGML_SOURCES_CUDA} ${GGML_HEADERS_CUDA}
850
- ${GGML_SOURCES_OPENCL} ${GGML_HEADERS_OPENCL}
851
- ${GGML_SOURCES_METAL} ${GGML_HEADERS_METAL}
852
- ${GGML_SOURCES_MPI} ${GGML_HEADERS_MPI}
853
- ${GGML_SOURCES_EXTRA} ${GGML_HEADERS_EXTRA}
854
- ${GGML_SOURCES_SYCL} ${GGML_HEADERS_SYCL}
1013
+ ${GGML_SOURCES_CUDA} ${GGML_HEADERS_CUDA}
1014
+ ${GGML_SOURCES_OPENCL} ${GGML_HEADERS_OPENCL}
1015
+ ${GGML_SOURCES_VULKAN} ${GGML_HEADERS_VULKAN}
1016
+ ${GGML_SOURCES_METAL} ${GGML_HEADERS_METAL}
1017
+ ${GGML_SOURCES_MPI} ${GGML_HEADERS_MPI}
1018
+ ${GGML_SOURCES_EXTRA} ${GGML_HEADERS_EXTRA}
1019
+ ${GGML_SOURCES_SYCL} ${GGML_HEADERS_SYCL}
1020
+ ${GGML_SOURCES_KOMPUTE} ${GGML_HEADERS_KOMPUTE}
855
1021
)
856
1022
857
1023
target_include_directories (ggml PUBLIC . ${LLAMA_EXTRA_INCLUDES} )
@@ -928,7 +1094,7 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/LlamaConfig.cmake
928
1094
DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/Llama)
929
1095
930
1096
set (GGML_PUBLIC_HEADERS "ggml.h" "ggml-alloc.h" "ggml-backend.h"
931
- "${GGML_HEADERS_CUDA} " "${GGML_HEADERS_OPENCL} "
1097
+ "${GGML_HEADERS_CUDA} " "${GGML_HEADERS_OPENCL} " " ${GGML_HEADERS_VULKAN} "
932
1098
"${GGML_HEADERS_METAL} " "${GGML_HEADERS_MPI} " "${GGML_HEADERS_EXTRA} " )
933
1099
934
1100
set_target_properties (ggml PROPERTIES PUBLIC_HEADER "${GGML_PUBLIC_HEADERS} " )
0 commit comments