From 5f50d151207b866eb4bf4ec1c799323ae0800545 Mon Sep 17 00:00:00 2001 From: Howard Su Date: Sat, 1 Apr 2023 16:32:14 +0800 Subject: [PATCH 01/13] Add detection code for avx --- CMakeLists.txt | 108 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21f4ec9ddd267..8321a5d3534d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,6 +109,114 @@ 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() +INCLUDE(CheckCSourceRuns) + +SET(AVX_CODE " + #include + int main() + { + __m256 a; + a = _mm256_set1_ps(0); + return 0; + } +") + +SET(AVX512_CODE " + #include + int main() + { + __m512i a = _mm512_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); + __m512i b = a; + __mmask64 equality_mask = _mm512_cmp_epi8_mask(a, b, _MM_CMPINT_EQ); + return 0; + } +") + +SET(AVX2_CODE " + #include + int main() + { + __m256i a = {0}; + a = _mm256_abs_epi16(a); + __m256i x; + _mm256_extract_epi64(x, 0); // we rely on this in our AVX2 code + return 0; + } +") + +SET(FMA_CODE " + #include + int main() + { + __m256 acc = _mm256_setzero_ps(); + const __m256 d = _mm256_setzero_ps(); + const __m256 p = _mm256_setzero_ps(); + acc = _mm256_fmadd_ps( d, p, acc ); + return 0; + } +") + +MACRO(CHECK_SSE type flags) + SET(__FLAG_I 1) + SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) + FOREACH(__FLAG ${flags}) + IF(NOT ${type}_FOUND) + SET(CMAKE_REQUIRED_FLAGS ${__FLAG}) + CHECK_C_SOURCE_RUNS("${${type}_CODE}" HAS_${type}_${__FLAG_I}) + IF(HAS_${type}_${__FLAG_I}) + SET(${type}_FOUND TRUE CACHE BOOL "${type} support") + SET(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") + ENDIF() + MATH(EXPR __FLAG_I "${__FLAG_I}+1") + ENDIF() + ENDFOREACH() + SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) + + IF(NOT ${type}_FOUND) + SET(${type}_FOUND FALSE CACHE BOOL "${type} support") + SET(${type}_FLAGS "" CACHE STRING "${type} flags") + ENDIF() + + MARK_AS_ADVANCED(${type}_FOUND ${type}_FLAGS) + +ENDMACRO() + +CHECK_SSE("AVX" " ;-mavx;/arch:AVX") +CHECK_SSE("AVX2" " ;-mavx2 -mfma;/arch:AVX2") +CHECK_SSE("AVX512" " ;-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfma;/arch:AVX512") +CHECK_SSE("FMA" " ;-mfma;") + +IF(${AVX_FOUND}) + set(LLAMA_AVX ON) +ELSE() + set(LLAMA_AVX OFF) +ENDIF() + +IF (${FMA_FOUND}) + set(LLAMA_FMA ON) +ELSE() + set(LLAMA_FMA OFF) +ENDIF() + +IF(${AVX2_FOUND}) + set(LLAMA_AVX2 ON) +ELSE() + set(LLAMA_AVX2 OFF) +ENDIF() + +IF(${AVX512_FOUND}) + set(LLAMA_AVX512 ON) +ELSE() + set(LLAMA_AVX512 OFF) +ENDIF() + # # Compile flags # From 7adce4f64c6b37206be33fff48fe9b8bc9b20bf5 Mon Sep 17 00:00:00 2001 From: Howard Su Date: Fri, 7 Apr 2023 21:04:47 +0800 Subject: [PATCH 02/13] Only check hardware when option is ON --- CMakeLists.txt | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8321a5d3534d9..12c7e46e00e7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,33 +188,32 @@ MACRO(CHECK_SSE type flags) ENDMACRO() -CHECK_SSE("AVX" " ;-mavx;/arch:AVX") -CHECK_SSE("AVX2" " ;-mavx2 -mfma;/arch:AVX2") -CHECK_SSE("AVX512" " ;-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfma;/arch:AVX512") -CHECK_SSE("FMA" " ;-mfma;") - -IF(${AVX_FOUND}) - set(LLAMA_AVX ON) -ELSE() - set(LLAMA_AVX OFF) +IF(${LLAMA_AVX}) + CHECK_SSE("AVX" " ;-mavx;/arch:AVX") + IF(NOT ${AVX_FOUND}) + set(LLAMA_AVX OFF) + ENDIF() ENDIF() -IF (${FMA_FOUND}) - set(LLAMA_FMA ON) -ELSE() - set(LLAMA_FMA OFF) +IF(${LLAMA_AVX2}) + CHECK_SSE("AVX2" " ;-mavx2 -mfma;/arch:AVX2") + IF(NOT ${AVX2_FOUND}) + set(LLAMA_AVX2 OFF) + ENDIF() ENDIF() -IF(${AVX2_FOUND}) - set(LLAMA_AVX2 ON) -ELSE() - set(LLAMA_AVX2 OFF) +IF(${LLAMA_AVX512}) + CHECK_SSE("AVX512" " ;-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfma;/arch:AVX512") + IF(NOT ${AVX512_FOUND}) + set(LLAMA_AVX512 OFF) + ENDIF() ENDIF() -IF(${AVX512_FOUND}) - set(LLAMA_AVX512 ON) -ELSE() - set(LLAMA_AVX512 OFF) +IF(${LLAMA_FMA}) + CHECK_SSE("FMA" " ;-mfma;") + IF (NOT ${FMA_FOUND}) + set(LLAMA_FMA OFF) + ENDIF() ENDIF() # From ac072d7c91ca6be205bbcfa0922418027d93f1a9 Mon Sep 17 00:00:00 2001 From: Howard Su Date: Sun, 16 Apr 2023 22:42:06 +0800 Subject: [PATCH 03/13] Modify per code review sugguestions --- CMakeLists.txt | 108 ++----------------------------------------- cmake/FindSIMD.cmake | 99 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 105 deletions(-) create mode 100644 cmake/FindSIMD.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 12c7e46e00e7a..cbe1f5bab857c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,111 +109,9 @@ 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() -INCLUDE(CheckCSourceRuns) - -SET(AVX_CODE " - #include - int main() - { - __m256 a; - a = _mm256_set1_ps(0); - return 0; - } -") - -SET(AVX512_CODE " - #include - int main() - { - __m512i a = _mm512_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0); - __m512i b = a; - __mmask64 equality_mask = _mm512_cmp_epi8_mask(a, b, _MM_CMPINT_EQ); - return 0; - } -") - -SET(AVX2_CODE " - #include - int main() - { - __m256i a = {0}; - a = _mm256_abs_epi16(a); - __m256i x; - _mm256_extract_epi64(x, 0); // we rely on this in our AVX2 code - return 0; - } -") - -SET(FMA_CODE " - #include - int main() - { - __m256 acc = _mm256_setzero_ps(); - const __m256 d = _mm256_setzero_ps(); - const __m256 p = _mm256_setzero_ps(); - acc = _mm256_fmadd_ps( d, p, acc ); - return 0; - } -") - -MACRO(CHECK_SSE type flags) - SET(__FLAG_I 1) - SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) - FOREACH(__FLAG ${flags}) - IF(NOT ${type}_FOUND) - SET(CMAKE_REQUIRED_FLAGS ${__FLAG}) - CHECK_C_SOURCE_RUNS("${${type}_CODE}" HAS_${type}_${__FLAG_I}) - IF(HAS_${type}_${__FLAG_I}) - SET(${type}_FOUND TRUE CACHE BOOL "${type} support") - SET(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") - ENDIF() - MATH(EXPR __FLAG_I "${__FLAG_I}+1") - ENDIF() - ENDFOREACH() - SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) - - IF(NOT ${type}_FOUND) - SET(${type}_FOUND FALSE CACHE BOOL "${type} support") - SET(${type}_FLAGS "" CACHE STRING "${type} flags") - ENDIF() - - MARK_AS_ADVANCED(${type}_FOUND ${type}_FLAGS) - -ENDMACRO() - -IF(${LLAMA_AVX}) - CHECK_SSE("AVX" " ;-mavx;/arch:AVX") - IF(NOT ${AVX_FOUND}) - set(LLAMA_AVX OFF) - ENDIF() -ENDIF() - -IF(${LLAMA_AVX2}) - CHECK_SSE("AVX2" " ;-mavx2 -mfma;/arch:AVX2") - IF(NOT ${AVX2_FOUND}) - set(LLAMA_AVX2 OFF) - ENDIF() -ENDIF() - -IF(${LLAMA_AVX512}) - CHECK_SSE("AVX512" " ;-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfma;/arch:AVX512") - IF(NOT ${AVX512_FOUND}) - set(LLAMA_AVX512 OFF) - ENDIF() -ENDIF() - -IF(${LLAMA_FMA}) - CHECK_SSE("FMA" " ;-mfma;") - IF (NOT ${FMA_FOUND}) - set(LLAMA_FMA OFF) - ENDIF() +MESSAGE("NATIVE=" ${LLAMA_NATIVE} " MSVC=" ${MSVC}) +IF(LLAMA_NATIVE AND MSVC) + include(cmake/FindSIMD.cmake) ENDIF() # diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake new file mode 100644 index 0000000000000..fc8b079bc3167 --- /dev/null +++ b/cmake/FindSIMD.cmake @@ -0,0 +1,99 @@ +INCLUDE(CheckCSourceRuns) + +SET(AVX_CODE " + #include + int main() + { + __m256 a; + a = _mm256_set1_ps(0); + return 0; + } +") + +SET(AVX512_CODE " + #include + int main() + { + __m512i a = _mm512_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); + __m512i b = a; + __mmask64 equality_mask = _mm512_cmp_epi8_mask(a, b, _MM_CMPINT_EQ); + return 0; + } +") + +SET(AVX2_CODE " + #include + int main() + { + __m256i a = {0}; + a = _mm256_abs_epi16(a); + __m256i x; + _mm256_extract_epi64(x, 0); // we rely on this in our AVX2 code + return 0; + } +") + +SET(FMA_CODE " + #include + int main() + { + __m256 acc = _mm256_setzero_ps(); + const __m256 d = _mm256_setzero_ps(); + const __m256 p = _mm256_setzero_ps(); + acc = _mm256_fmadd_ps( d, p, acc ); + return 0; + } +") + +MACRO(CHECK_SSE type flags) + SET(__FLAG_I 1) + SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) + FOREACH(__FLAG ${flags}) + IF(NOT ${type}_FOUND) + SET(CMAKE_REQUIRED_FLAGS ${__FLAG}) + CHECK_C_SOURCE_RUNS("${${type}_CODE}" HAS_${type}_${__FLAG_I}) + IF(HAS_${type}_${__FLAG_I}) + SET(${type}_FOUND TRUE CACHE BOOL "${type} support") + SET(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") + ENDIF() + MATH(EXPR __FLAG_I "${__FLAG_I}+1") + ENDIF() + ENDFOREACH() + SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) + + IF(NOT ${type}_FOUND) + SET(${type}_FOUND FALSE CACHE BOOL "${type} support") + SET(${type}_FLAGS "" CACHE STRING "${type} flags") + ENDIF() + + MARK_AS_ADVANCED(${type}_FOUND ${type}_FLAGS) + +ENDMACRO() + +CHECK_SSE("AVX" " ;/arch:AVX") +IF(NOT ${AVX_FOUND}) + set(LLAMA_AVX OFF) +ELSE() + set(LLAMA_AVX ON) +ENDIF() + +CHECK_SSE("AVX2" " ;/arch:AVX2") +IF(NOT ${AVX2_FOUND}) + set(LLAMA_AVX2 OFF) +ELSE() + set(LLAMA_AVX2 ON) +ENDIF() + +CHECK_SSE("AVX512" " ;/arch:AVX512") +IF(NOT ${AVX512_FOUND}) + set(LLAMA_AVX512 OFF) +ELSE() + set(LLAMA_AVX512 ON) +ENDIF() From a8a22ff93fe25f0c9e0a25d83bce2cbd414a9008 Mon Sep 17 00:00:00 2001 From: Howard Su Date: Thu, 1 Jun 2023 23:00:12 +0800 Subject: [PATCH 04/13] Build locally will detect CPU --- .github/workflows/build.yml | 10 +++++----- CMakeLists.txt | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c98cbcbbebd0c..bebb7f3db8bad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -157,15 +157,15 @@ jobs: matrix: include: - build: 'avx2' - defines: '-DLLAMA_BUILD_SERVER=ON' + defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_NATIVE=OFF' - build: 'avx' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX2=OFF' + defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_NATIVE=OFF -DLLAMA_AVX2=OFF' - build: 'avx512' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX512=ON -DBUILD_SHARED_LIBS=ON' + defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_NATIVE=OFF -DLLAMA_AVX512=ON -DBUILD_SHARED_LIBS=ON' - build: 'clblast' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_CLBLAST=ON -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/clblast"' + defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_NATIVE=OFF -DLLAMA_CLBLAST=ON -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/clblast"' - build: 'openblas' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS -DBLAS_INCLUDE_DIRS="$env:RUNNER_TEMP/openblas/include" -DBLAS_LIBRARIES="$env:RUNNER_TEMP/openblas/lib/openblas.lib"' + defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_NATIVE=OFF -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS -DBLAS_INCLUDE_DIRS="$env:RUNNER_TEMP/openblas/include" -DBLAS_LIBRARIES="$env:RUNNER_TEMP/openblas/lib/openblas.lib"' steps: - name: Clone diff --git a/CMakeLists.txt b/CMakeLists.txt index cbe1f5bab857c..531240b02af5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ endif() # general option(LLAMA_STATIC "llama: static link libraries" OFF) -option(LLAMA_NATIVE "llama: enable -march=native flag" OFF) +option(LLAMA_NATIVE "llama: enable -march=native flag" ON) option(LLAMA_LTO "llama: enable link time optimization" OFF) # debug @@ -109,8 +109,7 @@ 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() -MESSAGE("NATIVE=" ${LLAMA_NATIVE} " MSVC=" ${MSVC}) -IF(LLAMA_NATIVE AND MSVC) +IF(LLAMA_NATIVE) include(cmake/FindSIMD.cmake) ENDIF() From 8a2a73102c8b7af446af0350282b65d7820fe4ac Mon Sep 17 00:00:00 2001 From: Jeremy Dunn Date: Thu, 15 Jun 2023 08:28:58 -0500 Subject: [PATCH 05/13] Fixes CMake style to use lowercase like everywhere else --- CMakeLists.txt | 4 +-- cmake/FindSIMD.cmake | 74 ++++++++++++++++++++++---------------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 531240b02af5a..e5e254afc6a5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,9 +109,9 @@ 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() -IF(LLAMA_NATIVE) +if(LLAMA_NATIVE) include(cmake/FindSIMD.cmake) -ENDIF() +endif() # # Compile flags diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake index fc8b079bc3167..dac993a2aac7a 100644 --- a/cmake/FindSIMD.cmake +++ b/cmake/FindSIMD.cmake @@ -1,6 +1,6 @@ -INCLUDE(CheckCSourceRuns) +include(CheckCSourceRuns) -SET(AVX_CODE " +set(AVX_CODE " #include int main() { @@ -10,7 +10,7 @@ SET(AVX_CODE " } ") -SET(AVX512_CODE " +set(AVX512_CODE " #include int main() { @@ -28,7 +28,7 @@ SET(AVX512_CODE " } ") -SET(AVX2_CODE " +set(AVX2_CODE " #include int main() { @@ -40,7 +40,7 @@ SET(AVX2_CODE " } ") -SET(FMA_CODE " +set(FMA_CODE " #include int main() { @@ -52,48 +52,48 @@ SET(FMA_CODE " } ") -MACRO(CHECK_SSE type flags) - SET(__FLAG_I 1) - SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) - FOREACH(__FLAG ${flags}) - IF(NOT ${type}_FOUND) - SET(CMAKE_REQUIRED_FLAGS ${__FLAG}) +macro(check_sse type flags) + set(__FLAG_I 1) + set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) + foreach(__FLAG ${flags}) + if(NOT ${type}_FOUND) + set(CMAKE_REQUIRED_FLAGS ${__FLAG}) CHECK_C_SOURCE_RUNS("${${type}_CODE}" HAS_${type}_${__FLAG_I}) - IF(HAS_${type}_${__FLAG_I}) - SET(${type}_FOUND TRUE CACHE BOOL "${type} support") - SET(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") - ENDIF() - MATH(EXPR __FLAG_I "${__FLAG_I}+1") - ENDIF() - ENDFOREACH() - SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) + if(HAS_${type}_${__FLAG_I}) + set(${type}_FOUND TRUE CACHE BOOL "${type} support") + set(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") + endif() + math(EXPR __FLAG_I "${__FLAG_I}+1") + endif() + endforeach() + set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) - IF(NOT ${type}_FOUND) - SET(${type}_FOUND FALSE CACHE BOOL "${type} support") - SET(${type}_FLAGS "" CACHE STRING "${type} flags") - ENDIF() + if(NOT ${type}_FOUND) + set(${type}_FOUND FALSE CACHE BOOL "${type} support") + set(${type}_FLAGS "" CACHE STRING "${type} flags") + endif() - MARK_AS_ADVANCED(${type}_FOUND ${type}_FLAGS) + mark_as_advanced(${type}_FOUND ${type}_FLAGS) -ENDMACRO() +endmacro() -CHECK_SSE("AVX" " ;/arch:AVX") -IF(NOT ${AVX_FOUND}) +check_sse("AVX" " ;/arch:AVX") +if(NOT ${AVX_FOUND}) set(LLAMA_AVX OFF) -ELSE() +else() set(LLAMA_AVX ON) -ENDIF() +endif() -CHECK_SSE("AVX2" " ;/arch:AVX2") -IF(NOT ${AVX2_FOUND}) +check_sse("AVX2" " ;/arch:AVX2") +if(NOT ${AVX2_FOUND}) set(LLAMA_AVX2 OFF) -ELSE() +else() set(LLAMA_AVX2 ON) -ENDIF() +endif() -CHECK_SSE("AVX512" " ;/arch:AVX512") -IF(NOT ${AVX512_FOUND}) +check_sse("AVX512" " ;/arch:AVX512") +if(NOT ${AVX512_FOUND}) set(LLAMA_AVX512 OFF) -ELSE() +else() set(LLAMA_AVX512 ON) -ENDIF() +endif() From b7ecd0a781eca26924b1796c579b5bec227cb818 Mon Sep 17 00:00:00 2001 From: netrunnereve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 2 Nov 2023 20:56:31 -0400 Subject: [PATCH 06/13] cleanup --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4155b42208b24..afc1e78bc6162 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,9 +100,10 @@ option(LLAMA_BUILD_TESTS "llama: build tests" ${LLAMA_STANDALO option(LLAMA_BUILD_EXAMPLES "llama: build examples" ${LLAMA_STANDALONE}) option(LLAMA_BUILD_SERVER "llama: build server example" ON) -IF(LLAMA_NATIVE) +# instruction set detection for MSVC only +if (LLAMA_NATIVE) include(cmake/FindSIMD.cmake) -ENDIF() +endif () # # Compile flags From 4998f59e579ed9c52d4d5853f85e4c26132563eb Mon Sep 17 00:00:00 2001 From: netrunnereve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:01:17 -0400 Subject: [PATCH 07/13] fix merge --- CMakeLists.txt | 15 +++++---------- cmake/FindSIMD.cmake | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45d7a5d71392d..2aee3e0dbe205 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,11 +100,6 @@ option(LLAMA_BUILD_TESTS "llama: build tests" ${LLAMA_STANDALO option(LLAMA_BUILD_EXAMPLES "llama: build examples" ${LLAMA_STANDALONE}) option(LLAMA_BUILD_SERVER "llama: build server example" ON) -# instruction set detection for MSVC only -if (LLAMA_NATIVE) - include(cmake/FindSIMD.cmake) -endif () - # # Build info header # @@ -138,11 +133,6 @@ 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() -if(LLAMA_NATIVE) - include(cmake/FindSIMD.cmake) -endif() ->>>>>>> 8a2a73102c8b7af446af0350282b65d7820fe4ac - # # Compile flags # @@ -524,6 +514,11 @@ if (NOT MSVC) endif() endif() +# instruction set detection for MSVC only +if (LLAMA_NATIVE) + include(cmake/FindSIMD.cmake) +endif () + if ((${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") OR (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") OR ("${CMAKE_GENERATOR_PLATFORM_LWR}" MATCHES "arm64")) message(STATUS "ARM detected") if (MSVC) diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake index dac993a2aac7a..a7dd48890cfcc 100644 --- a/cmake/FindSIMD.cmake +++ b/cmake/FindSIMD.cmake @@ -58,7 +58,7 @@ macro(check_sse type flags) foreach(__FLAG ${flags}) if(NOT ${type}_FOUND) set(CMAKE_REQUIRED_FLAGS ${__FLAG}) - CHECK_C_SOURCE_RUNS("${${type}_CODE}" HAS_${type}_${__FLAG_I}) + check_c_source_runs("${${type}_CODE}" HAS_${type}_${__FLAG_I}) if(HAS_${type}_${__FLAG_I}) set(${type}_FOUND TRUE CACHE BOOL "${type} support") set(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") From ec40b70ea91dd59ba41817347524dd46df5b5512 Mon Sep 17 00:00:00 2001 From: netrunnereve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:06:32 -0400 Subject: [PATCH 08/13] linux/gcc version for testing --- cmake/FindSIMD.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake index a7dd48890cfcc..596534cb99bbf 100644 --- a/cmake/FindSIMD.cmake +++ b/cmake/FindSIMD.cmake @@ -77,21 +77,21 @@ macro(check_sse type flags) endmacro() -check_sse("AVX" " ;/arch:AVX") +check_sse("AVX" "-mavx") if(NOT ${AVX_FOUND}) set(LLAMA_AVX OFF) else() set(LLAMA_AVX ON) endif() -check_sse("AVX2" " ;/arch:AVX2") +check_sse("AVX2" "-mavx2") if(NOT ${AVX2_FOUND}) set(LLAMA_AVX2 OFF) else() set(LLAMA_AVX2 ON) endif() -check_sse("AVX512" " ;/arch:AVX512") +check_sse("AVX512" "-mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl") if(NOT ${AVX512_FOUND}) set(LLAMA_AVX512 OFF) else() From 3cc91b2d668ddf816dc301b728623c8be8e07a30 Mon Sep 17 00:00:00 2001 From: netrunnereve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:18:41 -0400 Subject: [PATCH 09/13] msvc combines avx2 and fma into /arch:AVX2 so check for both --- cmake/FindSIMD.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake index 596534cb99bbf..bf1bea075d355 100644 --- a/cmake/FindSIMD.cmake +++ b/cmake/FindSIMD.cmake @@ -77,6 +77,7 @@ macro(check_sse type flags) endmacro() +# flags are for MSVC only! check_sse("AVX" "-mavx") if(NOT ${AVX_FOUND}) set(LLAMA_AVX OFF) @@ -85,7 +86,8 @@ else() endif() check_sse("AVX2" "-mavx2") -if(NOT ${AVX2_FOUND}) +check_sse("FMA" "-mfma") +if((NOT ${AVX2_FOUND}) OR (NOT ${FMA_FOUND})) set(LLAMA_AVX2 OFF) else() set(LLAMA_AVX2 ON) From 5c5281b2f69877557bf462a4acb1043505fe2208 Mon Sep 17 00:00:00 2001 From: netrunnereve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:30:01 -0400 Subject: [PATCH 10/13] cleanup --- CMakeLists.txt | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2aee3e0dbe205..6a8e031e61049 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,39 +100,6 @@ option(LLAMA_BUILD_TESTS "llama: build tests" ${LLAMA_STANDALO option(LLAMA_BUILD_EXAMPLES "llama: build examples" ${LLAMA_STANDALONE}) option(LLAMA_BUILD_SERVER "llama: build server example" ON) -# -# Build info header -# - -# Generate initial build-info.h -include(${CMAKE_CURRENT_SOURCE_DIR}/scripts/build-info.cmake) - -if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") - 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() - - # 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} - DEPENDS "${GIT_DIR}/index" - 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() - # # Compile flags # From 14aded64cfff9f972f6fd3f9d01678c1077ff973 Mon Sep 17 00:00:00 2001 From: netrunnereve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:46:46 -0400 Subject: [PATCH 11/13] msvc only version --- CMakeLists.txt | 9 ++++----- cmake/FindSIMD.cmake | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a8e031e61049..94aed470d450f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -481,11 +481,6 @@ if (NOT MSVC) endif() endif() -# instruction set detection for MSVC only -if (LLAMA_NATIVE) - include(cmake/FindSIMD.cmake) -endif () - if ((${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") OR (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") OR ("${CMAKE_GENERATOR_PLATFORM_LWR}" MATCHES "arm64")) message(STATUS "ARM detected") if (MSVC) @@ -515,6 +510,10 @@ if ((${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") OR (${CMAKE_SYSTEM_PROCESSOR} MATC elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86_64|i686|AMD64)$" OR "${CMAKE_GENERATOR_PLATFORM_LWR}" MATCHES "^(x86_64|i686|amd64|x64)$" ) message(STATUS "x86 detected") if (MSVC) + # instruction set detection for MSVC only + if (LLAMA_NATIVE) + include(cmake/FindSIMD.cmake) + endif () if (LLAMA_AVX512) add_compile_options($<$:/arch:AVX512>) add_compile_options($<$:/arch:AVX512>) diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake index bf1bea075d355..3af36d568bfc4 100644 --- a/cmake/FindSIMD.cmake +++ b/cmake/FindSIMD.cmake @@ -78,22 +78,22 @@ macro(check_sse type flags) endmacro() # flags are for MSVC only! -check_sse("AVX" "-mavx") +check_sse("AVX" " ;/arch:AVX") if(NOT ${AVX_FOUND}) set(LLAMA_AVX OFF) else() set(LLAMA_AVX ON) endif() -check_sse("AVX2" "-mavx2") -check_sse("FMA" "-mfma") +check_sse("AVX2" " ;/arch:AVX2") +check_sse("FMA" " ;/arch:AVX2") if((NOT ${AVX2_FOUND}) OR (NOT ${FMA_FOUND})) set(LLAMA_AVX2 OFF) else() set(LLAMA_AVX2 ON) endif() -check_sse("AVX512" "-mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl") +check_sse("AVX512" " ;/arch:AVX512") if(NOT ${AVX512_FOUND}) set(LLAMA_AVX512 OFF) else() From 447e50a96f002371c49726d0a1c101e7a293c5c6 Mon Sep 17 00:00:00 2001 From: netrunnereve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:57:49 -0400 Subject: [PATCH 12/13] style --- CMakeLists.txt | 2 +- cmake/FindSIMD.cmake | 127 +++++++++++++++++++++---------------------- 2 files changed, 64 insertions(+), 65 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94aed470d450f..7b4eb18403c0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) set(LLAMA_STANDALONE ON) # configure project version diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake index 3af36d568bfc4..504bc38fd90c9 100644 --- a/cmake/FindSIMD.cmake +++ b/cmake/FindSIMD.cmake @@ -1,85 +1,84 @@ include(CheckCSourceRuns) set(AVX_CODE " - #include - int main() - { - __m256 a; - a = _mm256_set1_ps(0); - return 0; - } + #include + int main() + { + __m256 a; + a = _mm256_set1_ps(0); + return 0; + } ") set(AVX512_CODE " - #include - int main() - { - __m512i a = _mm512_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0); - __m512i b = a; - __mmask64 equality_mask = _mm512_cmp_epi8_mask(a, b, _MM_CMPINT_EQ); - return 0; - } + #include + int main() + { + __m512i a = _mm512_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); + __m512i b = a; + __mmask64 equality_mask = _mm512_cmp_epi8_mask(a, b, _MM_CMPINT_EQ); + return 0; + } ") set(AVX2_CODE " - #include - int main() - { - __m256i a = {0}; - a = _mm256_abs_epi16(a); - __m256i x; - _mm256_extract_epi64(x, 0); // we rely on this in our AVX2 code - return 0; - } + #include + int main() + { + __m256i a = {0}; + a = _mm256_abs_epi16(a); + __m256i x; + _mm256_extract_epi64(x, 0); // we rely on this in our AVX2 code + return 0; + } ") set(FMA_CODE " - #include - int main() - { - __m256 acc = _mm256_setzero_ps(); - const __m256 d = _mm256_setzero_ps(); - const __m256 p = _mm256_setzero_ps(); - acc = _mm256_fmadd_ps( d, p, acc ); - return 0; - } + #include + int main() + { + __m256 acc = _mm256_setzero_ps(); + const __m256 d = _mm256_setzero_ps(); + const __m256 p = _mm256_setzero_ps(); + acc = _mm256_fmadd_ps( d, p, acc ); + return 0; + } ") macro(check_sse type flags) - set(__FLAG_I 1) - set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) - foreach(__FLAG ${flags}) - if(NOT ${type}_FOUND) - set(CMAKE_REQUIRED_FLAGS ${__FLAG}) - check_c_source_runs("${${type}_CODE}" HAS_${type}_${__FLAG_I}) - if(HAS_${type}_${__FLAG_I}) - set(${type}_FOUND TRUE CACHE BOOL "${type} support") - set(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") - endif() - math(EXPR __FLAG_I "${__FLAG_I}+1") + set(__FLAG_I 1) + set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) + foreach (__FLAG ${flags}) + if (NOT ${type}_FOUND) + set(CMAKE_REQUIRED_FLAGS ${__FLAG}) + check_c_source_runs("${${type}_CODE}" HAS_${type}_${__FLAG_I}) + if (HAS_${type}_${__FLAG_I}) + set(${type}_FOUND TRUE CACHE BOOL "${type} support") + set(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags") + endif() + math(EXPR __FLAG_I "${__FLAG_I}+1") + endif() + endforeach() + set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) + + if (NOT ${type}_FOUND) + set(${type}_FOUND FALSE CACHE BOOL "${type} support") + set(${type}_FLAGS "" CACHE STRING "${type} flags") endif() - endforeach() - set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) - - if(NOT ${type}_FOUND) - set(${type}_FOUND FALSE CACHE BOOL "${type} support") - set(${type}_FLAGS "" CACHE STRING "${type} flags") - endif() - - mark_as_advanced(${type}_FOUND ${type}_FLAGS) - + + mark_as_advanced(${type}_FOUND ${type}_FLAGS) endmacro() # flags are for MSVC only! check_sse("AVX" " ;/arch:AVX") -if(NOT ${AVX_FOUND}) +if (NOT ${AVX_FOUND}) set(LLAMA_AVX OFF) else() set(LLAMA_AVX ON) @@ -87,14 +86,14 @@ endif() check_sse("AVX2" " ;/arch:AVX2") check_sse("FMA" " ;/arch:AVX2") -if((NOT ${AVX2_FOUND}) OR (NOT ${FMA_FOUND})) +if ((NOT ${AVX2_FOUND}) OR (NOT ${FMA_FOUND})) set(LLAMA_AVX2 OFF) else() set(LLAMA_AVX2 ON) endif() check_sse("AVX512" " ;/arch:AVX512") -if(NOT ${AVX512_FOUND}) +if (NOT ${AVX512_FOUND}) set(LLAMA_AVX512 OFF) else() set(LLAMA_AVX512 ON) From c3b0af424cfba9b8566e98ae7d7cd9447b3beeb1 Mon Sep 17 00:00:00 2001 From: Eve <139727413+netrunnereve@users.noreply.github.com> Date: Fri, 3 Nov 2023 03:21:13 +0000 Subject: [PATCH 13/13] Update FindSIMD.cmake --- cmake/FindSIMD.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/FindSIMD.cmake b/cmake/FindSIMD.cmake index 504bc38fd90c9..33377ec44de12 100644 --- a/cmake/FindSIMD.cmake +++ b/cmake/FindSIMD.cmake @@ -67,12 +67,12 @@ macro(check_sse type flags) endif() endforeach() set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) - + if (NOT ${type}_FOUND) set(${type}_FOUND FALSE CACHE BOOL "${type} support") set(${type}_FLAGS "" CACHE STRING "${type} flags") endif() - + mark_as_advanced(${type}_FOUND ${type}_FLAGS) endmacro()