2023-03-21 17:29:41 +02:00
cmake_minimum_required ( VERSION 3.12 ) # Don't bump this version for no reason
2023-03-21 09:37:16 +09:00
project ( "llama.cpp" C CXX )
2023-03-13 14:12:33 -03:00
2023-03-21 17:29:41 +02:00
set ( CMAKE_EXPORT_COMPILE_COMMANDS ON )
2023-03-13 21:22:15 +02:00
if ( NOT XCODE AND NOT MSVC AND NOT CMAKE_BUILD_TYPE )
set ( CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE )
set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo" )
endif ()
2023-03-21 17:29:41 +02:00
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /bin )
if ( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
set ( LLAMA_STANDALONE ON )
# configure project version
# TODO
else ()
set ( LLAMA_STANDALONE OFF )
endif ()
if ( EMSCRIPTEN )
set ( BUILD_SHARED_LIBS_DEFAULT OFF )
option ( LLAMA_WASM_SINGLE_FILE "llama: embed WASM inside the generated llama.js" ON )
else ()
if ( MINGW )
set ( BUILD_SHARED_LIBS_DEFAULT OFF )
else ()
set ( BUILD_SHARED_LIBS_DEFAULT ON )
endif ()
endif ()
2023-03-21 09:37:16 +09:00
#
# Option list
#
2023-03-13 14:12:33 -03:00
2023-09-04 22:26:24 +03:00
if ( APPLE )
set ( LLAMA_METAL_DEFAULT ON )
else ()
set ( LLAMA_METAL_DEFAULT OFF )
endif ()
2023-03-21 09:37:16 +09:00
# general
2023-05-25 23:07:29 +02:00
option ( LLAMA_STATIC "llama: static link libraries" OFF )
option ( LLAMA_NATIVE "llama: enable -march=native flag" OFF )
option ( LLAMA_LTO "llama: enable link time optimization" OFF )
2023-03-13 14:12:33 -03:00
2023-03-21 09:37:16 +09:00
# debug
2023-05-25 23:07:29 +02:00
option ( LLAMA_ALL_WARNINGS "llama: enable all compiler warnings" ON )
option ( LLAMA_ALL_WARNINGS_3RD_PARTY "llama: enable all compiler warnings in 3rd party libs" OFF )
option ( LLAMA_GPROF "llama: enable gprof" OFF )
2023-03-21 09:37:16 +09:00
# sanitizers
2023-05-25 23:07:29 +02:00
option ( LLAMA_SANITIZE_THREAD "llama: enable thread sanitizer" OFF )
option ( LLAMA_SANITIZE_ADDRESS "llama: enable address sanitizer" OFF )
option ( LLAMA_SANITIZE_UNDEFINED "llama: enable undefined sanitizer" OFF )
2023-03-21 09:37:16 +09:00
# instruction set specific
2023-05-25 23:07:29 +02:00
option ( LLAMA_AVX "llama: enable AVX" ON )
option ( LLAMA_AVX2 "llama: enable AVX2" ON )
option ( LLAMA_AVX512 "llama: enable AVX512" OFF )
option ( LLAMA_AVX512_VBMI "llama: enable AVX512-VBMI" OFF )
option ( LLAMA_AVX512_VNNI "llama: enable AVX512-VNNI" OFF )
option ( LLAMA_FMA "llama: enable FMA" ON )
2023-04-13 15:48:21 +03:00
# in MSVC F16C is implied with AVX2/AVX512
if ( NOT MSVC )
2023-05-25 23:07:29 +02:00
option ( LLAMA_F16C "llama: enable F16C" ON )
2023-04-13 15:48:21 +03:00
endif ()
2023-03-21 09:37:16 +09:00
# 3rd party libs
2023-06-04 23:34:30 +03:00
option ( LLAMA_ACCELERATE "llama: enable Accelerate framework" ON )
option ( LLAMA_BLAS "llama: use BLAS" OFF )
2023-05-27 17:24:06 +03:00
set ( LLAMA_BLAS_VENDOR "Generic" CACHE STRING "llama: BLAS library vendor" )
2023-07-29 23:04:44 +02:00
option ( LLAMA_CUBLAS "llama: use CUDA" OFF )
2023-07-31 15:44:35 +02:00
#option(LLAMA_CUDA_CUBLAS "llama: use cuBLAS for prompt processing" OFF)
2023-07-05 14:19:42 +02:00
option ( LLAMA_CUDA_FORCE_DMMV "llama: use dmmv instead of mmvq CUDA kernels" OFF )
2023-06-04 23:34:30 +03:00
set ( LLAMA_CUDA_DMMV_X "32" CACHE STRING "llama: x stride for dmmv CUDA kernels" )
2023-07-05 14:19:42 +02:00
set ( LLAMA_CUDA_MMV_Y "1" CACHE STRING "llama: y block size for mmv CUDA kernels" )
2023-07-31 19:52:22 +02:00
option ( LLAMA_CUDA_F16 "llama: use 16 bit floats for some calculations" OFF )
2023-06-16 20:08:44 +03:00
set ( LLAMA_CUDA_KQUANTS_ITER "2" CACHE STRING "llama: iters./thread per block for Q2_K/Q6_K" )
2023-08-25 12:09:42 +03:00
option ( LLAMA_HIPBLAS "llama: use hipBLAS" OFF )
2023-06-04 23:34:30 +03:00
option ( LLAMA_CLBLAST "llama: use CLBlast" OFF )
2023-09-04 22:26:24 +03:00
option ( LLAMA_METAL "llama: use Metal" ${ LLAMA_METAL_DEFAULT } )
2023-09-05 18:21:10 -04:00
option ( LLAMA_METAL_NDEBUG "llama: disable Metal debugging" OFF )
2023-07-10 11:49:56 -04:00
option ( LLAMA_MPI "llama: use MPI" OFF )
2023-06-07 10:59:52 +03:00
option ( LLAMA_K_QUANTS "llama: use k-quants" ON )
2023-06-26 19:43:07 +03:00
option ( LLAMA_QKK_64 "llama: use super-block size of 64 for k-quants" OFF )
2023-03-21 09:37:16 +09:00
2023-05-25 23:07:29 +02:00
option ( LLAMA_BUILD_TESTS "llama: build tests" ${ LLAMA_STANDALONE } )
option ( LLAMA_BUILD_EXAMPLES "llama: build examples" ${ LLAMA_STANDALONE } )
2023-07-04 10:05:27 -04:00
option ( LLAMA_BUILD_SERVER "llama: build server example" ON )
2023-03-21 17:29:41 +02:00
2023-05-01 09:23:47 -07:00
#
# Build info header
#
# Generate initial build-info.h
include ( ${ CMAKE_CURRENT_SOURCE_DIR } /scripts/build-info.cmake )
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git" )
2023-05-03 03:43:43 +03:00
set ( GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.git" )
# Is git submodule
if ( NOT IS_DIRECTORY "${GIT_DIR}" )
file ( READ ${ GIT_DIR } REAL_GIT_DIR_LINK )
string ( REGEX REPLACE "gitdir: (.*)\n$" "\\1" REAL_GIT_DIR ${ REAL_GIT_DIR_LINK } )
set ( GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${REAL_GIT_DIR}" )
endif ()
2023-05-01 09:23:47 -07:00
# Add a custom target for build-info.h
add_custom_target ( BUILD_INFO ALL DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/build-info.h" )
# Add a custom command to rebuild build-info.h when .git/index changes
add_custom_command (
OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/build-info.h"
COMMENT "Generating build details from Git"
COMMAND ${ CMAKE_COMMAND } -P "${CMAKE_CURRENT_SOURCE_DIR}/scripts/build-info.cmake"
WORKING_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR }
2023-05-03 03:43:43 +03:00
DEPENDS "${GIT_DIR}/index"
2023-05-01 09:23:47 -07:00
VERBATIM
)
else ()
message ( WARNING "Git repository not found; to enable automatic generation of build info, make sure Git is installed and the project is a Git repository." )
endif ()
2023-03-21 09:37:16 +09:00
#
# Compile flags
#
2023-03-31 19:19:16 +00:00
set ( CMAKE_CXX_STANDARD 11 )
2023-03-21 09:37:16 +09:00
set ( CMAKE_CXX_STANDARD_REQUIRED true )
2023-03-31 19:19:16 +00:00
set ( CMAKE_C_STANDARD 11 )
2023-03-21 09:37:16 +09:00
set ( CMAKE_C_STANDARD_REQUIRED true )
set ( THREADS_PREFER_PTHREAD_FLAG ON )
find_package ( Threads REQUIRED )
2023-09-13 06:08:52 -07:00
include ( CheckCXXCompilerFlag )
2023-03-13 14:12:33 -03:00
if ( NOT MSVC )
if ( LLAMA_SANITIZE_THREAD )
2023-03-21 09:37:16 +09:00
add_compile_options ( -fsanitize=thread )
2023-03-25 23:38:11 +02:00
link_libraries ( -fsanitize=thread )
2023-03-13 14:12:33 -03:00
endif ()
if ( LLAMA_SANITIZE_ADDRESS )
2023-03-21 09:37:16 +09:00
add_compile_options ( -fsanitize=address -fno-omit-frame-pointer )
2023-03-25 23:38:11 +02:00
link_libraries ( -fsanitize=address )
2023-03-13 14:12:33 -03:00
endif ()
if ( LLAMA_SANITIZE_UNDEFINED )
2023-03-21 09:37:16 +09:00
add_compile_options ( -fsanitize=undefined )
2023-03-25 23:38:11 +02:00
link_libraries ( -fsanitize=undefined )
2023-03-13 14:12:33 -03:00
endif ()
endif ()
2023-03-21 09:37:16 +09:00
if ( APPLE AND LLAMA_ACCELERATE )
2023-03-13 14:12:33 -03:00
find_library ( ACCELERATE_FRAMEWORK Accelerate )
if ( ACCELERATE_FRAMEWORK )
message ( STATUS "Accelerate framework found" )
2023-03-21 09:37:16 +09:00
add_compile_definitions ( GGML_USE_ACCELERATE )
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } ${ ACCELERATE_FRAMEWORK } )
2023-03-13 14:12:33 -03:00
else ()
message ( WARNING "Accelerate framework not found" )
endif ()
endif ()
2023-04-20 03:14:14 +02:00
2023-09-04 22:26:24 +03:00
if ( LLAMA_METAL )
find_library ( FOUNDATION_LIBRARY Foundation REQUIRED )
find_library ( METAL_FRAMEWORK Metal REQUIRED )
find_library ( METALKIT_FRAMEWORK MetalKit REQUIRED )
message ( STATUS "Metal framework found" )
2023-09-14 14:04:40 -03:00
set ( GGML_HEADERS_METAL ggml-metal.h )
set ( GGML_SOURCES_METAL ggml-metal.m )
2023-09-04 22:26:24 +03:00
add_compile_definitions ( GGML_USE_METAL )
2023-09-05 18:21:10 -04:00
if ( LLAMA_METAL_NDEBUG )
add_compile_definitions ( GGML_METAL_NDEBUG )
endif ()
2023-09-04 22:26:24 +03:00
# get full path to the file
#add_compile_definitions(GGML_METAL_DIR_KERNELS="${CMAKE_CURRENT_SOURCE_DIR}/")
# copy ggml-metal.metal to bin directory
configure_file ( ggml-metal.metal bin/ggml-metal.metal COPYONLY )
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS }
${ FOUNDATION_LIBRARY }
${ METAL_FRAMEWORK }
${ METALKIT_FRAMEWORK }
)
endif ()
2023-05-20 23:58:31 +09:00
if ( LLAMA_BLAS )
2023-03-21 09:37:16 +09:00
if ( LLAMA_STATIC )
set ( BLA_STATIC ON )
endif ()
2023-05-20 23:58:31 +09:00
if ( $ ( CMAKE_VERSION ) VERSION_GREATER_EQUAL 3.22 )
set ( BLA_SIZEOF_INTEGER 8 )
endif ()
2023-06-17 03:53:04 +09:00
2023-05-20 23:58:31 +09:00
set ( BLA_VENDOR ${ LLAMA_BLAS_VENDOR } )
2023-03-21 09:37:16 +09:00
find_package ( BLAS )
2023-06-17 03:53:04 +09:00
2023-03-21 09:37:16 +09:00
if ( BLAS_FOUND )
2023-05-20 23:58:31 +09:00
message ( STATUS "BLAS found, Libraries: ${BLAS_LIBRARIES}" )
2023-03-21 09:37:16 +09:00
2023-06-17 03:53:04 +09:00
if ( "${BLAS_INCLUDE_DIRS}" STREQUAL "" )
# BLAS_INCLUDE_DIRS is missing in FindBLAS.cmake.
# see https://gitlab.kitware.com/cmake/cmake/-/issues/20268
find_package ( PkgConfig REQUIRED )
if ( ${ LLAMA_BLAS_VENDOR } MATCHES "Generic" )
pkg_check_modules ( DepBLAS REQUIRED blas )
elseif ( ${ LLAMA_BLAS_VENDOR } MATCHES "OpenBLAS" )
pkg_check_modules ( DepBLAS REQUIRED openblas )
elseif ( ${ LLAMA_BLAS_VENDOR } MATCHES "FLAME" )
pkg_check_modules ( DepBLAS REQUIRED blis )
elseif ( ${ LLAMA_BLAS_VENDOR } MATCHES "ATLAS" )
pkg_check_modules ( DepBLAS REQUIRED blas-atlas )
elseif ( ${ LLAMA_BLAS_VENDOR } MATCHES "FlexiBLAS" )
pkg_check_modules ( DepBLAS REQUIRED flexiblas_api )
elseif ( ${ LLAMA_BLAS_VENDOR } MATCHES "Intel" )
# all Intel* libraries share the same include path
2023-07-21 18:26:34 +08:00
pkg_check_modules ( DepBLAS REQUIRED mkl-sdl )
2023-06-17 03:53:04 +09:00
elseif ( ${ LLAMA_BLAS_VENDOR } MATCHES "NVHPC" )
# this doesn't provide pkg-config
# suggest to assign BLAS_INCLUDE_DIRS on your own
if ( "${NVHPC_VERSION}" STREQUAL "" )
message ( WARNING "Better to set NVHPC_VERSION" )
else ()
set ( DepBLAS_FOUND ON )
set ( DepBLAS_INCLUDE_DIRS "/opt/nvidia/hpc_sdk/${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR}/${NVHPC_VERSION}/math_libs/include" )
endif ()
endif ()
if ( DepBLAS_FOUND )
set ( BLAS_INCLUDE_DIRS ${ DepBLAS_INCLUDE_DIRS } )
else ()
message ( WARNING "BLAS_INCLUDE_DIRS neither been provided nor been automatically"
" detected by pkgconfig, trying to find cblas.h from possible paths..." )
find_path ( BLAS_INCLUDE_DIRS
NAMES cblas.h
HINTS
/usr/include
/usr/local/include
/usr/include/openblas
/opt/homebrew/opt/openblas/include
/usr/local/opt/openblas/include
/usr/include/x86_64-linux-gnu/openblas/include
)
endif ()
endif ()
2023-06-15 12:51:26 -05:00
message ( STATUS "BLAS found, Includes: ${BLAS_INCLUDE_DIRS}" )
2023-05-20 23:58:31 +09:00
add_compile_options ( ${ BLAS_LINKER_FLAGS } )
2023-03-21 09:37:16 +09:00
add_compile_definitions ( GGML_USE_OPENBLAS )
2023-07-09 16:12:20 +08:00
if ( ${ BLAS_INCLUDE_DIRS } MATCHES "mkl" AND ( ${ LLAMA_BLAS_VENDOR } MATCHES "Generic" OR ${ LLAMA_BLAS_VENDOR } MATCHES "Intel" ))
add_compile_definitions ( GGML_BLAS_USE_MKL )
endif ()
2023-05-20 23:58:31 +09:00
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } ${ BLAS_LIBRARIES } )
2023-06-15 12:51:26 -05:00
set ( LLAMA_EXTRA_INCLUDES ${ LLAMA_EXTRA_INCLUDES } ${ BLAS_INCLUDE_DIRS } )
2023-04-15 14:51:11 +09:00
2023-03-21 09:37:16 +09:00
else ()
2023-05-20 23:58:31 +09:00
message ( WARNING "BLAS not found, please refer to "
"https://cmake.org/cmake/help/latest/module/FindBLAS.html#blas-lapack-vendors"
" to set correct LLAMA_BLAS_VENDOR" )
2023-03-21 09:37:16 +09:00
endif ()
endif ()
2023-03-13 14:12:33 -03:00
2023-06-26 19:43:07 +03:00
if ( LLAMA_K_QUANTS )
2023-09-14 14:04:40 -03:00
set ( GGML_HEADERS_EXTRA k_quants.h )
set ( GGML_SOURCES_EXTRA k_quants.c )
2023-06-26 19:43:07 +03:00
add_compile_definitions ( GGML_USE_K_QUANTS )
if ( LLAMA_QKK_64 )
add_compile_definitions ( GGML_QKK_64 )
endif ()
endif ()
2023-04-19 11:22:45 +02:00
if ( LLAMA_CUBLAS )
cmake_minimum_required ( VERSION 3.17 )
find_package ( CUDAToolkit )
if ( CUDAToolkit_FOUND )
message ( STATUS "cuBLAS found" )
2023-04-20 03:14:14 +02:00
enable_language ( CUDA )
2023-09-14 14:04:40 -03:00
set ( GGML_HEADERS_CUDA ggml-cuda.h )
set ( GGML_SOURCES_CUDA ggml-cuda.cu )
2023-04-20 03:14:14 +02:00
2023-04-19 11:22:45 +02:00
add_compile_definitions ( GGML_USE_CUBLAS )
2023-07-31 15:44:35 +02:00
# if (LLAMA_CUDA_CUBLAS)
# add_compile_definitions(GGML_CUDA_CUBLAS)
# endif()
2023-07-05 14:19:42 +02:00
if ( LLAMA_CUDA_FORCE_DMMV )
add_compile_definitions ( GGML_CUDA_FORCE_DMMV )
endif ()
2023-05-25 23:07:29 +02:00
add_compile_definitions ( GGML_CUDA_DMMV_X= ${ LLAMA_CUDA_DMMV_X } )
2023-07-05 14:19:42 +02:00
add_compile_definitions ( GGML_CUDA_MMV_Y= ${ LLAMA_CUDA_MMV_Y } )
if ( DEFINED LLAMA_CUDA_DMMV_Y )
add_compile_definitions ( GGML_CUDA_MMV_Y= ${ LLAMA_CUDA_DMMV_Y } ) # for backwards compatibility
endif ()
2023-07-31 19:52:22 +02:00
if ( LLAMA_CUDA_F16 OR LLAMA_CUDA_DMMV_F16 )
add_compile_definitions ( GGML_CUDA_F16 )
2023-06-19 10:23:56 +02:00
endif ()
2023-06-16 20:08:44 +03:00
add_compile_definitions ( K_QUANTS_PER_ITERATION= ${ LLAMA_CUDA_KQUANTS_ITER } )
2023-04-19 11:22:45 +02:00
if ( LLAMA_STATIC )
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } CUDA::cudart_static CUDA::cublas_static CUDA::cublasLt_static )
else ()
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } CUDA::cudart CUDA::cublas CUDA::cublasLt )
endif ()
2023-06-21 23:49:25 +02:00
if ( NOT DEFINED CMAKE_CUDA_ARCHITECTURES )
2023-07-31 15:44:35 +02:00
# 52 == lowest CUDA 12 standard
# 60 == f16 CUDA intrinsics
# 61 == integer CUDA intrinsics
2023-08-02 16:48:10 +02:00
# 70 == compute capability at which unrolling a loop in mul_mat_q kernels is faster
if ( LLAMA_CUDA_F16 OR LLAMA_CUDA_DMMV_F16 )
2023-07-31 15:44:35 +02:00
set ( CMAKE_CUDA_ARCHITECTURES "60;61;70" ) # needed for f16 CUDA intrinsics
2023-06-21 23:49:25 +02:00
else ()
2023-07-31 15:44:35 +02:00
set ( CMAKE_CUDA_ARCHITECTURES "52;61;70" ) # lowest CUDA 12 standard + lowest for integer intrinsics
2023-06-21 23:49:25 +02:00
endif ()
endif ()
message ( STATUS "Using CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}" )
2023-04-19 11:22:45 +02:00
else ()
message ( WARNING "cuBLAS not found" )
endif ()
endif ()
2023-07-10 11:49:56 -04:00
if ( LLAMA_MPI )
cmake_minimum_required ( VERSION 3.10 )
find_package ( MPI )
if ( MPI_C_FOUND )
message ( STATUS "MPI found" )
2023-09-14 14:04:40 -03:00
set ( GGML_HEADERS_MPI ggml-mpi.h )
2023-07-10 11:49:56 -04:00
set ( GGML_SOURCES_MPI ggml-mpi.c ggml-mpi.h )
add_compile_definitions ( GGML_USE_MPI )
add_compile_definitions ( ${ MPI_C_COMPILE_DEFINITIONS } )
set ( cxx_flags ${ cxx_flags } -Wno-cast-qual )
set ( c_flags ${ c_flags } -Wno-cast-qual )
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } ${ MPI_C_LIBRARIES } )
set ( LLAMA_EXTRA_INCLUDES ${ LLAMA_EXTRA_INCLUDES } ${ MPI_C_INCLUDE_DIRS } )
# Even if you're only using the C header, C++ programs may bring in MPI
# C++ functions, so more linkage is needed
if ( MPI_CXX_FOUND )
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } ${ MPI_CXX_LIBRARIES } )
endif ()
else ()
message ( WARNING "MPI not found" )
endif ()
endif ()
2023-04-28 16:57:16 +02:00
if ( LLAMA_CLBLAST )
find_package ( CLBlast )
if ( CLBlast_FOUND )
message ( STATUS "CLBlast found" )
2023-09-14 14:04:40 -03:00
set ( GGML_HEADERS_OPENCL ggml-opencl.h )
set ( GGML_SOURCES_OPENCL ggml-opencl.cpp )
2023-04-28 16:57:16 +02:00
add_compile_definitions ( GGML_USE_CLBLAST )
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } clblast )
else ()
message ( WARNING "CLBlast not found" )
endif ()
endif ()
2023-08-25 12:09:42 +03:00
if ( LLAMA_HIPBLAS )
list ( APPEND CMAKE_PREFIX_PATH /opt/rocm )
if ( NOT ${ CMAKE_C_COMPILER_ID } MATCHES "Clang" )
message ( WARNING "Only LLVM is supported for HIP, hint: CC=/opt/rocm/llvm/bin/clang" )
endif ()
if ( NOT ${ CMAKE_CXX_COMPILER_ID } MATCHES "Clang" )
message ( WARNING "Only LLVM is supported for HIP, hint: CXX=/opt/rocm/llvm/bin/clang++" )
endif ()
find_package ( hip )
find_package ( hipblas )
find_package ( rocblas )
if ( ${ hipblas_FOUND } AND ${ hip_FOUND } )
message ( STATUS "HIP and hipBLAS found" )
add_compile_definitions ( GGML_USE_HIPBLAS GGML_USE_CUBLAS )
add_library ( ggml-rocm OBJECT ggml-cuda.cu ggml-cuda.h )
2023-09-14 13:38:16 -04:00
if ( BUILD_SHARED_LIBS )
set_target_properties ( ggml-rocm PROPERTIES POSITION_INDEPENDENT_CODE ON )
endif ()
2023-08-25 12:09:42 +03:00
if ( LLAMA_CUDA_FORCE_DMMV )
target_compile_definitions ( ggml-rocm PRIVATE GGML_CUDA_FORCE_DMMV )
endif ()
target_compile_definitions ( ggml-rocm PRIVATE GGML_CUDA_DMMV_X= ${ LLAMA_CUDA_DMMV_X } )
target_compile_definitions ( ggml-rocm PRIVATE GGML_CUDA_MMV_Y= ${ LLAMA_CUDA_MMV_Y } )
target_compile_definitions ( ggml-rocm PRIVATE K_QUANTS_PER_ITERATION= ${ LLAMA_CUDA_KQUANTS_ITER } )
set_source_files_properties ( ggml-cuda.cu PROPERTIES LANGUAGE CXX )
target_link_libraries ( ggml-rocm PRIVATE hip::device PUBLIC hip::host roc::rocblas roc::hipblas )
if ( LLAMA_STATIC )
message ( FATAL_ERROR "Static linking not supported for HIP/ROCm" )
endif ()
set ( LLAMA_EXTRA_LIBS ${ LLAMA_EXTRA_LIBS } ggml-rocm )
else ()
message ( WARNING "hipBLAS or HIP not found. Try setting CMAKE_PREFIX_PATH=/opt/rocm" )
endif ()
endif ()
2023-03-13 14:12:33 -03:00
if ( LLAMA_ALL_WARNINGS )
if ( NOT MSVC )
2023-03-21 09:37:16 +09:00
set ( c_flags
-Wall
-Wextra
-Wpedantic
-Wcast-qual
2023-03-28 16:48:20 +00:00
-Wdouble-promotion
-Wshadow
2023-03-21 09:37:16 +09:00
-Wstrict-prototypes
-Wpointer-arith
2023-07-26 14:00:04 -04:00
-Wmissing-prototypes
2023-08-30 02:20:26 -04:00
-Werror=implicit-int
2023-09-01 09:34:50 -04:00
-Wno-unused-function
2023-03-21 09:37:16 +09:00
)
set ( cxx_flags
-Wall
-Wextra
-Wpedantic
-Wcast-qual
2023-09-15 15:38:27 -04:00
-Wmissing-declarations
2023-03-28 19:51:55 +03:00
-Wno-unused-function
2023-04-08 12:24:37 -07:00
-Wno-multichar
2023-03-21 09:37:16 +09:00
)
2023-09-01 09:34:50 -04:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
# g++ only
2023-09-07 13:22:29 -04:00
set ( cxx_flags ${ cxx_flags } -Wno-format-truncation -Wno-array-bounds )
2023-09-01 09:34:50 -04:00
endif ()
2023-03-13 14:12:33 -03:00
else ()
# todo : msvc
endif ()
2023-03-21 09:37:16 +09:00
add_compile_options (
"$<$<COMPILE_LANGUAGE:C>:${c_flags}>"
"$<$<COMPILE_LANGUAGE:CXX>:${cxx_flags}>"
)
2023-03-13 14:12:33 -03:00
endif ()
2023-09-15 06:24:30 -06:00
if ( WIN32 )
2023-04-08 12:24:37 -07:00
add_compile_definitions ( _CRT_SECURE_NO_WARNINGS )
2023-04-22 16:18:20 +08:00
if ( BUILD_SHARED_LIBS )
set ( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON )
endif ()
2023-04-08 12:24:37 -07:00
endif ()
2023-03-21 09:37:16 +09:00
if ( LLAMA_LTO )
include ( CheckIPOSupported )
check_ipo_supported ( RESULT result OUTPUT output )
if ( result )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
2023-03-13 14:12:33 -03:00
else ()
2023-03-21 09:37:16 +09:00
message ( WARNING "IPO is not supported: ${output}" )
2023-03-13 14:12:33 -03:00
endif ()
endif ()
2023-03-21 09:37:16 +09:00
# Architecture specific
# TODO: probably these flags need to be tweaked on some architectures
# feel free to update the Makefile for your architecture and send a pull request or issue
message ( STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}" )
2023-09-13 02:54:20 +01:00
if ( MSVC )
string ( TOLOWER "${CMAKE_GENERATOR_PLATFORM}" CMAKE_GENERATOR_PLATFORM_LWR )
message ( STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}" )
else ()
set ( CMAKE_GENERATOR_PLATFORM_LWR "" )
endif ()
2023-03-21 09:37:16 +09:00
if ( NOT MSVC )
if ( LLAMA_STATIC )
add_link_options ( -static )
if ( MINGW )
add_link_options ( -static-libgcc -static-libstdc++ )
endif ()
endif ()
if ( LLAMA_GPROF )
add_compile_options ( -pg )
endif ()
if ( LLAMA_NATIVE )
add_compile_options ( -march=native )
endif ()
endif ()
2023-03-13 14:12:33 -03:00
2023-09-13 02:54:20 +01:00
if (( ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "arm" ) OR ( ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "aarch64" ) OR ( "${CMAKE_GENERATOR_PLATFORM_LWR}" MATCHES "arm64" ))
2023-03-21 09:37:16 +09:00
message ( STATUS "ARM detected" )
if ( MSVC )
2023-09-13 02:54:20 +01:00
add_compile_definitions ( __ARM_NEON )
add_compile_definitions ( __ARM_FEATURE_FMA )
add_compile_definitions ( __ARM_FEATURE_DOTPROD )
# add_compile_definitions(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) # MSVC doesn't support vdupq_n_f16, vld1q_f16, vst1q_f16
add_compile_definitions ( __aarch64__ ) # MSVC defines _M_ARM64 instead
2023-03-21 09:37:16 +09:00
else ()
2023-09-13 06:08:52 -07:00
check_cxx_compiler_flag ( -mfp16-format=ieee COMPILER_SUPPORTS_FP16_FORMAT_I3E )
if ( NOT "${COMPILER_SUPPORTS_FP16_FORMAT_I3E}" STREQUAL "" )
add_compile_options ( -mfp16-format=ieee )
endif ()
2023-04-30 20:48:38 +02:00
if ( ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "armv6" )
# Raspberry Pi 1, Zero
2023-09-13 06:08:52 -07:00
add_compile_options ( -mfpu=neon-fp-armv8 -mno-unaligned-access )
2023-04-30 20:48:38 +02:00
endif ()
if ( ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "armv7" )
# Raspberry Pi 2
2023-09-13 06:08:52 -07:00
add_compile_options ( -mfpu=neon-fp-armv8 -mno-unaligned-access -funsafe-math-optimizations )
2023-04-30 20:48:38 +02:00
endif ()
if ( ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "armv8" )
# Raspberry Pi 3, 4, Zero 2 (32-bit)
2023-09-13 06:08:52 -07:00
add_compile_options ( -mno-unaligned-access )
2023-04-30 20:48:38 +02:00
endif ()
2023-03-21 09:37:16 +09:00
endif ()
2023-09-13 02:54:20 +01:00
elseif ( ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "^(x86_64|i686|AMD64)$" OR "${CMAKE_GENERATOR_PLATFORM_LWR}" MATCHES "^(x86_64|i686|amd64|x64)$" )
2023-03-21 09:37:16 +09:00
message ( STATUS "x86 detected" )
if ( MSVC )
2023-03-25 23:38:11 +02:00
if ( LLAMA_AVX512 )
2023-04-20 03:14:14 +02:00
add_compile_options ( $< $<COMPILE_LANGUAGE:C > :/arch:AVX512> )
add_compile_options ( $< $<COMPILE_LANGUAGE:CXX > :/arch:AVX512> )
2023-04-17 15:10:57 +02:00
# MSVC has no compile-time flags enabling specific
# AVX512 extensions, neither it defines the
# macros corresponding to the extensions.
# Do it manually.
if ( LLAMA_AVX512_VBMI )
2023-04-20 03:14:14 +02:00
add_compile_definitions ( $< $<COMPILE_LANGUAGE:C > :__AVX512VBMI__> )
add_compile_definitions ( $< $<COMPILE_LANGUAGE:CXX > :__AVX512VBMI__> )
2023-04-17 15:10:57 +02:00
endif ()
if ( LLAMA_AVX512_VNNI )
2023-04-20 03:14:14 +02:00
add_compile_definitions ( $< $<COMPILE_LANGUAGE:C > :__AVX512VNNI__> )
add_compile_definitions ( $< $<COMPILE_LANGUAGE:CXX > :__AVX512VNNI__> )
2023-04-17 15:10:57 +02:00
endif ()
2023-03-25 23:38:11 +02:00
elseif ( LLAMA_AVX2 )
2023-04-20 03:14:14 +02:00
add_compile_options ( $< $<COMPILE_LANGUAGE:C > :/arch:AVX2> )
add_compile_options ( $< $<COMPILE_LANGUAGE:CXX > :/arch:AVX2> )
2023-03-21 09:37:16 +09:00
elseif ( LLAMA_AVX )
2023-04-20 03:14:14 +02:00
add_compile_options ( $< $<COMPILE_LANGUAGE:C > :/arch:AVX> )
add_compile_options ( $< $<COMPILE_LANGUAGE:CXX > :/arch:AVX> )
2023-03-21 09:37:16 +09:00
endif ()
else ()
2023-04-13 15:48:21 +03:00
if ( LLAMA_F16C )
add_compile_options ( -mf16c )
endif ()
2023-03-21 09:37:16 +09:00
if ( LLAMA_FMA )
add_compile_options ( -mfma )
endif ()
if ( LLAMA_AVX )
add_compile_options ( -mavx )
endif ()
if ( LLAMA_AVX2 )
add_compile_options ( -mavx2 )
endif ()
2023-03-25 23:38:11 +02:00
if ( LLAMA_AVX512 )
add_compile_options ( -mavx512f )
2023-04-17 15:10:57 +02:00
add_compile_options ( -mavx512bw )
endif ()
if ( LLAMA_AVX512_VBMI )
add_compile_options ( -mavx512vbmi )
endif ()
if ( LLAMA_AVX512_VNNI )
add_compile_options ( -mavx512vnni )
2023-03-25 23:38:11 +02:00
endif ()
2023-03-21 09:37:16 +09:00
endif ()
2023-05-02 18:42:16 +02:00
elseif ( ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "ppc64" )
message ( STATUS "PowerPC detected" )
add_compile_options ( -mcpu=native -mtune=native )
#TODO: Add targets for Power8/Power9 (Altivec/VSX) and Power10(MMA) and query for big endian systems (ppc64/le/be)
2023-03-21 09:37:16 +09:00
else ()
message ( STATUS "Unknown architecture" )
endif ()
2023-03-13 14:12:33 -03:00
2023-09-08 17:58:07 +03:00
#
# POSIX conformance
#
2023-09-08 14:09:21 +02:00
# clock_gettime came in POSIX.1b (1993)
# CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional
# posix_memalign came in POSIX.1-2001 / SUSv3
# M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985)
add_compile_definitions ( _XOPEN_SOURCE=600 )
# Somehow in OpenBSD whenever POSIX conformance is specified
# some string functions rely on locale_t availability,
# which was introduced in POSIX.1-2008, forcing us to go higher
2023-09-08 17:58:07 +03:00
if ( CMAKE_SYSTEM_NAME MATCHES "OpenBSD" )
2023-09-08 14:09:21 +02:00
remove_definitions ( -D_XOPEN_SOURCE=600 )
add_compile_definitions ( _XOPEN_SOURCE=700 )
2023-09-08 17:58:07 +03:00
endif ()
2023-09-08 14:09:21 +02:00
# Data types, macros and functions related to controlling CPU affinity and
# some memory allocation are available on Linux through GNU extensions in libc
2023-09-08 17:58:07 +03:00
if ( CMAKE_SYSTEM_NAME MATCHES "Linux" )
2023-09-08 14:09:21 +02:00
add_compile_definitions ( _GNU_SOURCE )
2023-09-08 17:58:07 +03:00
endif ()
2023-09-08 14:09:21 +02:00
# RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1,
# and on macOS its availability depends on enabling Darwin extensions
# similarly on DragonFly, enabling BSD extensions is necessary
2023-09-11 19:49:06 +08:00
if (
CMAKE_SYSTEM_NAME MATCHES "Darwin" OR
CMAKE_SYSTEM_NAME MATCHES "iOS" OR
CMAKE_SYSTEM_NAME MATCHES "tvOS" OR
CMAKE_SYSTEM_NAME MATCHES "DragonFly"
)
2023-09-08 14:09:21 +02:00
add_compile_definitions ( _DARWIN_C_SOURCE )
2023-09-08 17:58:07 +03:00
endif ()
2023-09-08 14:09:21 +02:00
# alloca is a non-standard interface that is not visible on BSDs when
# POSIX conformance is specified, but not all of them provide a clean way
# to enable it in such cases
2023-09-08 17:58:07 +03:00
if ( CMAKE_SYSTEM_NAME MATCHES "FreeBSD" )
2023-09-08 14:09:21 +02:00
add_compile_definitions ( __BSD_VISIBLE )
2023-09-08 17:58:07 +03:00
endif ()
if ( CMAKE_SYSTEM_NAME MATCHES "NetBSD" )
2023-09-08 14:09:21 +02:00
add_compile_definitions ( _NETBSD_SOURCE )
2023-09-08 17:58:07 +03:00
endif ()
if ( CMAKE_SYSTEM_NAME MATCHES "OpenBSD" )
2023-09-08 14:09:21 +02:00
add_compile_definitions ( _BSD_SOURCE )
2023-09-08 17:58:07 +03:00
endif ()
2023-09-08 14:09:21 +02:00
2023-03-21 09:37:16 +09:00
#
2023-08-21 23:07:43 +03:00
# libraries
2023-03-21 09:37:16 +09:00
#
2023-03-13 14:12:33 -03:00
2023-08-21 23:07:43 +03:00
# ggml
2023-09-08 09:46:56 +08:00
if ( GGML_USE_CPU_HBM )
add_definitions ( -DGGML_USE_CPU_HBM )
find_library ( memkind memkind REQUIRED )
endif ()
2023-03-21 17:29:41 +02:00
add_library ( ggml OBJECT
ggml.c
2023-04-20 03:14:14 +02:00
ggml.h
2023-07-30 15:58:01 +02:00
ggml-alloc.c
ggml-alloc.h
2023-09-14 14:04:40 -03:00
${ GGML_SOURCES_CUDA } ${ GGML_HEADERS_CUDA }
${ GGML_SOURCES_OPENCL } ${ GGML_HEADERS_OPENCL }
${ GGML_SOURCES_METAL } ${ GGML_HEADERS_METAL }
${ GGML_SOURCES_MPI } ${ GGML_HEADERS_MPI }
${ GGML_SOURCES_EXTRA } ${ GGML_HEADERS_EXTRA }
2023-06-04 23:34:30 +03:00
)
2023-03-21 17:29:41 +02:00
2023-06-15 12:51:26 -05:00
target_include_directories ( ggml PUBLIC . ${ LLAMA_EXTRA_INCLUDES } )
2023-03-21 17:29:41 +02:00
target_compile_features ( ggml PUBLIC c_std_11 ) # don't bump
2023-04-22 02:27:06 +08:00
target_link_libraries ( ggml PUBLIC Threads::Threads ${ LLAMA_EXTRA_LIBS } )
2023-09-08 09:46:56 +08:00
if ( GGML_USE_CPU_HBM )
target_link_libraries ( ggml PUBLIC memkind )
endif ()
2023-04-22 16:31:56 +03:00
2023-06-17 01:49:42 -06:00
add_library ( ggml_static STATIC $< TARGET_OBJECTS:ggml > )
2023-03-24 05:16:48 +09:00
if ( BUILD_SHARED_LIBS )
set_target_properties ( ggml PROPERTIES POSITION_INDEPENDENT_CODE ON )
2023-06-17 01:49:42 -06:00
add_library ( ggml_shared SHARED $< TARGET_OBJECTS:ggml > )
2023-06-19 23:10:37 +08:00
target_link_libraries ( ggml_shared PUBLIC Threads::Threads ${ LLAMA_EXTRA_LIBS } )
2023-07-19 15:01:11 +08:00
install ( TARGETS ggml_shared LIBRARY )
2023-03-24 05:16:48 +09:00
endif ()
2023-03-22 07:32:36 +02:00
2023-08-21 23:07:43 +03:00
# llama
2023-03-22 17:37:10 +01:00
add_library ( llama
2023-03-22 07:32:36 +02:00
llama.cpp
2023-04-08 12:24:37 -07:00
llama.h
2023-06-04 23:34:30 +03:00
)
2023-03-22 07:32:36 +02:00
target_include_directories ( llama PUBLIC . )
target_compile_features ( llama PUBLIC cxx_std_11 ) # don't bump
2023-06-04 23:34:30 +03:00
target_link_libraries ( llama PRIVATE
ggml
${ LLAMA_EXTRA_LIBS }
)
2023-04-22 16:31:56 +03:00
2023-03-24 05:16:48 +09:00
if ( BUILD_SHARED_LIBS )
set_target_properties ( llama PROPERTIES POSITION_INDEPENDENT_CODE ON )
target_compile_definitions ( llama PRIVATE LLAMA_SHARED LLAMA_BUILD )
2023-06-10 10:47:34 -04:00
if ( LLAMA_METAL )
set_target_properties ( llama PROPERTIES RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal" )
endif ()
2023-03-24 05:16:48 +09:00
endif ()
2023-03-22 07:32:36 +02:00
2023-09-14 14:04:40 -03:00
2023-08-21 23:07:43 +03:00
#
# install
#
2023-07-19 15:01:11 +08:00
include ( GNUInstallDirs )
2023-09-14 14:04:40 -03:00
include ( CMakePackageConfigHelpers )
set ( LLAMA_INCLUDE_INSTALL_DIR ${ CMAKE_INSTALL_INCLUDEDIR }
CACHE PATH "Location of header files" )
set ( LLAMA_LIB_INSTALL_DIR ${ CMAKE_INSTALL_LIBDIR }
CACHE PATH "Location of library files" )
set ( LLAMA_BIN_INSTALL_DIR ${ CMAKE_INSTALL_BINDIR }
CACHE PATH "Location of binary files" )
set ( LLAMA_BUILD_NUMBER ${ BUILD_NUMBER } )
set ( LLAMA_BUILD_COMMIT ${ BUILD_COMMIT } )
set ( LLAMA_INSTALL_VERSION 0.0. ${ BUILD_NUMBER } )
configure_package_config_file (
${ CMAKE_CURRENT_SOURCE_DIR } /scripts/LlamaConfig.cmake.in
${ CMAKE_CURRENT_BINARY_DIR } /LlamaConfig.cmake
INSTALL_DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/Llama
PATH_VARS LLAMA_INCLUDE_INSTALL_DIR
LLAMA_LIB_INSTALL_DIR
LLAMA_BIN_INSTALL_DIR )
write_basic_package_version_file (
${ CMAKE_CURRENT_BINARY_DIR } /LlamaConfigVersion.cmake
VERSION ${ LLAMA_INSTALL_VERSION }
COMPATIBILITY SameMajorVersion )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /LlamaConfig.cmake
${ CMAKE_CURRENT_BINARY_DIR } /LlamaConfigVersion.cmake
DESTINATION ${ CMAKE_INSTALL_LIBDIR } /cmake/Llama )
set ( GGML_PUBLIC_HEADERS "ggml.h"
"${GGML_HEADERS_CUDA}" "${GGML_HEADERS_OPENCL}"
"${GGML_HEADERS_METAL}" "${GGML_HEADERS_MPI}" "${GGML_HEADERS_EXTRA}" )
set_target_properties ( ggml PROPERTIES PUBLIC_HEADER "${GGML_PUBLIC_HEADERS}" )
install ( TARGETS ggml PUBLIC_HEADER )
2023-09-15 04:07:40 -04:00
set_target_properties ( llama PROPERTIES PUBLIC_HEADER ${ CMAKE_CURRENT_SOURCE_DIR } /llama.h )
2023-09-14 14:04:40 -03:00
install ( TARGETS llama LIBRARY PUBLIC_HEADER )
2023-07-19 15:01:11 +08:00
install (
FILES convert.py
PERMISSIONS
OWNER_READ
OWNER_WRITE
OWNER_EXECUTE
GROUP_READ
GROUP_EXECUTE
WORLD_READ
WORLD_EXECUTE
DESTINATION ${ CMAKE_INSTALL_BINDIR } )
install (
FILES convert-lora-to-ggml.py
PERMISSIONS
OWNER_READ
OWNER_WRITE
OWNER_EXECUTE
GROUP_READ
GROUP_EXECUTE
WORLD_READ
WORLD_EXECUTE
DESTINATION ${ CMAKE_INSTALL_BINDIR } )
2023-08-16 21:09:49 +01:00
if ( LLAMA_METAL )
install (
FILES ggml-metal.metal
PERMISSIONS
OWNER_READ
OWNER_WRITE
GROUP_READ
WORLD_READ
DESTINATION ${ CMAKE_INSTALL_BINDIR } )
endif ()
2023-04-20 03:14:14 +02:00
2023-03-21 17:29:41 +02:00
#
# programs, examples and tests
#
2023-08-21 23:07:43 +03:00
add_subdirectory ( common )
2023-03-21 17:29:41 +02:00
if ( LLAMA_BUILD_TESTS AND NOT CMAKE_JS_VERSION )
2023-03-30 17:56:59 +00:00
include ( CTest )
2023-03-21 17:29:41 +02:00
add_subdirectory ( tests )
endif ()
2023-03-25 20:26:40 +02:00
if ( LLAMA_BUILD_EXAMPLES )
add_subdirectory ( examples )
2023-04-18 21:00:14 +02:00
add_subdirectory ( pocs )
2023-03-25 20:26:40 +02:00
endif ()