Skip to content

Commit 2af6d32

Browse files
author
Jianning Wang
committed
fix: adapt auto-detect to MSVC
1 parent 1b254b1 commit 2af6d32

File tree

2 files changed

+111
-48
lines changed

2 files changed

+111
-48
lines changed

cmake/option.cmake

Lines changed: 98 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,38 @@ function(_AppendFlags _RESULT _FLAG)
6161
endfunction()
6262

6363
macro(add_arch_flag FLAG VAR_NAME OPTION_NAME)
64-
check_c_compiler_flag("${FLAG}" COMPILER_SUPPORT_${VAR_NAME})
65-
if(COMPILER_SUPPORT_${VAR_NAME})
66-
_AppendFlags(CMAKE_C_FLAGS "${FLAG}")
67-
_AppendFlags(CMAKE_CXX_FLAGS "${FLAG}")
68-
set(${VAR_NAME}_ENABLED ON)
64+
if(MSVC)
65+
if(${ARGC} GREATER 3)
66+
set(_effective_flag "${ARGV3}")
67+
else()
68+
set(_effective_flag "")
69+
endif()
6970
else()
70-
if(${OPTION_NAME})
71-
message(FATAL_ERROR "Compiler does not support required flag: '${FLAG}' for ${OPTION_NAME}")
71+
set(_effective_flag "${FLAG}")
72+
endif()
73+
74+
if(NOT "${_effective_flag}" STREQUAL "")
75+
check_c_compiler_flag("${_effective_flag}" COMPILER_SUPPORT_${VAR_NAME})
76+
if(COMPILER_SUPPORT_${VAR_NAME})
77+
_AppendFlags(CMAKE_C_FLAGS "${_effective_flag}")
78+
_AppendFlags(CMAKE_CXX_FLAGS "${_effective_flag}")
79+
set(${VAR_NAME}_ENABLED ON)
7280
else()
73-
set(${VAR_NAME}_ENABLED OFF)
81+
if(${OPTION_NAME})
82+
message(FATAL_ERROR "Compiler does not support required flag: '${_effective_flag}' for ${OPTION_NAME}")
83+
else()
84+
set(${VAR_NAME}_ENABLED OFF)
85+
endif()
7486
endif()
87+
else()
88+
set(${VAR_NAME}_ENABLED ON)
7589
endif()
7690
endmacro()
7791

7892
function(_setup_armv8_march)
93+
if(MSVC)
94+
return()
95+
endif()
7996
set(_arch "armv8")
8097
check_c_compiler_flag("-march=${_arch}" _COMP_SUPP_${_arch})
8198
if(_COMP_SUPP_${_arch})
@@ -90,6 +107,9 @@ function(_setup_armv8_march)
90107
endfunction()
91108

92109
function(_setup_x86_march)
110+
if(MSVC)
111+
return()
112+
endif()
93113
set(_arch "x86-64")
94114
check_c_compiler_flag("-march=${_arch}" _COMP_SUPP_${_arch})
95115
if(_COMP_SUPP_${_arch})
@@ -104,6 +124,40 @@ function(_setup_x86_march)
104124
endfunction()
105125

106126
function(setup_compiler_march_for_x86 VAR_NAME_SSE VAR_NAME_AVX2 VAR_NAME_AVX512 VAR_NAME_AVX512FP16)
127+
if(MSVC)
128+
#sse
129+
set(${VAR_NAME_SSE} "" PARENT_SCOPE)
130+
131+
#avx2
132+
check_c_compiler_flag("/arch:AVX2" _COMP_SUPP_MSVC_AVX2)
133+
if(_COMP_SUPP_MSVC_AVX2)
134+
set(${VAR_NAME_AVX2} "/arch:AVX2" PARENT_SCOPE)
135+
else()
136+
set(${VAR_NAME_AVX2} "" PARENT_SCOPE)
137+
endif()
138+
139+
#avx512
140+
check_c_compiler_flag("/arch:AVX512" _COMP_SUPP_MSVC_AVX512)
141+
if(_COMP_SUPP_MSVC_AVX512)
142+
set(${VAR_NAME_AVX512} "/arch:AVX512" PARENT_SCOPE)
143+
elseif(_COMP_SUPP_MSVC_AVX2)
144+
set(${VAR_NAME_AVX512} "/arch:AVX2" PARENT_SCOPE)
145+
else()
146+
set(${VAR_NAME_AVX512} "" PARENT_SCOPE)
147+
endif()
148+
149+
#avx512fp16
150+
if(_COMP_SUPP_MSVC_AVX512)
151+
set(${VAR_NAME_AVX512FP16} "/arch:AVX512" PARENT_SCOPE)
152+
elseif(_COMP_SUPP_MSVC_AVX2)
153+
set(${VAR_NAME_AVX512FP16} "/arch:AVX2" PARENT_SCOPE)
154+
else()
155+
set(${VAR_NAME_AVX512FP16} "" PARENT_SCOPE)
156+
endif()
157+
158+
return()
159+
endif()
160+
107161
#sse
108162
set(${VAR_NAME_SSE} "-march=corei7" PARENT_SCOPE)
109163

