|
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() |
|
|
|
|
|
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() |
|
|