char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
b6b003d2c
char/aliceai-t5-moe
1message ( STATUS "GGML_SYCL_TARGET= ${ GGML_SYCL_TARGET } " ) 2 3if ( NOT GGML_SYCL_TARGETMATCHES "^(INTEL) $ " ) 4message ( FATAL_ERROR "GGML_SYCL_TARGET: Invalid target, the supported options are [INTEL]" ) 5endif () 6 7check_cxx_compiler_flag ( "-fsycl" SUPPORTS_SYCL ) 8 9if ( DEFINED ENV{ONEAPI_ROOT}) 10message ( STATUS "Using oneAPI Release SYCL compiler (icpx)." ) 11elseif ( SUPPORTS_SYCL) 12message ( WARNING "Using open-source SYCL compiler (clang++). Didn't detect ENV {ONEAPI_ROOT}. 13If you expected the oneAPI Release compiler, please install oneAPI & source it, like: 14source /opt/intel/oneapi/setvars.sh" ) 15else () 16message ( FATAL_ERROR "C++ compiler lacks SYCL support." ) 17endif () 18message ( STATUS "SYCL found" ) 19#todo: AOT 20 21ggml_add_backend_library ( ggml-sycl 22ggml-sycl.cpp 23../../include/ggml-sycl.h 24) 25 26file ( GLOB GGML_HEADERS_SYCL "*.hpp" ) 27file ( GLOB GGML_SOURCES_SYCL "*.cpp" ) 28file ( GLOB SRCS "template-instances/fattn-tile*.cpp" ) 29list ( APPEND GGML_SOURCES_SYCL ${ SRCS }) 30file ( GLOB SRCS "template-instances/fattn-vec*.cpp" ) 31list ( APPEND GGML_SOURCES_SYCL ${ SRCS }) 32 33target_sources ( ggml-sycl PRIVATE ${ GGML_HEADERS_SYCL } ${ GGML_SOURCES_SYCL }) 34 35if ( WIN32) 36# To generate a Visual Studio solution, using Intel C++ Compiler for ggml-sycl is mandatory 37if ( ${ CMAKE_GENERATOR } MATCHES "Visual Studio" AND NOT (${ CMAKE_GENERATOR_TOOLSET } MATCHES "Intel C" )) 38set_target_properties ( ggml-sycl PROPERTIES VS_PLATFORM_TOOLSET "Intel C++ Compiler 2025" ) 39set ( CMAKE_CXX_COMPILER "icx" ) 40set ( CMAKE_CXX_COMPILER_ID "IntelLLVM" ) 41endif () 42# Level Zero SDK path for Windows (only when GGML_SYCL_SUPPORT_LEVEL_ZERO_API is enabled) 43if ( GGML_SYCL_SUPPORT_LEVEL_ZERO_API) 44if ( DEFINED ENV{LEVEL_ZERO_V1_SDK_PATH}) 45set ( LEVEL_ZERO_V1_SDK_PATH $ ENV { LEVEL_ZERO_V1_SDK_PATH }) 46if ( EXISTS " ${ LEVEL_ZERO_V1_SDK_PATH } " ) 47target_include_directories ( ggml-sycl PRIVATE " ${ LEVEL_ZERO_V1_SDK_PATH } /include" ) 48set ( LEVEL_ZERO_V1_SDK_LIB_PATH " ${ LEVEL_ZERO_V1_SDK_PATH } /lib" ) 49else () 50message ( WARNING "LEVEL_ZERO_V1_SDK_PATH set but folder not found: ${ LEVEL_ZERO_V1_SDK_PATH } " ) 51endif () 52endif () 53endif () 54endif () 55 56macro ( detect_and_find_package package_name ) 57set ( test_source " 58cmake_minimum_required(VERSION ${ CMAKE_VERSION } ) 59project(check_package LANGUAGES CXX) 60find_package( ${ package_name } QUIET) 61" ) 62 63set ( test_dir " ${ CMAKE_CURRENT_BINARY_DIR } /check_package_ ${ package_name } " ) 64file ( WRITE " ${ test_dir } /CMakeLists.txt" " ${ test_source } " ) 65 66set ( cmake_args "" ) 67if ( CMAKE_GENERATOR) 68list ( APPEND cmake_args "-G" " ${ CMAKE_GENERATOR } " ) 69endif () 70if ( CMAKE_GENERATOR_PLATFORM) 71list ( APPEND cmake_args "-A" " ${ CMAKE_GENERATOR_PLATFORM } " ) 72endif () 73if ( CMAKE_GENERATOR_TOOLSET) 74list ( APPEND cmake_args "-T" " ${ CMAKE_GENERATOR_TOOLSET } " ) 75endif () 76if ( CMAKE_CXX_COMPILER) 77list ( APPEND cmake_args "-DCMAKE_CXX_COMPILER= ${ CMAKE_CXX_COMPILER } " ) 78endif () 79 80execute_process ( 81COMMAND ${ CMAKE_COMMAND } ${ cmake_args } . 82WORKING_DIRECTORY " ${ test_dir } " 83RESULT_VARIABLE result 84OUTPUT_QUIET 85ERROR_QUIET 86) 87 88if ( resultEQUAL 0 ) 89find_package ( $ { package_name } ${ ARGN }) 90else () 91message ( WARNING "Detection of ${ package_name } failed. The package might be broken or incompatible." ) 92set ( $ { package_name } _FOUND FALSE ) 93endif () 94endmacro () 95 96detect_and_find_package ( IntelSYCL ) 97if ( IntelSYCL_FOUND) 98# Use oneAPI CMake when possible 99target_link_libraries ( ggml-sycl PRIVATE IntelSYCL::SYCL_CXX ) 100else () 101# Fallback to the simplest way of enabling SYCL when using intel/llvm nightly for instance 102target_compile_options ( ggml-sycl PRIVATE "-fsycl" ) 103target_link_options ( ggml-sycl PRIVATE "-fsycl" ) 104endif () 105 106target_compile_options ( ggml-sycl PRIVATE "-Wno-narrowing" ) 107 108message ( STATUS "GGML_SYCL_SUPPORT_LEVEL_ZERO_API ${ GGML_SYCL_SUPPORT_LEVEL_ZERO_API } " ) 109if ( GGML_SYCL_SUPPORT_LEVEL_ZERO_API) 110# Link against Level Zero loader for direct device memory allocation. 111# Avoids sycl::malloc_device triggering DMA-buf/TTM system RAM staging 112# in the xe kernel driver during multi-GPU inference. 113find_path ( LEVEL_ZERO_DEV_INCLUDE_DIR level_zero/ze_api.h HINTS ${ ONEAPI_ROOT } /include ${ LEVEL_ZERO_V1_SDK_PATH } /include ) 114find_library ( ZE_LOADER_LIB ze_loader HINTS ${ ONEAPI_ROOT } /lib ${ LEVEL_ZERO_V1_SDK_LIB_PATH } ENV LD_LIBRARY_PATH ) 115if ( ZE_LOADER_LIBAND LEVEL_ZERO_DEV_INCLUDE_DIR) 116target_link_libraries ( ggml-sycl PRIVATE ${ ZE_LOADER_LIB }) 117target_compile_definitions ( ggml-sycl PRIVATE GGML_SYCL_SUPPORT_LEVEL_ZERO_API ) 118message ( STATUS "Level Zero loader found: ${ ZE_LOADER_LIB } " ) 119message ( STATUS "Level Zero development headers found: ${ LEVEL_ZERO_DEV_INCLUDE_DIR } " ) 120else () 121message ( WARNING "Level Zero loader or development headers not found, " 122"Level Zero API support disabled. " 123"Please install the Level Zero SDK/development package " 124"to support Level Zero API features. " 125"Level Zero API is not mandatory for SYCL backend, " 126"but it is required by the special features for better " 127"function & performance on Intel GPUs." ) 128endif () 129endif () 130 131# Link against oneDNN 132set ( GGML_SYCL_DNNL 0 ) 133if ( GGML_SYCL_DNN) 134find_package ( DNNL ) 135if ( DNNL_FOUND) 136if ( NOT DEFINED DNNL_GPU_VENDOR) 137# default to intel target 138set ( DNNL_GPU_VENDOR "INTEL" ) 139if ( NOT " ${ GGML_SYCL_TARGET } " STREQUAL "INTEL" ) 140message ( WARNING "oneDNN builds bundled with oneapi release only support INTEL target" ) 141endif () 142endif () 143 144# Verify oneDNN was compiled for the same target as llama 145if ( " ${ GGML_SYCL_TARGET } " STREQUAL " ${ DNNL_GPU_VENDOR } " ) 146target_link_libraries ( ggml-sycl PRIVATE DNNL::dnnl ) 147set ( GGML_SYCL_DNNL 1 ) 148get_target_property ( CONFIGS DNNL::dnnl IMPORTED_CONFIGURATIONS ) 149foreach ( CONFIG${ CONFIGS }) 150get_target_property ( DNNL_LIB DNNL::dnnl IMPORTED_LOCATION_ ${ CONFIG }) 151message ( STATUS "Found oneDNN: ${ DNNL_LIB } " ) 152endforeach () 153else () 154message ( WARNING 155"oneDNN must be compiled for the same target as llama.cpp. 156llama.cpp: ${ GGML_SYCL_TARGET } , oneDNN: ${ DNNL_GPU_VENDOR } . 157Disabling oneDNN support." ) 158endif () 159else () 160message ( STATUS "oneDNN not found, disabling oneDNN support" ) 161endif () 162else () 163message ( STATUS "oneDNN support disabled by the user" ) 164endif () 165target_compile_definitions ( ggml-sycl PRIVATE GGML_SYCL_DNNL= ${ GGML_SYCL_DNNL }) 166 167if ( GGML_SYCL_F16) 168add_compile_definitions ( GGML_SYCL_F16 ) 169endif () 170 171if ( GGML_SYCL_TARGETSTREQUAL "INTEL" ) 172add_compile_definitions ( GGML_SYCL_WARP_SIZE=16 ) 173if ( NOT GGML_SYCL_DEVICE_ARCH) 174target_link_options ( ggml-sycl PRIVATE -Xs -ze-intel-greater-than-4GB-buffer-required ) 175else () 176message ( STATUS "Skipping -ze-intel-greater-than-4GB-buffer-required for spir64_gen AOT" ) 177endif () 178 179# Link against Intel oneMKL 180if ( CMAKE_CXX_COMPILER_IDSTREQUAL "Clang" ) 181set ( SYCL_COMPILER ON ) 182endif () 183find_package ( MKL REQUIRED ) 184target_link_libraries ( ggml-sycl PRIVATE MKL::MKL_SYCL::BLAS ) 185else () 186# default for other target 187message ( FATAL_ERROR "GGML_SYCL_TARGET is not supported" ) 188add_compile_definitions ( GGML_SYCL_WARP_SIZE=32 ) 189endif () 190 191if ( GGML_SYCL_GRAPH) 192message ( STATUS "find GGML_SYCL_GRAPH" ) 193target_compile_definitions ( ggml-sycl PRIVATE GGML_SYCL_GRAPH ) 194endif () 195 196if ( GGML_SYCL_HOST_MEM_FALLBACK) 197message ( STATUS "find GGML_SYCL_HOST_MEM_FALLBACK" ) 198target_compile_definitions ( ggml-sycl PRIVATE GGML_SYCL_HOST_MEM_FALLBACK ) 199endif () 200 201if ( GGML_SYCL_DEVICE_ARCH) 202message ( STATUS "GGML_SYCL_DEVICE_ARCH= ${ GGML_SYCL_DEVICE_ARCH } (AOT via spir64_gen)" ) 203target_compile_options ( 204ggml-sycl PRIVATE 205-fsycl-targets=spir64_gen 206"SHELL:-Xsycl-target-backend=spir64_gen \"-device ${ GGML_SYCL_DEVICE_ARCH } \"" 207) 208 209# Pass through parallel job (process) count for parallelising the 210# `llvm-foreach -- ocloc` invocation for compiling AOT device images. 211include ( ProcessorCount ) 212ProcessorCount ( _ggml_sycl_nproc ) 213if ( _ggml_sycl_nprocLESS 1 ) 214set ( _ggml_sycl_nproc 1 ) 215endif () 216set ( GGML_SYCL_MAX_PARALLEL_LINK_JOBS ${ _ggml_sycl_nproc } CACHE STRING 217"Parallel ocloc jobs for spir64_gen AOT device-image lowering" ) 218target_link_options ( 219ggml-sycl PRIVATE 220-fsycl-targets=spir64_gen 221"SHELL:-Xsycl-target-backend=spir64_gen \"-device ${ GGML_SYCL_DEVICE_ARCH } \"" 222-fsycl-max-parallel-link-jobs= ${ GGML_SYCL_MAX_PARALLEL_LINK_JOBS } 223) 224endif ()