@@ -133,71 +187,60 @@ function(setup_compiler_march_for_x86 VAR_NAME_SSE VAR_NAME_AVX2 VAR_NAME_AVX512
133187
endforeach()
134188
endfunction()
135189

136-
if(MSVC)
137-
# Prefer higher ISAs
138-
foreach(_isa IN ITEMS "AVX512" "AVX2" "AVX" "SSE2")
139-
check_c_compiler_flag("/arch:${_isa}" _COMP_SUPP_${_isa})
140-
if(_COMP_SUPP_${_isa})
141-
_AppendFlags(CMAKE_C_FLAGS "/arch:${_isa}")
142-
_AppendFlags(CMAKE_CXX_FLAGS "/arch:${_isa}")
143-
message(STATUS "MSVC: enabled /arch:${_isa}")
144-
break()
145-
endif()
146-
endforeach()
147-
return()
148-
endif()
149-
150190
if(NOT AUTO_DETECT_ARCH)
151191
if(ENABLE_NATIVE)
192+
if(MSVC)
193+
message(FATAL_ERROR "ENABLE_NATIVE is not supported with MSVC. Select a specific architecture instead.")
194+
endif()
152195
add_arch_flag("-march=native" NATIVE ENABLE_NATIVE)
153196
endif()
154197

155198
if(ENABLE_ZEN3)
156-
add_arch_flag("-march=znver3" ZNVER3 ENABLE_ZEN3)
199+
add_arch_flag("-march=znver3" ZNVER3 ENABLE_ZEN3 "/arch:AVX2")
157200
endif()
158201

159202
if(ENABLE_ZEN2)
160-
add_arch_flag("-march=znver2" ZNVER2 ENABLE_ZEN2)
203+
add_arch_flag("-march=znver2" ZNVER2 ENABLE_ZEN2 "/arch:AVX2")
161204
endif()
162205

163206
if(ENABLE_ZEN1)
164-
add_arch_flag("-march=znver1" ZNVER1 ENABLE_ZEN1)
207+
add_arch_flag("-march=znver1" ZNVER1 ENABLE_ZEN1 "/arch:AVX2")
165208
endif()
166209

167210
if(ENABLE_GRANITERAPIDS)
168-
add_arch_flag("-march=graniterapids" GRANITERAPIDS ENABLE_GRANITERAPIDS)
211+
add_arch_flag("-march=graniterapids" GRANITERAPIDS ENABLE_GRANITERAPIDS "/arch:AVX512")
169212
endif()
170213

171214
if(ENABLE_EMERALDRAPIDS)
172-
add_arch_flag("-march=emeraldrapids" EMERALDRAPIDS ENABLE_EMERALDRAPIDS)
215+
add_arch_flag("-march=emeraldrapids" EMERALDRAPIDS ENABLE_EMERALDRAPIDS "/arch:AVX512")
173216
endif()
174217

175218
if(ENABLE_SAPPHIRERAPIDS)
176-
add_arch_flag("-march=sapphirerapids" SAPPHIRERAPIDS ENABLE_SAPPHIRERAPIDS)
219+
add_arch_flag("-march=sapphirerapids" SAPPHIRERAPIDS ENABLE_SAPPHIRERAPIDS "/arch:AVX512")
177220
endif()
178221

179222
if(ENABLE_ICELAKE)
180-
add_arch_flag("-march=icelake-server" ICELAKE ENABLE_ICELAKE)
223+
add_arch_flag("-march=icelake-server" ICELAKE ENABLE_ICELAKE "/arch:AVX512")
181224
endif()
182225

183226
if(ENABLE_SKYLAKE_AVX512)
184-
add_arch_flag("-march=skylake-avx512" SKYLAKE_AVX512 ENABLE_SKYLAKE_AVX512)
227+
add_arch_flag("-march=skylake-avx512" SKYLAKE_AVX512 ENABLE_SKYLAKE_AVX512 "/arch:AVX512")
185228
endif()
186229

187230
if(ENABLE_SKYLAKE)
188-
add_arch_flag("-march=skylake" SKYLAKE ENABLE_SKYLAKE)
231+
add_arch_flag("-march=skylake" SKYLAKE ENABLE_SKYLAKE "/arch:AVX2")
189232
endif()
190233

191234
if(ENABLE_BROADWELL)
192-
add_arch_flag("-march=broadwell" BROADWELL ENABLE_BROADWELL)
235+
add_arch_flag("-march=broadwell" BROADWELL ENABLE_BROADWELL "/arch:AVX2")
193236
endif()
194237

195238
if(ENABLE_HASWELL)
196-
add_arch_flag("-march=haswell" HASWELL ENABLE_HASWELL)
239+
add_arch_flag("-march=haswell" HASWELL ENABLE_HASWELL "/arch:AVX2")
197240
endif()
198241

199242
if(ENABLE_SANDYBRIDGE)
200-
add_arch_flag("-march=sandybridge" SANDYBRIDGE ENABLE_SANDYBRIDGE)
243+
add_arch_flag("-march=sandybridge" SANDYBRIDGE ENABLE_SANDYBRIDGE "/arch:AVX")
201244
endif()
202245

203246
if(ENABLE_NEHALEM)
@@ -231,13 +274,29 @@ if(NOT AUTO_DETECT_ARCH)
231274
else()
232275
# AUTO DETECT
233276
# Heuristic: detect host architecture and probe appropriate flags
234-
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|ARM64")
235-
_setup_armv8_march()
236-
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|i686|i386|x64")
237-
_setup_x86_march()
277+
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSTEM_PROC_LOWER)
278+
279+
if(SYSTEM_PROC_LOWER MATCHES "^(x86_64|amd64|x64)$")
280+
set(HOST_ARCH x64)
281+
elseif(SYSTEM_PROC_LOWER MATCHES "^(i[3-6]86|x86)$")
282+
set(HOST_ARCH x86)
283+
elseif(SYSTEM_PROC_LOWER MATCHES "^(aarch64|arm64)$")
284+
set(HOST_ARCH arm64)
285+
elseif(SYSTEM_PROC_LOWER MATCHES "^(arm|armv7|armv7-a|armv7l)$")
286+
set(HOST_ARCH arm)
238287
else()
239-
message(WARNING "Unknown host architecture: ${CMAKE_SYSTEM_PROCESSOR}; no -march= set.")
288+
set(HOST_ARCH unknown)
289+
message(WARNING "unknown host arch: ${CMAKE_SYSTEM_PROCESSOR}")
240290
endif()
291+
message(STATUS "host arch: ${HOST_ARCH}")
292+
293+
if (HOST_ARCH MATCHES "^(arm|arm64)$")
294+
_setup_armv8_march()
295+
elseif (HOST_ARCH MATCHES "^(x86|x64)$")
296+
_setup_x86_march()
297+
else ()
298+
message(WARNING "unknown host arch - no -march set")
299+
endif ()
241300
endif()
242301

