@@ -109,6 +109,114 @@ else()
109
109
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." )
110
110
endif ()
111
111
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
+
112
220
#
113
221
# Compile flags
114
222
#
0 commit comments