Spaces:
Runtime error
Runtime error
include(CheckCSourceRuns) | |
set(AVX_CODE " | |
#include <immintrin.h> | |
int main() | |
{ | |
__m256 a; | |
a = _mm256_set1_ps(0); | |
return 0; | |
} | |
") | |
set(AVX512_CODE " | |
#include <immintrin.h> | |
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 <immintrin.h> | |
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 <immintrin.h> | |
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() | |
# flags are for MSVC only! | |
check_sse("AVX" " ;/arch:AVX") | |
if (NOT ${AVX_FOUND}) | |
set(GGML_AVX OFF) | |
else() | |
set(GGML_AVX ON) | |
endif() | |
check_sse("AVX2" " ;/arch:AVX2") | |
check_sse("FMA" " ;/arch:AVX2") | |
if ((NOT ${AVX2_FOUND}) OR (NOT ${FMA_FOUND})) | |
set(GGML_AVX2 OFF) | |
else() | |
set(GGML_AVX2 ON) | |
endif() | |
check_sse("AVX512" " ;/arch:AVX512") | |
if (NOT ${AVX512_FOUND}) | |
set(GGML_AVX512 OFF) | |
else() | |
set(GGML_AVX512 ON) | |
endif() | |