Skip to content

Commit 5f50d15

Browse files
committed
Add detection code for avx
1 parent ffb06a3 commit 5f50d15

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

CMakeLists.txt

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,114 @@ else()
109109
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.")
110110
endif()
111111

112+
INCLUDE(CheckCSourceRuns)
113+
114+
SET(AVX_CODE "
115+
#include <immintrin.h>
116+
int main()
117+
{
118+
__m256 a;
119+
a = _mm256_set1_ps(0);
120+
return 0;
121+
}
122+
")
123+
124+
SET(AVX512_CODE "
125+
#include <immintrin.h>
126+
int main()
127+
{
128+
__m512i a = _mm512_set_epi8(0, 0, 0, 0, 0, 0, 0, 0,
129+
0, 0, 0, 0, 0, 0, 0, 0,
130+
0, 0, 0, 0, 0, 0, 0, 0,
131+
0, 0, 0, 0, 0, 0, 0, 0,
132+
0, 0, 0, 0, 0, 0, 0, 0,
133+
0, 0, 0, 0, 0, 0, 0, 0,
134+
0, 0, 0, 0, 0, 0, 0, 0,
135+
0, 0, 0, 0, 0, 0, 0, 0);
136+
__m512i b = a;
137+
__mmask64 equality_mask = _mm512_cmp_epi8_mask(a, b, _MM_CMPINT_EQ);
138+
return 0;
139+
}
140+
")
141+
142+
SET(AVX2_CODE "
143+
#include <immintrin.h>
144+
int main()
145+
{
146+
__m256i a = {0};
147+
a = _mm256_abs_epi16(a);
148+
__m256i x;
149+
_mm256_extract_epi64(x, 0); // we rely on this in our AVX2 code
150+
return 0;
151+
}
152+
")
153+
154+
SET(FMA_CODE "
155+
#include <immintrin.h>
156+
int main()
157+
{
158+
__m256 acc = _mm256_setzero_ps();
159+
const __m256 d = _mm256_setzero_ps();
160+
const __m256 p = _mm256_setzero_ps();
161+
acc = _mm256_fmadd_ps( d, p, acc );
162+
return 0;
163+
}
164+
")
165+
166+
MACRO(CHECK_SSE type flags)
167+
SET(__FLAG_I 1)
168+
SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
169+
FOREACH(__FLAG ${flags})
170+
IF(NOT ${type}_FOUND)
171+
SET(CMAKE_REQUIRED_FLAGS ${__FLAG})
172+
CHECK_C_SOURCE_RUNS("${${type}_CODE}" HAS_${type}_${__FLAG_I})
173+
IF(HAS_${type}_${__FLAG_I})
174+
SET(${type}_FOUND TRUE CACHE BOOL "${type} support")
175+
SET(${type}_FLAGS "${__FLAG}" CACHE STRING "${type} flags")
176+
ENDIF()
177+
MATH(EXPR __FLAG_I "${__FLAG_I}+1")
178+
ENDIF()
179+
ENDFOREACH()
180+
SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
181+
182+
IF(NOT ${type}_FOUND)
183+
SET(${type}_FOUND FALSE CACHE BOOL "${type} support")
184+
SET(${type}_FLAGS "" CACHE STRING "${type} flags")
185+
ENDIF()
186+
187+
MARK_AS_ADVANCED(${type}_FOUND ${type}_FLAGS)
188+
189+
ENDMACRO()
190+
191+
CHECK_SSE("AVX" " ;-mavx;/arch:AVX")
192+
CHECK_SSE("AVX2" " ;-mavx2 -mfma;/arch:AVX2")
193+
CHECK_SSE("AVX512" " ;-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfma;/arch:AVX512")
194+
CHECK_SSE("FMA" " ;-mfma;")
195+
196+
IF(${AVX_FOUND})
197+
set(LLAMA_AVX ON)
198+
ELSE()
199+
set(LLAMA_AVX OFF)
200+
ENDIF()
201+
202+
IF (${FMA_FOUND})
203+
set(LLAMA_FMA ON)
204+
ELSE()
205+
set(LLAMA_FMA OFF)
206+
ENDIF()
207+
208+
IF(${AVX2_FOUND})
209+
set(LLAMA_AVX2 ON)
210+
ELSE()
211+
set(LLAMA_AVX2 OFF)
212+
ENDIF()
213+
214+
IF(${AVX512_FOUND})
215+
set(LLAMA_AVX512 ON)
216+
ELSE()
217+
set(LLAMA_AVX512 OFF)
218+
ENDIF()
219+
112220
#
113221
# Compile flags
114222
#

0 commit comments

Comments
 (0)