char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
2f539596c
char/aliceai-t5-moe
1function ( ggml_add_cpu_backend_features cpu_name arch ) 2# The feature detection code is compiled as a separate target so that 3# it can be built without the architecture flags 4# Since multiple variants of the CPU backend may be included in the same 5# build, using set_source_files_properties() to set the arch flags is not possible 6set ( GGML_CPU_FEATS_NAME ${ cpu_name } -feats ) 7add_library ( $ { GGML_CPU_FEATS_NAME } OBJECT ggml-cpu/arch/ ${ arch } /cpu-feats.cpp ) 8target_include_directories ( $ { GGML_CPU_FEATS_NAME } PRIVATE . ../include ) 9target_compile_definitions ( $ { GGML_CPU_FEATS_NAME } PRIVATE ${ ARGN }) 10target_compile_definitions ( $ { GGML_CPU_FEATS_NAME } PRIVATE GGML_BACKEND_DL GGML_BACKEND_BUILD GGML_BACKEND_SHARED ) 11set_target_properties ( $ { GGML_CPU_FEATS_NAME } PROPERTIES POSITION_INDEPENDENT_CODE ON ) 12# Disable LTO for the feature detection code to prevent cross-module optimization 13# from inlining architecture-specific instructions into the score function. 14# Without this, LTO can cause SIGILL when loading backends on older CPUs 15# (e.g., loading power10 backend on power9 crashes before feature check runs). 16target_compile_options ( $ { GGML_CPU_FEATS_NAME } PRIVATE -fno-lto ) 17target_link_libraries ( $ { cpu_name } PRIVATE ${ GGML_CPU_FEATS_NAME }) 18endfunction () 19 20function ( ggml_add_cpu_backend_variant_impl tag_name ) 21if ( tag_name) 22set ( GGML_CPU_NAME ggml-cpu- ${ tag_name }) 23else () 24set ( GGML_CPU_NAME ggml-cpu ) 25endif () 26 27ggml_add_backend_library ( $ { GGML_CPU_NAME }) 28 29list ( APPEND GGML_CPU_SOURCES 30ggml-cpu/ggml-cpu.c 31ggml-cpu/ggml-cpu.cpp 32ggml-cpu/repack.cpp 33ggml-cpu/repack.h 34ggml-cpu/iqp.cpp 35ggml-cpu/iqp.h 36ggml-cpu/hbm.cpp 37ggml-cpu/hbm.h 38ggml-cpu/quants.c 39ggml-cpu/quants.h 40ggml-cpu/traits.cpp 41ggml-cpu/traits.h 42ggml-cpu/amx/amx.cpp 43ggml-cpu/amx/amx.h 44ggml-cpu/amx/mmq.cpp 45ggml-cpu/amx/mmq.h 46ggml-cpu/ggml-cpu-impl.h 47ggml-cpu/common.h 48ggml-cpu/binary-ops.h 49ggml-cpu/binary-ops.cpp 50ggml-cpu/unary-ops.h 51ggml-cpu/unary-ops.cpp 52ggml-cpu/simd-mappings.h 53ggml-cpu/vec.h 54ggml-cpu/vec.cpp 55ggml-cpu/ops.h 56ggml-cpu/ops.cpp 57) 58 59target_compile_features ( $ { GGML_CPU_NAME } PRIVATE c_std_11 cxx_std_17 ) 60target_include_directories ( $ { GGML_CPU_NAME } PRIVATE . ggml-cpu ) 61 62if ( APPLEAND GGML_ACCELERATE) 63find_library ( ACCELERATE_FRAMEWORK Accelerate ) 64if ( ACCELERATE_FRAMEWORK) 65message ( STATUS "Accelerate framework found" ) 66 67target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE GGML_USE_ACCELERATE ) 68target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE ACCELERATE_NEW_LAPACK ) 69target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE ACCELERATE_LAPACK_ILP64 ) 70 71target_link_libraries ( $ { GGML_CPU_NAME } PRIVATE ${ ACCELERATE_FRAMEWORK }) 72else () 73message ( WARNING "Accelerate framework not found" ) 74endif () 75endif () 76 77if ( GGML_OPENMP_ENABLED) 78target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE GGML_USE_OPENMP ) 79target_link_libraries ( $ { GGML_CPU_NAME } PRIVATE ${ GGML_OPENMP_TARGET_C } ${ GGML_OPENMP_TARGET_CXX }) 80endif () 81 82if ( GGML_LLAMAFILE) 83target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE GGML_USE_LLAMAFILE ) 84 85list ( APPEND GGML_CPU_SOURCES 86ggml-cpu/llamafile/sgemm.cpp 87ggml-cpu/llamafile/sgemm.h ) 88endif () 89 90if ( GGML_CPU_HBM) 91find_library ( memkind memkind REQUIRED ) 92 93message ( STATUS "Using memkind for CPU HBM" ) 94 95target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE GGML_USE_CPU_HBM ) 96 97target_link_libraries ( $ { GGML_CPU_NAME } PUBLIC memkind ) 98endif () 99 100if ( GGML_SYSTEM_ARCHSTREQUAL "ARM" ) 101message ( STATUS "ARM detected" ) 102list ( APPEND GGML_CPU_SOURCES 103ggml-cpu/arch/arm/quants.c 104ggml-cpu/arch/arm/repack.cpp 105) 106 107if ( MSVCAND NOT CMAKE_C_COMPILER_IDSTREQUAL "Clang" ) 108message ( FATAL_ERROR "MSVC is not supported for ARM, use clang" ) 109else () 110check_cxx_compiler_flag ( -mfp16-format=ieee GGML_COMPILER_SUPPORTS_FP16_FORMAT_I3E ) 111if ( NOT " ${ GGML_COMPILER_SUPPORTS_FP16_FORMAT_I3E } " STREQUAL "" ) 112list ( APPEND ARCH_FLAGS -mfp16-format=ieee ) 113endif () 114 115if ( GGML_NATIVE) 116# -mcpu=native does not always enable all the features in some compilers, 117# so we check for them manually and enable them if available 118 119execute_process ( 120COMMAND ${ CMAKE_C_COMPILER } -mcpu=native -E -v - 121INPUT_FILE "/dev/null" 122OUTPUT_QUIET 123ERROR_VARIABLE ARM_MCPU 124RESULT_VARIABLE ARM_MCPU_RESULT 125) 126if ( NOT ARM_MCPU_RESULT) 127string ( REGEX MATCH "-mcpu=[^ ']+" ARM_MCPU_FLAG " ${ ARM_MCPU } " ) 128string ( REGEX MATCH "-march=[^ ']+" ARM_MARCH_FLAG " ${ ARM_MCPU } " ) 129 130# on some old GCC we need to read -march= 131if ( ARM_MARCH_FLAGAND NOT " ${ ARM_MARCH_FLAG } " STREQUAL "-march=native" ) 132set ( ARM_NATIVE_FLAG " ${ ARM_MARCH_FLAG } " ) 133elseif ( ARM_MCPU_FLAGAND NOT " ${ ARM_MCPU_FLAG } " STREQUAL "-mcpu=native" ) 134set ( ARM_NATIVE_FLAG " ${ ARM_MCPU_FLAG } " ) 135endif () 136endif () 137 138if ( " ${ ARM_NATIVE_FLAG } " STREQUAL "" ) 139set ( ARM_NATIVE_FLAG -mcpu=native ) 140message ( WARNING "ARM -march/-mcpu not found, -mcpu=native will be used" ) 141else () 142message ( STATUS "ARM detected flags: ${ ARM_NATIVE_FLAG } " ) 143endif () 144 145include ( CheckCXXSourceRuns ) 146 147macro ( check_arm_feature tag feature code ) 148set ( CMAKE_REQUIRED_FLAGS_SAVE ${ CMAKE_REQUIRED_FLAGS }) 149set ( CMAKE_REQUIRED_FLAGS " ${ ARM_NATIVE_FLAG } + ${ tag } " ) 150check_cxx_source_runs ( " ${ code } " GGML_MACHINE_SUPPORTS_ ${ tag }) 151if ( GGML_MACHINE_SUPPORTS_${ tag }) 152set ( ARM_NATIVE_FLAG_FIX " ${ ARM_NATIVE_FLAG_FIX } + ${ tag } " ) 153else () 154set ( CMAKE_REQUIRED_FLAGS " ${ ARM_NATIVE_FLAG } +no ${ tag } " ) 155check_cxx_source_compiles ( "int main() { return 0; }" GGML_MACHINE_SUPPORTS_no ${ tag }) 156if ( GGML_MACHINE_SUPPORTS_no${ tag }) 157set ( ARM_NATIVE_FLAG_FIX " ${ ARM_NATIVE_FLAG_FIX } +no ${ tag } " ) 158list ( APPEND ARCH_FLAGS -U__ARM_FEATURE_ ${ feature }) 159endif () 160endif () 161set ( CMAKE_REQUIRED_FLAGS ${ CMAKE_REQUIRED_FLAGS_SAVE }) 162endmacro () 163 164check_arm_feature ( dotprod DOTPROD "#include <arm_neon.h>\nint main() { int8x16_t _a, _b; volatile int32x4_t _s = vdotq_s32(_s, _a, _b); return 0; }" ) 165check_arm_feature ( i8mm MATMUL_INT8 "#include <arm_neon.h>\nint main() { int8x16_t _a, _b; volatile int32x4_t _s = vmmlaq_s32(_s, _a, _b); return 0; }" ) 166check_arm_feature ( sve SVE "#include <arm_sve.h>\nint main() { svfloat32_t _a, _b; volatile svfloat32_t _c = svadd_f32_z(svptrue_b8(), _a, _b); return 0; }" ) 167check_arm_feature ( sme SME "#include <arm_sme.h>\n__arm_locally_streaming int main() { __asm__ volatile(\"smstart; smstop;\"); return 0; }" ) 168 169list ( APPEND ARCH_FLAGS " ${ ARM_NATIVE_FLAG }${ ARM_NATIVE_FLAG_FIX } " ) 170else () 171if ( GGML_CPU_ARM_ARCH) 172list ( APPEND ARCH_FLAGS -march= ${ GGML_CPU_ARM_ARCH }) 173elseif ( GGML_CPU_ALL_VARIANTS) 174# Begin with the lowest baseline 175set ( ARM_MCPU "armv8-a" ) 176set ( ARCH_TAGS "" ) 177set ( ARCH_DEFINITIONS "" ) 178 179# When a feature is selected, bump the MCPU to the first 180# version that supported it 181if ( GGML_INTERNAL_DOTPROD) 182set ( ARM_MCPU "armv8.2-a" ) 183set ( ARCH_TAGS " ${ ARCH_TAGS } +dotprod" ) 184list ( APPEND ARCH_DEFINITIONS GGML_USE_DOTPROD ) 185endif () 186if ( GGML_INTERNAL_FP16_VECTOR_ARITHMETIC) 187set ( ARM_MCPU "armv8.2-a" ) 188set ( ARCH_TAGS " ${ ARCH_TAGS } +fp16" ) 189list ( APPEND ARCH_DEFINITIONS GGML_USE_FP16_VECTOR_ARITHMETIC ) 190endif () 191if ( GGML_INTERNAL_SVE) 192set ( ARM_MCPU "armv8.2-a" ) 193set ( ARCH_TAGS " ${ ARCH_TAGS } +sve" ) 194list ( APPEND ARCH_DEFINITIONS GGML_USE_SVE ) 195endif () 196if ( GGML_INTERNAL_MATMUL_INT8) 197set ( ARM_MCPU "armv8.6-a" ) 198set ( ARCH_TAGS " ${ ARCH_TAGS } +i8mm" ) 199list ( APPEND ARCH_DEFINITIONS GGML_USE_MATMUL_INT8 ) 200endif () 201if ( GGML_INTERNAL_SVE2) 202set ( ARM_MCPU "armv8.6-a" ) 203set ( ARCH_TAGS " ${ ARCH_TAGS } +sve2" ) 204list ( APPEND ARCH_DEFINITIONS GGML_USE_SVE2 ) 205endif () 206if ( GGML_INTERNAL_NOSVE) 207set ( ARCH_TAGS " ${ ARCH_TAGS } +nosve" ) 208endif () 209if ( GGML_INTERNAL_SME) 210set ( ARM_MCPU "armv9.2-a" ) 211set ( ARCH_TAGS " ${ ARCH_TAGS } +sme" ) 212list ( APPEND ARCH_DEFINITIONS GGML_USE_SME ) 213endif () 214list ( APPEND ARCH_FLAGS "-march= ${ ARM_MCPU }${ ARCH_TAGS } " ) 215ggml_add_cpu_backend_features ( $ { GGML_CPU_NAME } arm ${ ARCH_DEFINITIONS }) 216endif () 217endif () 218 219message ( STATUS "Checking for ARM features using flags:" ) 220foreach ( flag IN LISTS ARCH_FLAGS) 221message ( STATUS " ${ flag } " ) 222endforeach () 223 224include ( CheckCXXSourceCompiles ) 225set ( CMAKE_REQUIRED_FLAGS_SAVE ${ CMAKE_REQUIRED_FLAGS }) 226string ( REPLACE ";" " " ARCH_FLAGS_STR " ${ ARCH_FLAGS } " ) 227set ( CMAKE_REQUIRED_FLAGS " ${ ARCH_FLAGS_STR } " ) 228foreach ( feature DOTPROD SVE MATMUL_INT8 FMA FP16_VECTOR_ARITHMETIC SME) 229set ( ARM_FEATURE "HAVE_ ${ feature } " ) 230check_cxx_source_compiles ( 231" 232#if !defined(__ARM_FEATURE_ ${ feature } ) 233# error \"Feature ${ feature } is not defined\" 234#endif 235int main() { return 0; } 236" 237${ ARM_FEATURE } 238) 239endforeach () 240set ( CMAKE_REQUIRED_FLAGS ${ CMAKE_REQUIRED_FLAGS_SAVE }) 241endif () 242elseif ( GGML_SYSTEM_ARCHSTREQUAL "x86" ) 243message ( STATUS "x86 detected" ) 244list ( APPEND GGML_CPU_SOURCES 245ggml-cpu/arch/x86/quants.c 246ggml-cpu/arch/x86/repack.cpp 247) 248 249if ( MSVC) 250# instruction set detection for MSVC only 251if ( GGML_NATIVE) 252include ( ggml-cpu/cmake/FindSIMD.cmake ) 253endif () 254if ( GGML_AVX512) 255list ( APPEND ARCH_FLAGS /arch:AVX512 ) 256# /arch:AVX512 includes: __AVX512F__, __AVX512CD__, __AVX512BW__, __AVX512DQ__, and __AVX512VL__ 257# MSVC has no compile-time flags enabling specific 258# AVX512 extensions, neither it defines the 259# macros corresponding to the extensions. 260# Do it manually. 261list ( APPEND ARCH_DEFINITIONS GGML_AVX512 ) 262if ( GGML_AVX512_VBMI) 263list ( APPEND ARCH_DEFINITIONS __AVX512VBMI__ ) 264if ( CMAKE_C_COMPILER_IDSTREQUAL "Clang" ) 265list ( APPEND ARCH_FLAGS -mavx512vbmi ) 266endif () 267endif () 268if ( GGML_AVX512_VNNI) 269list ( APPEND ARCH_DEFINITIONS __AVX512VNNI__ GGML_AVX512_VNNI ) 270if ( CMAKE_C_COMPILER_IDSTREQUAL "Clang" ) 271list ( APPEND ARCH_FLAGS -mavx512vnni ) 272endif () 273endif () 274if ( GGML_AVX512_BF16) 275list ( APPEND ARCH_DEFINITIONS __AVX512BF16__ GGML_AVX512_BF16 ) 276if ( CMAKE_C_COMPILER_IDSTREQUAL "Clang" ) 277list ( APPEND ARCH_FLAGS -mavx512bf16 ) 278endif () 279endif () 280if ( GGML_AMX_TILE) 281list ( APPEND ARCH_DEFINITIONS __AMX_TILE__ GGML_AMX_TILE ) 282endif () 283if ( GGML_AMX_INT8) 284list ( APPEND ARCH_DEFINITIONS __AMX_INT8__ GGML_AMX_INT8 ) 285endif () 286if ( GGML_AMX_BF16) 287list ( APPEND ARCH_DEFINITIONS __AMX_BF16__ GGML_AMX_BF16 ) 288endif () 289elseif ( GGML_AVX2) 290list ( APPEND ARCH_FLAGS /arch:AVX2 ) 291list ( APPEND ARCH_DEFINITIONS GGML_AVX2 GGML_FMA GGML_F16C ) 292elseif ( GGML_AVX) 293list ( APPEND ARCH_FLAGS /arch:AVX ) 294list ( APPEND ARCH_DEFINITIONS GGML_AVX ) 295elseif ( GGML_SSE42) 296list ( APPEND ARCH_FLAGS /arch:SSE4.2 ) 297list ( APPEND ARCH_DEFINITIONS GGML_SSE42 ) 298endif () 299if ( GGML_AVX_VNNI) 300list ( APPEND ARCH_DEFINITIONS __AVXVNNI__ GGML_AVX_VNNI ) 301endif () 302if ( GGML_BMI2) 303# MSVC does not define macro __BMI2__ 304list ( APPEND ARCH_DEFINITIONS __BMI2__ GGML_BMI2 ) 305endif () 306else () 307if ( GGML_NATIVE) 308list ( APPEND ARCH_FLAGS -march=native ) 309else () 310if ( GGML_SSE42) 311list ( APPEND ARCH_FLAGS -msse4.2 ) 312list ( APPEND ARCH_DEFINITIONS GGML_SSE42 ) 313endif () 314if ( GGML_F16C) 315list ( APPEND ARCH_FLAGS -mf16c ) 316list ( APPEND ARCH_DEFINITIONS GGML_F16C ) 317endif () 318if ( GGML_FMA) 319list ( APPEND ARCH_FLAGS -mfma ) 320list ( APPEND ARCH_DEFINITIONS GGML_FMA ) 321endif () 322if ( GGML_BMI2) 323list ( APPEND ARCH_FLAGS -mbmi2 ) 324list ( APPEND ARCH_DEFINITIONS GGML_BMI2 ) 325endif () 326if ( GGML_AVX) 327list ( APPEND ARCH_FLAGS -mavx ) 328list ( APPEND ARCH_DEFINITIONS GGML_AVX ) 329endif () 330if ( GGML_AVX2) 331list ( APPEND ARCH_FLAGS -mavx2 ) 332list ( APPEND ARCH_DEFINITIONS GGML_AVX2 ) 333endif () 334if ( GGML_AVX_VNNI) 335list ( APPEND ARCH_FLAGS -mavxvnni ) 336list ( APPEND ARCH_DEFINITIONS GGML_AVX_VNNI ) 337endif () 338if ( GGML_AVX512) 339list ( APPEND ARCH_FLAGS -mavx512f ) 340list ( APPEND ARCH_FLAGS -mavx512cd ) 341list ( APPEND ARCH_FLAGS -mavx512vl ) 342list ( APPEND ARCH_FLAGS -mavx512dq ) 343list ( APPEND ARCH_FLAGS -mavx512bw ) 344list ( APPEND ARCH_DEFINITIONS GGML_AVX512 ) 345endif () 346if ( GGML_AVX512_VBMI) 347list ( APPEND ARCH_FLAGS -mavx512vbmi ) 348list ( APPEND ARCH_DEFINITIONS GGML_AVX512_VBMI ) 349endif () 350if ( GGML_AVX512_VNNI) 351list ( APPEND ARCH_FLAGS -mavx512vnni ) 352list ( APPEND ARCH_DEFINITIONS GGML_AVX512_VNNI ) 353endif () 354if ( GGML_AVX512_BF16) 355list ( APPEND ARCH_FLAGS -mavx512bf16 ) 356list ( APPEND ARCH_DEFINITIONS GGML_AVX512_BF16 ) 357endif () 358if ( GGML_AMX_TILE) 359list ( APPEND ARCH_FLAGS -mamx-tile ) 360list ( APPEND ARCH_DEFINITIONS GGML_AMX_TILE ) 361endif () 362if ( GGML_AMX_INT8) 363list ( APPEND ARCH_FLAGS -mamx-int8 ) 364list ( APPEND ARCH_DEFINITIONS GGML_AMX_INT8 ) 365endif () 366if ( GGML_AMX_BF16) 367list ( APPEND ARCH_FLAGS -mamx-bf16 ) 368list ( APPEND ARCH_DEFINITIONS GGML_AMX_BF16 ) 369endif () 370endif () 371endif () 372 373if ( GGML_BACKEND_DL) 374if ( GGML_NATIVE) 375# the feature check relies on ARCH_DEFINITIONS, but it is not set with GGML_NATIVE 376message ( FATAL_ERROR "GGML_NATIVE is not compatible with GGML_BACKEND_DL, consider using GGML_CPU_ALL_VARIANTS" ) 377endif () 378ggml_add_cpu_backend_features ( $ { GGML_CPU_NAME } x86 ${ ARCH_DEFINITIONS }) 379endif () 380elseif ( GGML_SYSTEM_ARCHSTREQUAL "PowerPC" ) 381message ( STATUS "PowerPC detected" ) 382list ( APPEND GGML_CPU_SOURCES ggml-cpu/arch/powerpc/quants.c ) 383if ( GGML_NATIVE) 384if (${ CMAKE_SYSTEM_PROCESSOR } MATCHES "ppc64" ) 385file ( READ "/proc/cpuinfo" POWER10_M ) 386elseif (${ CMAKE_SYSTEM_PROCESSOR } MATCHES "powerpc" ) 387execute_process ( COMMAND bash -c "prtconf |grep 'Implementation' | head -n 1" OUTPUT_VARIABLE POWER10_M ) 388endif () 389 390string ( TOUPPER " ${ POWER10_M } " POWER10_M_UPPER ) 391string ( REGEX MATCHALL "POWER *([0-9]+)" MATCHED_STRING " ${ POWER10_M_UPPER } " ) 392string ( REGEX REPLACE "POWER *([0-9]+)" "\\1" EXTRACTED_NUMBER " ${ MATCHED_STRING } " ) 393 394if ( EXTRACTED_NUMBEREQUAL 10OR EXTRACTED_NUMBEREQUAL 11) 395list ( APPEND ARCH_FLAGS -mcpu=power10 ) 396elseif ( EXTRACTED_NUMBEREQUAL 9) 397list ( APPEND ARCH_FLAGS -mcpu=power9 ) 398elseif (${ CMAKE_SYSTEM_PROCESSOR } MATCHES "ppc64le" ) 399list ( APPEND ARCH_FLAGS -mcpu=powerpc64le -mtune=native ) 400else () 401list ( APPEND ARCH_FLAGS -mcpu=native -mtune=native -mpowerpc64 ) 402endif () 403elseif ( GGML_CPU_ALL_VARIANTS) 404# Begin with the lowest baseline 405set ( ARCH_DEFINITIONS "" ) 406 407# When a feature is selected, bump the MCPU to the first 408# version that supported it 409foreach ( PVER RANGE 7 11) 410if ( DEFINED GGML_INTERNAL_POWER${ PVER }) 411set ( POWERPC_MCPU "power ${ PVER } " ) 412list ( APPEND ARCH_DEFINITIONS GGML_USE_POWER ${ PVER }) 413endif () 414endforeach () 415if ( GGML_INTERNAL_VSX) 416list ( APPEND ARCH_DEFINITIONS GGML_USE_VSX ) 417list ( APPEND ARCH_FLAGS -mvsx ) 418endif () 419 420if ( DEFINED POWERPC_MCPU) 421list ( APPEND ARCH_FLAGS -mcpu= ${ POWERPC_MCPU }) 422endif () 423ggml_add_cpu_backend_features ( $ { GGML_CPU_NAME } powerpc ${ ARCH_DEFINITIONS }) 424else () 425if ( GGML_CPU_POWERPC_CPUTYPE) 426list ( APPEND ARCH_FLAGS -mcpu= ${ GGML_CPU_POWERPC_CPUTYPE }) 427endif () 428endif () 429elseif ( GGML_SYSTEM_ARCHSTREQUAL "loongarch64" ) 430message ( STATUS "loongarch64 detected" ) 431list ( APPEND GGML_CPU_SOURCES ggml-cpu/arch/loongarch/quants.c ) 432 433list ( APPEND ARCH_FLAGS -march=loongarch64 ) 434if ( GGML_LASX) 435list ( APPEND ARCH_FLAGS -mlasx ) 436endif () 437if ( GGML_LSX) 438list ( APPEND ARCH_FLAGS -mlsx ) 439endif () 440elseif ( GGML_SYSTEM_ARCHSTREQUAL "riscv64" ) 441message ( STATUS "riscv64 detected" ) 442list ( APPEND GGML_CPU_SOURCES 443ggml-cpu/arch/riscv/quants.c 444ggml-cpu/arch/riscv/repack.cpp 445) 446if ( GGML_CPU_RISCV64_SPACEMIT) 447include ( ggml-cpu/cmake/FindSMTIME.cmake ) 448target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE GGML_USE_CPU_RISCV64_SPACEMIT ${ RISCV64_SPACEMIT_IME_SPEC }) 449list ( APPEND GGML_CPU_SOURCES 450ggml-cpu/spacemit/ime.cpp 451ggml-cpu/spacemit/ime.h 452ggml-cpu/spacemit/spine_mem_pool.cpp 453ggml-cpu/spacemit/spine_mem_pool.h 454ggml-cpu/spacemit/repack.cpp 455ggml-cpu/spacemit/repack.h 456ggml-cpu/spacemit/ime_env.cpp 457ggml-cpu/spacemit/ime_env.h 458ggml-cpu/spacemit/ime_kernels.h 459ggml-cpu/spacemit/rvv_kernels.cpp 460ggml-cpu/spacemit/rvv_kernels.h 461) 462if ( "RISCV64_SPACEMIT_IME1" IN_LIST RISCV64_SPACEMIT_IME_SPEC) 463list ( APPEND GGML_CPU_SOURCES ggml-cpu/spacemit/ime1_kernels.cpp ) 464endif () 465if ( "RISCV64_SPACEMIT_IME2" IN_LIST RISCV64_SPACEMIT_IME_SPEC) 466list ( APPEND GGML_CPU_SOURCES ggml-cpu/spacemit/ime2_kernels.cpp ) 467endif () 468endif () 469if ( NOT GGML_CPU_ALL_VARIANTS) 470set ( MARCH_STR "rv64gc" ) 471if ( GGML_RVV) 472string ( APPEND MARCH_STR "v" ) 473endif () 474 475if ( GGML_RV_ZFH) 476string ( APPEND MARCH_STR "_zfh" ) 477endif () 478 479if ( GGML_XTHEADVECTOR) 480string ( APPEND MARCH_STR "_xtheadvector" ) 481elseif ( GGML_RVV) 482if ( GGML_RV_ZVFH) 483string ( APPEND MARCH_STR "_zvfh" ) 484endif () 485if ( GGML_RV_ZVFBFWMA) 486string ( APPEND MARCH_STR "_zvfbfwma" ) 487endif () 488endif () 489 490if ( GGML_RV_ZICBOP) 491string ( APPEND MARCH_STR "_zicbop" ) 492endif () 493if ( GGML_RV_ZIHINTPAUSE) 494string ( APPEND MARCH_STR "_zihintpause" ) 495endif () 496if ( GGML_RV_ZBA) 497string ( APPEND MARCH_STR "_zba" ) 498endif () 499if ( GGML_CPU_RISCV64_SPACEMIT) 500# `xsmtvdotii' is only required for GCC >= 15. 501if ( CMAKE_C_COMPILER_IDSTREQUAL "GNU" AND 502 CMAKE_C_COMPILER_VERSIONVERSION_GREATER_EQUAL 15) 503string ( APPEND MARCH_STR "_xsmtvdotii" ) 504endif () 505endif () 506 507list ( APPEND ARCH_FLAGS "-march= ${ MARCH_STR } " -mabi=lp64d ) 508else () 509# Begin with the lowest baseline 510set ( ARCH_DEFINITIONS "" ) 511 512if ( GGML_INTERNAL_RVV) 513message ( STATUS "RVV enabled" ) 514list ( APPEND ARCH_DEFINITIONS GGML_USE_RVV ) 515list ( APPEND ARCH_FLAGS -march=rv64gc_v -mabi=lp64d ) 516endif () 517 518ggml_add_cpu_backend_features ( $ { GGML_CPU_NAME } riscv ${ ARCH_DEFINITIONS }) 519endif () 520elseif ( GGML_SYSTEM_ARCHSTREQUAL "s390x" ) 521message ( STATUS "s390x detected" ) 522list ( APPEND GGML_CPU_SOURCES 523ggml-cpu/arch/s390/quants.c 524ggml-cpu/arch/s390/repack.cpp 525) 526 527# for native compilation 528if ( GGML_NATIVE) 529# check machine level to determine target 530file ( READ "/proc/cpuinfo" CPUINFO_CONTENTS ) 531string ( REGEX REPLACE "machine[ \t\r\n]*=[ \t\r\n]*([0-9]+)" "\\1" S390X_M ${ CPUINFO_CONTENTS }) 532 533# TODO: Separation to determine activation of VX/VXE/VXE2 534if (${ S390X_M } MATCHES "8561|8562" ) 535message ( STATUS "z15 target" ) 536list ( APPEND ARCH_FLAGS -march=z15 ) 537elseif (${ S390X_M } MATCHES "3931" ) 538message ( STATUS "z16 target" ) 539list ( APPEND ARCH_FLAGS -march=z16 ) 540elseif (${ S390X_M } MATCHES "9175|9176" ) 541# NOTE: Only available from GCC 15.1.0 onwards. Any z17 machine with compile issues must first verify their GCC version. 542# binutils must also be updated to the latest for the -march=z17 flag to work. Otherwise, use -march=arch15. 543message ( STATUS "z17 target" ) 544list ( APPEND ARCH_FLAGS -march=arch15 ) 545else () 546message ( STATUS "Unknown target" ) 547message ( WARNING "Unknown target. If you are compiling for z14 and earlier, you might have to add -DGGML_VXE=OFF." ) 548list ( APPEND ARCH_FLAGS -march=native -mtune=native ) 549endif () 550# for cross-compilation 551elseif ( GGML_CPU_ALL_VARIANTS) 552# range through IBM z15 to z17 553# NOTE: update when a new hardware level is released 554foreach ( ZHW RANGE 15 17) 555if ( DEFINED GGML_INTERNAL_Z${ ZHW }) 556message ( STATUS "z ${ ZHW } cross-compile target" ) 557list ( APPEND ARCH_FLAGS -march=z ${ ZHW }) 558endif () 559endforeach () 560endif () 561 562if ( GGML_VXEOR GGML_INTERNAL_VXE2) 563message ( STATUS "VXE2 enabled" ) 564list ( APPEND ARCH_FLAGS -mvx -mzvector ) 565list ( APPEND ARCH_DEFINITIONS GGML_USE_VXE2 ) 566endif () 567 568if ( GGML_INTERNAL_NNPA) 569message ( STATUS "NNPA enabled" ) 570list ( APPEND ARCH_DEFINITIONS GGML_USE_NNPA ) 571endif () 572 573ggml_add_cpu_backend_features ( $ { GGML_CPU_NAME } s390 ${ ARCH_DEFINITIONS }) 574elseif ( CMAKE_SYSTEM_PROCESSORMATCHES "wasm" ) 575message ( STATUS "Wasm detected" ) 576list ( APPEND GGML_CPU_SOURCES ggml-cpu/arch/wasm/quants.c ) 577else () 578message ( WARNING "Unknown CPU architecture. Falling back to generic implementations." ) 579list ( APPEND ARCH_FLAGS -DGGML_CPU_GENERIC ) 580endif () 581 582if ( GGML_CPU_REPACK) 583target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE GGML_USE_CPU_REPACK ) 584endif () 585 586if ( GGML_CPU_KLEIDIAI) 587# upstream repo requires at least cmake 3.16 588if ( CMAKE_VERSIONVERSION_LESS 3.16) 589message ( FATAL_ERROR "GGML_CPU_KLEIDIAI requires CMake >= 3.16" ) 590endif () 591 592set ( GGML_CPU_KLEIDIAI_AARCH64 OFF ) 593if ( GGML_SYSTEM_ARCHSTREQUAL "ARM" AND 594( APPLEOR WIN32OR CMAKE_SYSTEM_NAMEMATCHES "^(Linux|Android) $ " ) AND 595( CMAKE_SYSTEM_PROCESSORMATCHES "^(aarch64|arm64|ARM64|arm64-v8a) $ " OR 596 CMAKE_OSX_ARCHITECTURESMATCHES "arm64" OR 597 CMAKE_GENERATOR_PLATFORM_LWRSTREQUAL "arm64" OR 598 CMAKE_ANDROID_ARCH_ABISTREQUAL "arm64-v8a" )) 599set ( GGML_CPU_KLEIDIAI_AARCH64 ON ) 600endif () 601if ( NOT GGML_CPU_KLEIDIAI_AARCH64) 602message ( FATAL_ERROR "GGML_CPU_KLEIDIAI requires a Linux, Android, Apple, or Windows AArch64/arm64 target" ) 603endif () 604 605message ( STATUS "Using KleidiAI optimized kernels if applicable" ) 606 607# Fetch KleidiAI sources: 608include ( FetchContent ) 609set ( KLEIDIAI_COMMIT_TAG "v1.24.0" ) 610set ( KLEIDIAI_DOWNLOAD_URL "https://github.com/ARM-software/kleidiai/releases/download/ ${ KLEIDIAI_COMMIT_TAG } /kleidiai- ${ KLEIDIAI_COMMIT_TAG } -src.tar.gz" ) 611set ( KLEIDIAI_RELEASE_ARCHIVE_MD5 "2f02ebe29573d45813e671eb304f2a00" ) 612 613set ( KLEIDIAI_FETCH_ARGS 614URL ${ KLEIDIAI_DOWNLOAD_URL } 615URL_HASH MD5= ${ KLEIDIAI_RELEASE_ARCHIVE_MD5 } 616) 617if ( CMAKE_VERSIONVERSION_GREATER_EQUAL "3.24" ) 618list ( APPEND KLEIDIAI_FETCH_ARGS DOWNLOAD_EXTRACT_TIMESTAMP NEW ) 619endif () 620 621FetchContent_Declare ( kleidiai 622${ KLEIDIAI_FETCH_ARGS } 623) 624 625# Disable tests and benchmark building 626set ( KLEIDIAI_BUILD_TESTS OFF CACHE BOOL "" FORCE ) 627set ( KLEIDIAI_BUILD_BENCHMARK OFF CACHE BOOL "" FORCE ) 628 629# Use the Populate/add_subdirectory flow for compatibility with CMake 3.16. 630FetchContent_GetProperties ( kleidiai 631SOURCE_DIR KLEIDIAI_SRC 632BINARY_DIR KLEIDIAI_BIN 633POPULATED KLEIDIAI_POPULATED 634) 635if ( NOT KLEIDIAI_POPULATED) 636FetchContent_Populate ( kleidiai ) 637FetchContent_GetProperties ( kleidiai 638SOURCE_DIR KLEIDIAI_SRC 639BINARY_DIR KLEIDIAI_BIN 640) 641endif () 642 643if ( NOT TARGET kleidiai) 644add_subdirectory ( 645" ${ CMAKE_CURRENT_SOURCE_DIR } /ggml-cpu/kleidiai" 646" ${ CMAKE_CURRENT_BINARY_DIR } /kleidiai-wrapper" 647EXCLUDE_FROM_ALL 648) 649if ( NOT CMAKE_SKIP_INSTALL_RULESAND 650( NOT DEFINED BUILD_SHARED_LIBSOR NOT BUILD_SHARED_LIBS)) 651install ( TARGETS kleidiai ARCHIVE ) 652endif () 653endif () 654 655if ( NOT TARGET kleidiai) 656message ( FATAL_ERROR "KleidiAI target was not created" ) 657endif () 658 659set_target_properties ( kleidiai PROPERTIES POSITION_INDEPENDENT_CODE ON ) 660 661target_link_libraries ( $ { GGML_CPU_NAME } PRIVATE kleidiai ) 662 663target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE GGML_USE_CPU_KLEIDIAI ) 664 665list ( APPEND GGML_CPU_SOURCES 666ggml-cpu/kleidiai/kleidiai.cpp 667ggml-cpu/kleidiai/kernels.cpp 668ggml-cpu/kleidiai/kleidiai.h 669ggml-cpu/kleidiai/kernels.h 670) 671endif () 672 673message ( STATUS "Adding CPU backend variant ${ GGML_CPU_NAME } : ${ ARCH_FLAGS } ${ ARCH_DEFINITIONS } " ) 674target_sources ( $ { GGML_CPU_NAME } PRIVATE ${ GGML_CPU_SOURCES }) 675target_compile_options ( $ { GGML_CPU_NAME } PRIVATE ${ ARCH_FLAGS }) 676target_compile_definitions ( $ { GGML_CPU_NAME } PRIVATE ${ ARCH_DEFINITIONS }) 677 678if ( EMSCRIPTEN) 679set_target_properties ( $ { GGML_CPU_NAME } PROPERTIES COMPILE_FLAGS "-msimd128" ) 680endif () 681 682if ( CMAKE_C_COMPILER_IDSTREQUAL "IntelLLVM" OR CMAKE_CXX_COMPILER_IDSTREQUAL "IntelLLVM" ) 683# The compiler automatically enables "-ffast-math" which can cause NaNs in tests due to "-fassociative-math" 684target_compile_options ( $ { GGML_CPU_NAME } PRIVATE " $ < $ <OR: $ <COMPILE_LANG_AND_ID:C,IntelLLVM>, $ <COMPILE_LANG_AND_ID:CXX,IntelLLVM>>: $ < $ <BOOL: ${ WIN32 } >:/clang:>-fno-associative-math>" ) 685endif () 686 687endfunction ()