char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
2cfdb5fc0
char/aliceai-t5-moe
1cmake_minimum_required ( VERSION 3.19 ) 2cmake_policy ( SET CMP0114 NEW ) 3cmake_policy ( SET CMP0116 NEW ) 4if ( POLICY CMP0147) 5# Parallel build custom build steps 6cmake_policy ( SET CMP0147 NEW ) 7endif () 8 9find_package ( Vulkan COMPONENTS glslc REQUIRED ) 10 11if ( DEFINED ENV{VULKAN_SDK}) 12list ( APPEND CMAKE_PREFIX_PATH " $ ENV { VULKAN_SDK } " ) 13endif () 14find_package ( SPIRV-Headers CONFIG REQUIRED ) 15 16if ( CMAKE_CXX_COMPILER_IDSTREQUAL "MSVC" ) 17# Parallel build object files 18add_definitions ( /MP ) 19endif () 20 21function ( detect_host_compiler ) 22if ( CMAKE_HOST_SYSTEM_NAMESTREQUAL "Windows" ) 23find_program ( HOST_C_COMPILER NAMES cl gcc clang NO_CMAKE_FIND_ROOT_PATH ) 24find_program ( HOST_CXX_COMPILER NAMES cl g++ clang++ NO_CMAKE_FIND_ROOT_PATH ) 25else () 26find_program ( HOST_C_COMPILER NAMES gcc clang NO_CMAKE_FIND_ROOT_PATH ) 27find_program ( HOST_CXX_COMPILER NAMES g++ clang++ NO_CMAKE_FIND_ROOT_PATH ) 28endif () 29set ( HOST_C_COMPILER " ${ HOST_C_COMPILER } " PARENT_SCOPE ) 30set ( HOST_CXX_COMPILER " ${ HOST_CXX_COMPILER } " PARENT_SCOPE ) 31endfunction () 32 33# Function to test shader extension support 34# Parameters: 35# EXTENSION_NAME - Name of the extension to test (e.g., "GL_EXT_integer_dot_product") 36# TEST_SHADER_FILE - Path to the test shader file 37# RESULT_VARIABLE - Name of the variable to set (ON/OFF) based on test result 38function ( test_shader_extension_support EXTENSION_NAME TEST_SHADER_FILE RESULT_VARIABLE ) 39execute_process ( 40COMMAND ${ Vulkan_GLSLC_EXECUTABLE } -o - -fshader-stage=compute --target-env=vulkan1.3 " ${ TEST_SHADER_FILE } " 41OUTPUT_VARIABLE glslc_output 42ERROR_VARIABLE glslc_error 43) 44 45if (${ glslc_error } MATCHES ".*extension not supported: ${ EXTENSION_NAME } .*" ) 46message ( STATUS " ${ EXTENSION_NAME } not supported by glslc" ) 47set ( $ { RESULT_VARIABLE } OFF PARENT_SCOPE ) 48else () 49message ( STATUS " ${ EXTENSION_NAME } supported by glslc" ) 50set ( $ { RESULT_VARIABLE } ON PARENT_SCOPE ) 51add_compile_definitions ( $ { RESULT_VARIABLE }) 52 53# Ensure the extension support is forwarded to vulkan-shaders-gen 54list ( APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -D ${ RESULT_VARIABLE } =ON ) 55set ( VULKAN_SHADER_GEN_CMAKE_ARGS " ${ VULKAN_SHADER_GEN_CMAKE_ARGS } " PARENT_SCOPE ) 56endif () 57endfunction () 58 59if ( Vulkan_FOUND) 60message ( STATUS "Vulkan found" ) 61 62ggml_add_backend_library ( ggml-vulkan 63ggml-vulkan.cpp 64../../include/ggml-vulkan.h 65) 66 67set ( VULKAN_SHADER_GEN_CMAKE_ARGS "" ) 68 69# Test all shader extensions 70test_shader_extension_support ( 71"GL_KHR_cooperative_matrix" 72" ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders/feature-tests/coopmat.comp" 73"GGML_VULKAN_COOPMAT_GLSLC_SUPPORT" 74) 75 76test_shader_extension_support ( 77"GL_NV_cooperative_matrix2" 78" ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders/feature-tests/coopmat2.comp" 79"GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT" 80) 81 82test_shader_extension_support ( 83"GL_NV_cooperative_matrix_decode_vector" 84" ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders/feature-tests/coopmat2_decode_vector.comp" 85"GGML_VULKAN_COOPMAT2_DECODE_VECTOR_GLSLC_SUPPORT" 86) 87 88test_shader_extension_support ( 89"GL_EXT_integer_dot_product" 90" ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders/feature-tests/integer_dot.comp" 91"GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT" 92) 93 94test_shader_extension_support ( 95"GL_EXT_bfloat16" 96" ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders/feature-tests/bfloat16.comp" 97"GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT" 98) 99 100test_shader_extension_support ( 101"GL_EXT_float_e2m1" 102" ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders/feature-tests/float_e2m1.comp" 103"GGML_VULKAN_FLOAT_E2M1_GLSLC_SUPPORT" 104) 105 106test_shader_extension_support ( 107"GL_EXT_float_e4m3" 108" ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders/feature-tests/float_e4m3.comp" 109"GGML_VULKAN_FLOAT_E4M3_GLSLC_SUPPORT" 110) 111 112target_link_libraries ( ggml-vulkan PRIVATE Vulkan::Vulkan ) 113target_include_directories ( ggml-vulkan PRIVATE ${ CMAKE_CURRENT_BINARY_DIR }) 114 115# Workaround to the "can't dereference invalidated vector iterator" bug in clang-cl debug build 116# Possibly relevant: https://stackoverflow.com/questions/74748276/visual-studio-no-displays-the-correct-length-of-stdvector 117if ( MSVCAND CMAKE_CXX_COMPILER_IDSTREQUAL "Clang" ) 118add_compile_definitions ( _ITERATOR_DEBUG_LEVEL=0 ) 119endif () 120 121if ( GGML_VULKAN_CHECK_RESULTS) 122add_compile_definitions ( GGML_VULKAN_CHECK_RESULTS ) 123# the result-checking path computes a CPU reference graph via 124# ggml_graph_compute_with_ctx(), which is defined in ggml-cpu 125target_link_libraries ( ggml-vulkan PRIVATE ggml-cpu ) 126endif () 127 128if ( GGML_VULKAN_DEBUG) 129add_compile_definitions ( GGML_VULKAN_DEBUG ) 130endif () 131 132if ( GGML_VULKAN_MEMORY_DEBUG) 133add_compile_definitions ( GGML_VULKAN_MEMORY_DEBUG ) 134endif () 135 136if ( GGML_VULKAN_SHADER_DEBUG_INFO) 137add_compile_definitions ( GGML_VULKAN_SHADER_DEBUG_INFO ) 138list ( APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -DGGML_VULKAN_SHADER_DEBUG_INFO=ON ) 139endif () 140 141if ( GGML_VULKAN_VALIDATE) 142add_compile_definitions ( GGML_VULKAN_VALIDATE ) 143endif () 144 145if ( GGML_VULKAN_RUN_TESTS) 146add_compile_definitions ( GGML_VULKAN_RUN_TESTS ) 147# the test path also calls ggml_graph_compute_with_ctx() (ggml-cpu) 148target_link_libraries ( ggml-vulkan PRIVATE ggml-cpu ) 149endif () 150 151# Set up toolchain for host compilation whether cross-compiling or not 152if ( CMAKE_CROSSCOMPILING) 153if ( GGML_VULKAN_SHADERS_GEN_TOOLCHAIN) 154set ( HOST_CMAKE_TOOLCHAIN_FILE ${ GGML_VULKAN_SHADERS_GEN_TOOLCHAIN }) 155else () 156detect_host_compiler () 157if ( NOT HOST_C_COMPILEROR NOT HOST_CXX_COMPILER) 158message ( FATAL_ERROR "Host compiler not found" ) 159else () 160message ( STATUS "Host compiler: ${ HOST_C_COMPILER } ${ HOST_CXX_COMPILER } " ) 161endif () 162configure_file ( $ { CMAKE_CURRENT_SOURCE_DIR } /cmake/host-toolchain.cmake.in ${ CMAKE_BINARY_DIR } /host-toolchain.cmake @ONLY ) 163set ( HOST_CMAKE_TOOLCHAIN_FILE ${ CMAKE_BINARY_DIR } /host-toolchain.cmake ) 164endif () 165else () 166# For non-cross-compiling, use empty toolchain (use host compiler) 167set ( HOST_CMAKE_TOOLCHAIN_FILE "" ) 168endif () 169 170include ( ExternalProject ) 171 172if ( CMAKE_CROSSCOMPILING) 173list ( APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE= ${ HOST_CMAKE_TOOLCHAIN_FILE }) 174message ( STATUS "vulkan-shaders-gen toolchain file: ${ HOST_CMAKE_TOOLCHAIN_FILE } " ) 175endif () 176 177ExternalProject_Add ( 178vulkan-shaders-gen 179SOURCE_DIR ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders 180CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= ${ CMAKE_BINARY_DIR } / $ <CONFIG> 181-DCMAKE_INSTALL_BINDIR=. 182-DCMAKE_BUILD_TYPE= $ <CONFIG> 183${ VULKAN_SHADER_GEN_CMAKE_ARGS } 184 185BUILD_COMMAND ${ CMAKE_COMMAND } --build . --config $ <CONFIG> 186BUILD_ALWAYS TRUE 187 188# NOTE: When DESTDIR is set using Makefile generators and 189# "make install" triggers the build step, vulkan-shaders-gen 190# would be installed into the DESTDIR prefix, so it is unset 191# to ensure that does not happen. 192 193INSTALL_COMMAND ${ CMAKE_COMMAND } -E env --unset=DESTDIR 194${ CMAKE_COMMAND } --install . --config $ <CONFIG> 195) 196 197set ( _ggml_vk_host_suffix $ <IF: $ <STREQUAL: ${ CMAKE_HOST_SYSTEM_NAME } ,Windows>,.exe,> ) 198set ( _ggml_vk_genshaders_dir " ${ CMAKE_BINARY_DIR } / $ <CONFIG>" ) 199set ( _ggml_vk_genshaders_cmd " ${ _ggml_vk_genshaders_dir } /vulkan-shaders-gen ${ _ggml_vk_host_suffix } " ) 200set ( _ggml_vk_header " ${ CMAKE_CURRENT_BINARY_DIR } /ggml-vulkan-shaders.hpp" ) 201set ( _ggml_vk_input_dir " ${ CMAKE_CURRENT_SOURCE_DIR } /vulkan-shaders" ) 202set ( _ggml_vk_output_dir " ${ CMAKE_CURRENT_BINARY_DIR } /vulkan-shaders.spv" ) 203set ( _ggml_vk_generated_shader_files ${ _ggml_vk_header }) 204 205file ( GLOB _ggml_vk_shader_files CONFIGURE_DEPENDS " ${ _ggml_vk_input_dir } /*.comp" ) 206set_source_files_properties ( $ { _ggml_vk_shader_files } PROPERTIES HEADER_FILE_ONLY TRUE ) 207target_sources ( ggml-vulkan PRIVATE ${ _ggml_vk_shader_files }) 208 209# Because external projects do not provide source-level tracking, 210# the vulkan-shaders-gen sources need to be explicitly added to 211# ensure that changes will cascade into shader re-generation. 212 213file ( GLOB _ggml_vk_shaders_gen_sources 214CONFIGURE_DEPENDS " ${ _ggml_vk_input_dir } /*.cpp" 215" ${ _ggml_vk_input_dir } /*.h" ) 216 217add_custom_command ( 218OUTPUT ${ _ggml_vk_header } 219COMMAND ${ _ggml_vk_genshaders_cmd } 220--output-dir ${ _ggml_vk_output_dir } 221--target-hpp ${ _ggml_vk_header } 222DEPENDS ${ _ggml_vk_shaders_gen_sources } 223vulkan-shaders-gen 224COMMENT "Generate vulkan shaders header" 225) 226target_sources ( ggml-vulkan PRIVATE ${ _ggml_vk_header }) 227 228foreach ( file_full${ _ggml_vk_shader_files }) 229get_filename_component ( file ${ file_full } NAME ) 230set ( _ggml_vk_target_cpp " ${ CMAKE_CURRENT_BINARY_DIR } / ${ file } .cpp" ) 231 232add_custom_command ( 233OUTPUT ${ _ggml_vk_target_cpp } 234DEPFILE ${ _ggml_vk_target_cpp } .d 235COMMAND ${ _ggml_vk_genshaders_cmd } 236--glslc ${ Vulkan_GLSLC_EXECUTABLE } 237--source ${ file_full } 238--output-dir ${ _ggml_vk_output_dir } 239--target-hpp ${ _ggml_vk_header } 240--target-cpp ${ _ggml_vk_target_cpp } 241DEPENDS ${ file_full } 242${ _ggml_vk_shaders_gen_sources } 243vulkan-shaders-gen 244COMMENT "Generate vulkan shaders for ${ file } " 245) 246target_sources ( ggml-vulkan PRIVATE ${ _ggml_vk_target_cpp }) 247list ( APPEND _ggml_vk_generated_shader_files ${ _ggml_vk_target_cpp }) 248endforeach () 249 250source_group ( "Vulkan shaders" FILES ${ _ggml_vk_shader_files }) 251source_group ( "Generated Vulkan shaders" FILES ${ _ggml_vk_generated_shader_files }) 252else () 253message ( WARNING "Vulkan not found" ) 254endif ()