char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
082b326fc
char/aliceai-t5-moe
1# ggml-et: Device kernels (cross-compiled within the main build) 2# 3# The RISC-V toolchain is set up in-scope so these targets use the 4# cross-compiler while the rest of the build uses the host compiler. 5# This keeps kernels in compile_commands.json for full IDE support. 6 7# --- RISC-V toolchain setup (scoped to this directory) --- 8set ( TOOLCHAIN_DIR ${ ET_PLATFORM_PATH }) 9include ( $ { ET_PLATFORM_PATH } /lib/cmake/riscv64-ec-toolchain.cmake ) 10set ( CMAKE_ADDR2LINE " ${ TOOLCHAIN_DIR } /bin/riscv64-unknown-elf-addr2line" ) 11set ( CMAKE_LINKER_TYPE LLD ) 12 13# Ensure kernels are built in this directory even if a global output directory is set 14set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_CURRENT_BINARY_DIR }) 15 16message ( STATUS "ET kernels using RISC-V toolchain at: ${ TOOLCHAIN_DIR } " ) 17 18# DeviceUtils provides the add_riscv_executable macro 19list ( APPEND CMAKE_MODULE_PATH " ${ ET_PLATFORM_PATH } /lib/cmake/cmake-modules" ) 20list ( APPEND CMAKE_PREFIX_PATH " ${ ET_PLATFORM_PATH } /lib/cmake" ) 21include ( DeviceUtils ) 22 23find_package ( et-common-libs REQUIRED ) 24find_package ( esperantoTrace REQUIRED ) 25 26# --- Kernel configuration --- 27if ( NOT DEFINED ADDRESS) 28set ( ADDRESS "0x8005801000" ) 29message ( STATUS "ADDRESS not specified, using default: ${ ADDRESS } " ) 30endif () 31 32set ( LINKER_SCRIPT ${ CMAKE_CURRENT_SOURCE_DIR } /src/linker.ld ) 33set ( CHECK_SCRIPT ${ CMAKE_CURRENT_SOURCE_DIR } /scripts/check_unimplemented_instructions.sh ) 34 35# Track address changes to trigger relinking 36set ( ADDRESS_FILE ${ CMAKE_CURRENT_BINARY_DIR } /et_address.txt ) 37file ( CONFIGURE OUTPUT ${ ADDRESS_FILE } CONTENT " ${ ADDRESS } " @ONLY ) 38 39# KERNELS defined in upper CMakeLists.txt 40foreach ( KERNEL${ KERNELS }) 41add_riscv_executable ( $ { KERNEL }) 42target_sources ( $ { KERNEL } .elf PRIVATE 43src/ ${ KERNEL } .c 44src/crt.S 45) 46target_include_directories ( $ { KERNEL } .elf PRIVATE 47${ CMAKE_CURRENT_SOURCE_DIR } /src 48${ CMAKE_CURRENT_SOURCE_DIR } /.. 49${ CMAKE_CURRENT_BINARY_DIR } 50${ CMAKE_SOURCE_DIR } /ggml/include 51${ CMAKE_SOURCE_DIR } /ggml/src 52) 53target_link_libraries ( $ { KERNEL } .elf PRIVATE et-common-libs::cm-umode ) 54# C-only flags — must not apply to .S files 55target_compile_options ( $ { KERNEL } .elf PRIVATE 56$ < $ <COMPILE_LANGUAGE:C>:-fno-zero-initialized-in-bss> 57$ < $ <COMPILE_LANGUAGE:C>:-ffreestanding> 58$ < $ <COMPILE_LANGUAGE:C>:-std=gnu99> 59$ < $ <COMPILE_LANGUAGE:C>:-ffat-lto-objects> 60$ < $ <COMPILE_LANGUAGE:C>:-mcmodel=medany> 61$ < $ <COMPILE_LANGUAGE:C>:-mabi=lp64f> 62$ < $ <COMPILE_LANGUAGE:C>:-march=rv64imf> 63$ < $ <COMPILE_LANGUAGE:C>:-ffunction-sections> 64$ < $ <COMPILE_LANGUAGE:C>:-fdata-sections> 65$ < $ <COMPILE_LANGUAGE:C>:-O3> 66$ < $ <COMPILE_LANGUAGE:C>:-g0> 67$ < $ <COMPILE_LANGUAGE:C>:-nostdlib> 68$ < $ <COMPILE_LANGUAGE:C>:-ffreestanding> 69) 70target_link_options ( $ { KERNEL } .elf PRIVATE 71-Wl,--defsym=BASE_ADDRESS= ${ ADDRESS } 72-Wl,--entry=_start 73) 74# Append to LINK_DEPENDS (macro already sets it for the linker script) 75set_property ( TARGET ${ KERNEL } .elf APPEND PROPERTY 76LINK_DEPENDS " ${ ADDRESS_FILE } " 77) 78 79# Post-build: strip and check (fails build if check script fails) 80add_custom_command ( TARGET ${ KERNEL } .elf POST_BUILD 81COMMAND ${ CMAKE_STRIP } --strip-debug $ <TARGET_FILE: ${ KERNEL } .elf> 82COMMAND ${ CHECK_SCRIPT } 83${ CMAKE_OBJDUMP } ${ CMAKE_ADDR2LINE } $ <TARGET_FILE: ${ KERNEL } .elf> 84DEPENDS ${ CHECK_SCRIPT } 85VERBATIM 86) 87endforeach () 88 89add_dependencies ( uberkernel.elf et-uberkernel-map ) 90 91# Each supported kernel is compiled in its own translation unit with 92# -Dentry_point=<kernel>_entry 93# so symbols and macros don't leak between kernels. The dispatcher 94# (uberkernel.c) calls the renamed entries via extern declarations. 95# 96# HACK: we need to supresse _me kernels from setting up SCP themselves 97set ( _UBER_ME_KERNELS mul_mat_f16_matrix_engine mul_mat_f32_matrix_engine flash_attn_ext_f16_me ) 98 99foreach ( UK_KERNEL${ UBERKERNEL_SUPPORTED_KERNELS }) 100set ( _obj uber_ ${ UK_KERNEL }) 101add_library ( $ { _obj } OBJECT src/ ${ UK_KERNEL } .c ) 102target_compile_definitions ( $ { _obj } PRIVATE "entry_point= ${ UK_KERNEL } _entry" ET_UBERKERNEL ) 103target_include_directories ( $ { _obj } PRIVATE 104${ CMAKE_CURRENT_SOURCE_DIR } /src 105${ CMAKE_CURRENT_SOURCE_DIR } /.. 106${ CMAKE_CURRENT_BINARY_DIR } 107${ CMAKE_SOURCE_DIR } /ggml/include 108${ CMAKE_SOURCE_DIR } /ggml/src 109) 110target_link_libraries ( $ { _obj } PRIVATE et-common-libs::cm-umode ) 111target_compile_options ( $ { _obj } PRIVATE 112$ < $ <COMPILE_LANGUAGE:C>:-fno-zero-initialized-in-bss> 113$ < $ <COMPILE_LANGUAGE:C>:-ffreestanding> 114$ < $ <COMPILE_LANGUAGE:C>:-std=gnu99> 115$ < $ <COMPILE_LANGUAGE:C>:-ffat-lto-objects> 116$ < $ <COMPILE_LANGUAGE:C>:-mcmodel=medany> 117$ < $ <COMPILE_LANGUAGE:C>:-mabi=lp64f> 118$ < $ <COMPILE_LANGUAGE:C>:-march=rv64imf> 119$ < $ <COMPILE_LANGUAGE:C>:-ffunction-sections> 120$ < $ <COMPILE_LANGUAGE:C>:-fdata-sections> 121$ < $ <COMPILE_LANGUAGE:C>:-O3> 122$ < $ <COMPILE_LANGUAGE:C>:-g0> 123$ < $ <COMPILE_LANGUAGE:C>:-nostdlib> 124) 125# ME kernels: suppress setup_cache_scp() (called once by the dispatcher) 126if ( UK_KERNELIN_LIST _UBER_ME_KERNELS) 127target_compile_definitions ( $ { _obj } PRIVATE UBERKERNEL_SUPPRESS_SCP_SETUP ) 128endif () 129target_sources ( uberkernel.elf PRIVATE $ <TARGET_OBJECTS: ${ _obj } > ) 130endforeach () 131 132# Print summary 133message ( STATUS "GGML ET Kernels configured:" ) 134foreach ( KERNEL${ KERNELS }) 135message ( STATUS " - ${ KERNEL } " ) 136endforeach () 137message ( STATUS "Base address: ${ ADDRESS } " )