-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeCompilers.txt
116 lines (102 loc) · 4.48 KB
/
CMakeCompilers.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
include(CheckCXXCompilerFlag)
option(VECTOR_ENGINE "Vector Engine to be used: x86 => [AVX512|AVX2|SSE|SERIAL]; ARM => [NEON|SERIAL]" OFF)
option(NTT_USE_NOISE_CACHE "Use a Noise cache => [ON|OFF]" OFF)
option(OT_TEST "Test OTs (ON) or test ROTs (OFF)" OFF)
option(OT_ROTTED_TEST "Test ROTTED OTs (ON) or test ROTs (OFF)" OFF)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
set (X86 TRUE)
message(STATUS "[RLWEOT] Detected x86 arch")
else()
set (X86 FALSE)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64)|(ARM64)")
set (ARM64 TRUE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -ftree-vectorize -flax-vector-conversions")
message(STATUS "[RLWEOT] Detected ARM64 arch")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "(arm)|(ARM)")
set (ARM TRUE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -ftree-vectorize -flax-vector-conversions")
message(STATUS "[RLWEOT] Detected ARM arch")
else()
set (ARM FALSE)
set (ARM64 FALSE)
message(FATAL_ERROR "Unknown arch")
endif()
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
endif()
if (X86 AND (VECTOR_ENGINE STREQUAL "OFF"))
check_cxx_source_compiles("#include <immintrin.h>\nint main() { __m512i avx_2p = _mm512_set1_epi16(16 << 1); __m512i avx_t0 = _mm512_add_epi16(avx_2p, avx_2p); return 0;}" NFLLIB_USE_AVX512)
check_cxx_source_compiles("#include <immintrin.h>\nint main() { return 0;}" NFLLIB_USE_AVX)
check_cxx_source_compiles("#include <pmmintrin.h>\nint main() { return 0;}" NFLLIB_USE_SSE)
elseif ((ARM OR ARM64) AND (VECTOR_ENGINE STREQUAL "OFF"))
check_cxx_source_compiles("#include <arm_neon.h>\nint main() { return 0;}" NFLLIB_USE_NEON)
else()
message(STATUS "[RLWEOT] Disabling vector engine auto detection. User specified vector engine as ${VECTOR_ENGINE}")
endif()
if(NFLLIB_USE_AVX512 OR (VECTOR_ENGINE STREQUAL "AVX512"))
message(STATUS "[RLWEOT] Using AVX512 vector engine")
add_definitions(-DNTT_AVX512)
add_definitions(-DNFL_OPTIMIZED)
elseif(NFLLIB_USE_AVX OR (VECTOR_ENGINE STREQUAL "AVX2"))
message(STATUS "[RLWEOT] Using AVX vector engine")
add_definitions(-DNTT_AVX2)
add_definitions(-DNFL_OPTIMIZED)
elseif(NFLLIB_USE_SSE OR (VECTOR_ENGINE STREQUAL "SSE"))
message(STATUS "[RLWEOT] Using SSE vector engine")
add_definitions(-DNTT_SSE)
add_definitions(-DNFL_OPTIMIZED)
elseif(NFLLIB_USE_NEON OR (VECTOR_ENGINE STREQUAL "NEON"))
message(STATUS "[RLWEOT] Using NEON vector engine")
add_definitions(-DNTT_NEON)
add_definitions(-DNFL_OPTIMIZED)
elseif(VECTOR_ENGINE STREQUAL "SERIAL")
message(STATUS "[RLWEOT] Using Serial implementation (vector engine disabled)")
endif()
if (NTT_USE_NOISE_CACHE STREQUAL "ON")
add_definitions(-DNTT_USE_NOISE_CACHE)
endif()
if (OT_TEST STREQUAL "ON")
add_definitions(-DOT_TEST)
endif()
if (OT_ROTTED_TEST STREQUAL "ON")
add_definitions(-DOT_ROTTED_TEST)
endif()
# C++11 support
CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
else()
CHECK_CXX_COMPILER_FLAG(-std=c++0x COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
endif()
# optimization flags support
if(CMAKE_BUILD_TYPE MATCHES Release)
message(STATUS "Building Release w/ ${CMAKE_CXX_COMPILER_ID}")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g3 -ftree-vectorize")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
foreach(FLAG -march=native -mtune=native -funroll-loops)
string(REGEX REPLACE -= _ FLAG_ID ${FLAG})
string(TOUPPER ${FLAG_ID} FLAG_ID)
CHECK_CXX_COMPILER_FLAG(${FLAG} COMPILER_SUPPORTS${FLAG_ID})
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${FLAG}")
endforeach()
else()
foreach(FLAG -funroll-loops)
string(REGEX REPLACE -= _ FLAG_ID ${FLAG})
string(TOUPPER ${FLAG_ID} FLAG_ID)
CHECK_CXX_COMPILER_FLAG(${FLAG} COMPILER_SUPPORTS${FLAG_ID})
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${FLAG}")
endforeach()
endif()
else()
add_definitions(-DCHECK_STRICTMOD)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
endif()
#if(APPLE)
# set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wa,-q")
#endif()