1
+ macro (set_avx_flags )
2
+ set (AVX_FLAGS )
3
+
4
+ include (CheckCXXSourceRuns )
5
+ set (CMAKE_REQUIRED_FLAGS )
6
+
7
+ # AVX
8
+ if (MSVC AND NOT MSVC_VERSION LESS 1600 )
9
+ set (CMAKE_REQUIRED_FLAGS "/arch:AVX" )
10
+ elseif (UNIX OR MINGW )
11
+ set (CMAKE_REQUIRED_FLAGS "-mavx" )
12
+ endif ()
13
+
14
+ check_cxx_source_runs ("
15
+ #include <immintrin.h>
16
+ int main()
17
+ {
18
+ float v[8] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };
19
+ float r[8];
20
+ __m256 first = _mm256_loadu_ps(v);
21
+ __m256 second = _mm256_setr_ps(0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f);
22
+ __m256 result = _mm256_add_ps(first, second);
23
+ _mm256_storeu_ps(r, result);
24
+
25
+ for( int i = 0; i < 8; i++)
26
+ if ((i+1)*1.0f+0.5f != r[i])
27
+ return -1;
28
+ return 0;
29
+ }"
30
+ FOUND_AVX )
31
+
32
+ # AVX2
33
+ if (MSVC AND NOT MSVC_VERSION LESS 1800 )
34
+ set (CMAKE_REQUIRED_FLAGS "/arch:AVX2" )
35
+ elseif (UNIX OR MINGW )
36
+ set (CMAKE_REQUIRED_FLAGS "-mavx2" )
37
+ endif ()
38
+
39
+ check_cxx_source_runs ("
40
+ #include <immintrin.h>
41
+ int main()
42
+ {
43
+ int v[8] = {10, 20, 30, 40, 50, 60, 70, 80};
44
+ int r[8];
45
+ __m256i first = _mm256_loadu_si256((__m256i*)v);
46
+ __m256i second = _mm256_set_epi32(5, 5, 5, 5, 5, 5, 5, 5);
47
+ __m256i result = _mm256_add_epi32(first, second);
48
+ _mm256_storeu_si256((__m256i*)r, result);
49
+
50
+ for( int i = 0; i < 8; i++)
51
+ if ((i+1)*10+5 != r[i])
52
+ return -1;
53
+ return 0;
54
+ }"
55
+ FOUND_AVX2 )
56
+
57
+ # set compiler flags
58
+ if (FOUND_AVX2 )
59
+ if (MSVC )
60
+ set (AVX_FLAGS "/arch:AVX2" )
61
+ elseif (UNIX OR MINGW )
62
+ set (AVX_FLAGS "-mavx2;-mfma" )
63
+ endif ()
64
+ elseif (FOUND_AVX )
65
+ if (MSVC )
66
+ set (AVX_FLAGS "/arch:AVX" )
67
+ elseif (UNIX OR MINGW )
68
+ set (AVX_FLAGS "-mavx" )
69
+ endif ()
70
+ endif ()
71
+ endmacro ()
0 commit comments