243302
# -----------------------------

src/ailego/CMakeLists.txt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ if(UNIX AND NOT APPLE)
1919
endif()
2020

2121
if(NOT ANDROID AND AUTO_DETECT_ARCH)
22-
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|i686|i386|x64")
22+
message(WARNING "before setup_compiler_march_for_x86")
23+
message(WARNING "before CMAKE_SYSTEM_PROCESSOR - ${CMAKE_SYSTEM_PROCESSOR}")
24+
message(WARNING "before HOST_ARCH - ${HOST_ARCH}")
25+
if(HOST_ARCH MATCHES "^(x86|x64)$")
2326
setup_compiler_march_for_x86(MATH_MARCH_FLAG_SSE MATH_MARCH_FLAG_AVX2 MATH_MARCH_FLAG_AVX512 MATH_MARCH_FLAG_AVX512FP16)
2427
message(STATUS "best compiler march, sse: " ${MATH_MARCH_FLAG_SSE} ", avx2: " ${MATH_MARCH_FLAG_AVX2} ", avx512: " ${MATH_MARCH_FLAG_AVX512} ", avx512fp16: " ${MATH_MARCH_FLAG_AVX512FP16})
2528

@@ -90,12 +93,13 @@ if(NOT ANDROID AND AUTO_DETECT_ARCH)
9093
COMPILE_FLAGS "${MATH_MARCH_FLAG_AVX512FP16}"
9194
)
9295
endforeach()
93-
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|ARM64")
94-
# set(CMAKE_CXX_FLAGS "-march=armv8-a")
95-
# set(CMAKE_C_FLAGS "-march=armv8-a")
96-
set(MATH_MARCH_FLAG_NEON "-march=armv8-a")
96+
elseif(HOST_ARCH MATCHES "^(x86|x64)$")
97+
if(MSVC)
98+
return()
99+
endif()
100+
set(MATH_MARCH_FLAG_NEON "-march=armv8-a")
97101

98-
file(GLOB_RECURSE MATH_FILES_NEON
102+
file(GLOB_RECURSE MATH_FILES_NEON
99103
${CMAKE_CURRENT_SOURCE_DIR}/math/*_dispatch.cc
100104
${CMAKE_CURRENT_SOURCE_DIR}/math/*_dispatch.c
101105
${CMAKE_CURRENT_SOURCE_DIR}/math_batch/*_dispatch.cc
@@ -104,15 +108,15 @@ if(NOT ANDROID AND AUTO_DETECT_ARCH)
104108
${CMAKE_CURRENT_SOURCE_DIR}/math/*_neon.c
105109
${CMAKE_CURRENT_SOURCE_DIR}/math_batch/*_neon.cc
106110
${CMAKE_CURRENT_SOURCE_DIR}/math_batch/*_neon.c
107-
)
111+
)
108112

109-
foreach(MATH_FILE ${MATH_FILES_NEON})
113+
foreach(MATH_FILE ${MATH_FILES_NEON})
110114
set_source_files_properties(
111115
${MATH_FILE}
112116
PROPERTIES
113117
COMPILE_FLAGS "${MATH_MARCH_FLAG_NEON}"
114118
)
115-
endforeach()
119+
endforeach()
116120
endif()
117121
endif()
118122

0 commit comments

Comments
 (0)