@@ -4,29 +4,64 @@ project(openviking_cpp)
44
55include (CheckCXXCompilerFlag )
66
7- set (OV_X86_SIMD_LEVEL "AVX2" CACHE STRING "x86 SIMD level: SSE3|AVX2|AVX512|NATIVE" )
7+ set (OV_X86_BUILD_PROFILE "portable" CACHE STRING "x86 build profile: portable|native|fixed" )
8+ set_property (CACHE OV_X86_BUILD_PROFILE PROPERTY STRINGS portable native fixed)
9+ set (OV_X86_SIMD_LEVEL "AVX2" CACHE STRING "x86 SIMD level for fixed/native builds: SSE3|AVX2|AVX512|NATIVE" )
810set_property (CACHE OV_X86_SIMD_LEVEL PROPERTY STRINGS SSE3 AVX2 AVX512 NATIVE)
11+ set (OV_X86_PORTABLE_BASELINE "SSE3" CACHE STRING "x86 portable baseline ISA" )
12+ set_property (CACHE OV_X86_PORTABLE_BASELINE PROPERTY STRINGS SSE3)
13+ option (OV_X86_DISPATCH "Enable runtime SIMD dispatch on x86" OFF )
914
1015set (OV_PLATFORM_X86 OFF )
1116if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64|i[3-6]86" )
1217 set (OV_PLATFORM_X86 ON )
1318endif ()
1419
20+ set (OV_X86_AVX2_DISPATCH_SOURCES
21+ ${CMAKE_CURRENT_SOURCE_DIR } /index/detail/vector/common/x86/l2_avx2.cpp
22+ ${CMAKE_CURRENT_SOURCE_DIR } /index/detail/vector/common/x86/ip_avx2.cpp
23+ ${CMAKE_CURRENT_SOURCE_DIR } /index/detail/vector/common/x86/int8_avx2.cpp
24+ )
25+ set (OV_X86_AVX512_DISPATCH_SOURCES
26+ ${CMAKE_CURRENT_SOURCE_DIR } /index/detail/vector/common/x86/l2_avx512.cpp
27+ ${CMAKE_CURRENT_SOURCE_DIR } /index/detail/vector/common/x86/ip_avx512.cpp
28+ )
29+
30+ set (OV_X86_PORTABLE_OPTIONAL_SOURCES
31+ ${OV_X86_AVX2_DISPATCH_SOURCES}
32+ ${OV_X86_AVX512_DISPATCH_SOURCES}
33+ )
34+
1535if (OV_PLATFORM_X86)
36+ string (TOUPPER "${OV_X86_BUILD_PROFILE} " OV_X86_BUILD_PROFILE_UPPER)
1637 string (TOUPPER "${OV_X86_SIMD_LEVEL} " OV_X86_SIMD_LEVEL_UPPER)
38+ string (TOUPPER "${OV_X86_PORTABLE_BASELINE} " OV_X86_PORTABLE_BASELINE_UPPER)
1739 set (OV_X86_COMPILE_FLAGS)
1840
19- if (OV_X86_SIMD_LEVEL_UPPER STREQUAL "NATIVE" )
41+ if (OV_X86_BUILD_PROFILE_UPPER STREQUAL "PORTABLE" )
42+ set (OV_X86_DISPATCH ON )
43+ if (NOT OV_X86_PORTABLE_BASELINE_UPPER STREQUAL "SSE3" )
44+ message (FATAL_ERROR "OV_X86_PORTABLE_BASELINE currently only supports SSE3" )
45+ endif ()
46+
47+ check_cxx_compiler_flag ("-msse3" HAVE_SSE3 )
48+ if (HAVE_SSE3)
49+ list (APPEND OV_X86_COMPILE_FLAGS -msse3)
50+ else ()
51+ message (FATAL_ERROR "Compiler does not support -msse3 for portable x86 builds" )
52+ endif ()
53+ elseif (OV_X86_BUILD_PROFILE_UPPER STREQUAL "NATIVE" OR OV_X86_SIMD_LEVEL_UPPER STREQUAL "NATIVE" )
2054 check_cxx_compiler_flag ("-march=native" HAVE_MARCH_NATIVE )
2155 if (HAVE_MARCH_NATIVE)
2256 list (APPEND OV_X86_COMPILE_FLAGS -march=native)
2357 else ()
24- message (WARNING "-march=native is not supported by this compiler; falling back to AVX2" )
58+ message (WARNING "-march=native is not supported by this compiler; falling back to fixed AVX2" )
59+ set (OV_X86_BUILD_PROFILE_UPPER "FIXED" )
2560 set (OV_X86_SIMD_LEVEL_UPPER "AVX2" )
2661 endif ()
2762 endif ()
2863
29- if (OV_X86_SIMD_LEVEL_UPPER STREQUAL "AVX512" )
64+ if (OV_X86_BUILD_PROFILE_UPPER STREQUAL "FIXED" AND OV_X86_SIMD_LEVEL_UPPER STREQUAL "AVX512" )
3065 foreach (FLAG -mavx512f -mavx512bw -mavx512dq -mavx512vl)
3166 string (REPLACE "-" "_" FLAG_VAR_SUFFIX "${FLAG} " )
3267 set (FLAG_VAR "HAVE_${FLAG_VAR_SUFFIX} " )
@@ -36,7 +71,7 @@ if(OV_PLATFORM_X86)
3671 endif ()
3772 list (APPEND OV_X86_COMPILE_FLAGS ${FLAG} )
3873 endforeach ()
39- elseif (OV_X86_SIMD_LEVEL_UPPER STREQUAL "AVX2" )
74+ elseif (OV_X86_BUILD_PROFILE_UPPER STREQUAL "FIXED" AND OV_X86_SIMD_LEVEL_UPPER STREQUAL "AVX2" )
4075 check_cxx_compiler_flag ("-mavx2" HAVE_MAVX2 )
4176 if (HAVE_MAVX2)
4277 list (APPEND OV_X86_COMPILE_FLAGS -mavx2)
@@ -55,7 +90,7 @@ if(OV_PLATFORM_X86)
5590 endif ()
5691 endif ()
5792
58- if (OV_X86_SIMD_LEVEL_UPPER STREQUAL "SSE3" )
93+ if (OV_X86_BUILD_PROFILE_UPPER STREQUAL "FIXED" AND OV_X86_SIMD_LEVEL_UPPER STREQUAL "SSE3" )
5994 check_cxx_compiler_flag ("-msse3" HAVE_SSE3 )
6095 if (HAVE_SSE3)
6196 list (APPEND OV_X86_COMPILE_FLAGS -msse3)
@@ -69,7 +104,41 @@ if(OV_PLATFORM_X86)
69104 add_compile_options (${OV_X86_COMPILE_FLAGS} )
70105 endif ()
71106
72- message (STATUS "OpenViking x86 SIMD level: ${OV_X86_SIMD_LEVEL_UPPER} " )
107+ if (OV_X86_DISPATCH)
108+ add_compile_definitions (OV_X86_RUNTIME_DISPATCH=1 )
109+ check_cxx_compiler_flag ("-mavx2" HAVE_PORTABLE_MAVX2 )
110+ if (HAVE_PORTABLE_MAVX2)
111+ set_source_files_properties (${OV_X86_AVX2_DISPATCH_SOURCES}
112+ PROPERTIES COMPILE_OPTIONS "-mavx2" )
113+ add_compile_definitions (OV_X86_AVX2_DISPATCH_COMPILED=1 )
114+ endif ()
115+
116+ set (OV_X86_AVX512_COMPILE_FLAGS)
117+ set (OV_CAN_BUILD_AVX512_DISPATCH ON )
118+ foreach (FLAG -mavx512f -mavx512bw -mavx512dq -mavx512vl)
119+ string (REPLACE "-" "_" FLAG_VAR_SUFFIX "${FLAG} " )
120+ set (FLAG_VAR "HAVE_PORTABLE_${FLAG_VAR_SUFFIX} " )
121+ check_cxx_compiler_flag ("${FLAG} " ${FLAG_VAR} )
122+ if (${FLAG_VAR} )
123+ list (APPEND OV_X86_AVX512_COMPILE_FLAGS ${FLAG} )
124+ else ()
125+ set (OV_CAN_BUILD_AVX512_DISPATCH OFF )
126+ endif ()
127+ endforeach ()
128+
129+ if (OV_CAN_BUILD_AVX512_DISPATCH)
130+ set_source_files_properties (${OV_X86_AVX512_DISPATCH_SOURCES}
131+ PROPERTIES COMPILE_OPTIONS "${OV_X86_AVX512_COMPILE_FLAGS} " )
132+ add_compile_definitions (OV_X86_AVX512_DISPATCH_COMPILED=1 )
133+ endif ()
134+ endif ()
135+
136+ message (STATUS "OpenViking x86 build profile: ${OV_X86_BUILD_PROFILE_UPPER} " )
137+ if (OV_X86_DISPATCH)
138+ message (STATUS "OpenViking x86 portable baseline: ${OV_X86_PORTABLE_BASELINE_UPPER} " )
139+ else ()
140+ message (STATUS "OpenViking x86 SIMD level: ${OV_X86_SIMD_LEVEL_UPPER} " )
141+ endif ()
73142endif ()
74143
75144set (CMAKE_CXX_STANDARD 17)
@@ -153,6 +222,20 @@ file(GLOB_RECURSE ALL_SOURCES
153222 "common/*.cpp"
154223)
155224
225+ list (REMOVE_ITEM ALL_SOURCES ${OV_X86_PORTABLE_OPTIONAL_SOURCES} )
226+
227+ set (OV_X86_PORTABLE_SOURCES)
228+ if (OV_PLATFORM_X86 AND OV_X86_DISPATCH)
229+ if (HAVE_PORTABLE_MAVX2)
230+ list (APPEND OV_X86_PORTABLE_SOURCES ${OV_X86_AVX2_DISPATCH_SOURCES} )
231+ endif ()
232+ if (OV_CAN_BUILD_AVX512_DISPATCH)
233+ list (APPEND OV_X86_PORTABLE_SOURCES ${OV_X86_AVX512_DISPATCH_SOURCES} )
234+ endif ()
235+ endif ()
236+
237+ list (APPEND ALL_SOURCES ${OV_X86_PORTABLE_SOURCES} )
238+
156239add_library (
157240 engine_impl
158241 STATIC
0 commit comments