@@ -2,8 +2,10 @@ include(CheckCXXCompilerFlag)
22
33include_directories (thirdparty/faiss )
44
5+ # all .cpp files
56knowhere_file_glob (
6- GLOB FAISS_SRCS
7+ GLOB
8+ FAISS_SRCS
79 thirdparty/faiss/faiss/*.cpp
810 thirdparty/faiss/faiss/impl/*.cpp
911 thirdparty/faiss/faiss/impl/fast_scan/*.cpp
@@ -18,22 +20,34 @@ knowhere_file_glob(
1820 thirdparty/faiss/faiss/cppcontrib/knowhere/utils/*.cpp
1921)
2022
21- knowhere_file_glob (GLOB FAISS_AVX512_SRCS
22- thirdparty/faiss/faiss/impl/*avx512.cpp
23- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*avx512.cpp
23+
24+ # AVX512 files
25+ knowhere_file_glob (
26+ GLOB
27+ FAISS_AVX512_SRCS
28+ thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*avx512.cpp
2429)
25- knowhere_file_glob (GLOB FAISS_DD_AVX512_SRCS
26- thirdparty/faiss/faiss/impl/fast_scan/impl-avx512.cpp
27- thirdparty/faiss/faiss/impl/pq_code_distance/pq_code_distance-avx512.cpp
28- thirdparty/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp
29- thirdparty/faiss/faiss/utils/simd_impl/distances_avx512.cpp
30+ # AVX512 vanilla Faiss dynamic dispatch related files
31+ knowhere_file_glob (
32+ GLOB
33+ FAISS_DD_AVX512_SRCS
34+ thirdparty/faiss/faiss/impl/fast_scan/impl-avx512.cpp
35+ thirdparty/faiss/faiss/impl/pq_code_distance/pq_code_distance-avx512.cpp
36+ thirdparty/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp
37+ # # temporarily disabled
38+ # thirdparty/faiss/faiss/utils/distances_fused/avx512.cpp
39+ thirdparty/faiss/faiss/utils/simd_impl/distances_avx512.cpp
3040)
41+ # combine files
3142list (APPEND FAISS_AVX512_SRCS ${FAISS_DD_AVX512_SRCS} )
43+ # remove platform files from general files
44+ list (REMOVE_ITEM FAISS_SRCS ${FAISS_AVX512_SRCS} )
45+
3246
47+ # AVX2 files
3348knowhere_file_glob (
3449 GLOB
3550 FAISS_AVX2_SRCS
36- thirdparty/faiss/faiss/impl/*avx.cpp
3751 thirdparty/faiss/faiss/impl/pq4_fast_scan_search_1.cpp
3852 thirdparty/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp
3953 thirdparty/faiss/faiss/IndexPQFastScan.cpp
@@ -44,22 +58,84 @@ knowhere_file_glob(
4458 thirdparty/faiss/faiss/cppcontrib/knowhere/IndexIVFPQFastScan.cpp
4559 thirdparty/faiss/faiss/cppcontrib/knowhere/IVFFastScanIteratorWorkspace.cpp
4660)
61+ # AVX2 vanilla Faiss dynamic dispatch related files
4762knowhere_file_glob (
4863 GLOB
4964 FAISS_DD_AVX2_SRCS
65+ thirdparty/faiss/faiss/impl/approx_topk/avx2.cpp
5066 thirdparty/faiss/faiss/impl/fast_scan/impl-avx2.cpp
5167 thirdparty/faiss/faiss/impl/pq_code_distance/pq_code_distance-avx2.cpp
5268 thirdparty/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp
5369 thirdparty/faiss/faiss/utils/simd_impl/distances_avx2.cpp
5470)
71+ # combine files
5572list (APPEND FAISS_AVX2_SRCS ${FAISS_DD_AVX2_SRCS} )
73+ # remove platform files from general files
74+ list (REMOVE_ITEM FAISS_SRCS ${FAISS_AVX2_SRCS} )
75+
76+
77+ # NEON files
78+ knowhere_file_glob (
79+ GLOB
80+ FAISS_NEON_SRCS
81+ thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*neon.cpp
82+ )
83+ # NEON vanilla Faiss dynamic dispatch related files
84+ knowhere_file_glob (
85+ GLOB
86+ FAISS_DD_NEON_SRCS
87+ thirdparty/faiss/faiss/impl/approx_topk/neon.cpp
88+ thirdparty/faiss/faiss/impl/fast_scan/impl-neon.cpp
89+ thirdparty/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp
90+ thirdparty/faiss/faiss/utils/simd_impl/distances_aarch64.cpp
91+ )
92+ # combine files
93+ list (APPEND FAISS_NEON_SRCS ${FAISS_DD_NEON_SRCS} )
94+ # remove platform files from general files
95+ list (REMOVE_ITEM FAISS_SRCS ${FAISS_NEON_SRCS} )
96+
97+
98+ # SVE files
99+ knowhere_file_glob (
100+ GLOB
101+ FAISS_SVE_SRCS
102+ thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*sve.cpp
103+ )
104+ # SVE vanilla Faiss dynamic dispatch related files
105+ knowhere_file_glob (
106+ GLOB
107+ FAISS_DD_SVE_SRCS
108+ thirdparty/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp
109+ thirdparty/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp
110+ )
111+ # combine files
112+ list (APPEND FAISS_SVE_SRCS ${FAISS_DD_SVE_SRCS} )
113+ # remove platform files from general files
114+ list (REMOVE_ITEM FAISS_SRCS ${FAISS_SVE_SRCS} )
115+
116+
117+ # RVV files
118+ knowhere_file_glob (
119+ GLOB
120+ FAISS_RVV_SRCS
121+ thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*rvv.cpp
122+ )
123+ # # RVE vanilla Faiss dynamic dispatch related files are not there yet
124+ # knowhere_file_glob(
125+ # GLOB
126+ # FAISS_DD_RVV_SRCS
127+ # )
128+ # # combine files
129+ # list(APPEND FAISS_RVV_SRCS ${FAISS_DD_RVV_SRCS})
130+ # remove platform files from general files
131+ list (REMOVE_ITEM FAISS_SRCS ${FAISS_RVV_SRCS} )
56132
57- list (REMOVE_ITEM FAISS_SRCS ${FAISS_AVX512_SRCS} )
58133
59134# disable RHNSW
60135knowhere_file_glob (GLOB FAISS_RHNSW_SRCS thirdparty/faiss/faiss/impl/RHNSW.cpp )
61136list (REMOVE_ITEM FAISS_SRCS ${FAISS_RHNSW_SRCS} )
62137
138+ # generate `knowhere_utils` library for x86
63139if (__X86_64)
64140 set (UTILS_SRC src/simd/distances_ref.cc src/simd/hook.cc)
65141 set (UTILS_SSE_SRC src/simd/distances_sse.cc)
@@ -92,8 +168,8 @@ if(__X86_64)
92168 target_link_libraries (knowhere_utils PUBLIC xxHash::xxhash )
93169endif ()
94170
171+ # generate `knowhere_utils` library for AARCH64
95172if (__AARCH64)
96-
97173 set (UTILS_SRC src/simd/distances_ref.cc src/simd/distances_neon.cc)
98174 set (UTILS_SVE_SRC src/simd/hook.cc src/simd/distances_sve.cc)
99175 set (ALL_UTILS_SRC ${UTILS_SRC} ${UTILS_SVE_SRC} )
@@ -169,6 +245,7 @@ if(__AARCH64)
169245 target_link_libraries (knowhere_utils PUBLIC xxHash::xxhash )
170246endif ()
171247
248+ # generate `knowhere_utils` library for RISCV64
172249if (__RISCV64)
173250 set (UTILS_SRC src/simd/hook.cc src/simd/distances_ref.cc src/simd/distances_rvv.cc)
174251 add_library (knowhere_utils STATIC ${UTILS_SRC} )
@@ -180,6 +257,7 @@ if(__RISCV64)
180257 )
181258endif ()
182259
260+ # generate `knowhere_utils` library for PPC64
183261# ToDo: Add distances_vsx.cc for powerpc64 SIMD acceleration
184262if (__PPC64)
185263 set (UTILS_SRC src/simd/hook.cc src/simd/distances_ref.cc src/simd/distances_powerpc.cc)
@@ -208,21 +286,8 @@ endif()
208286find_package (xxHash REQUIRED )
209287include_directories (${xxHash_INCLUDE_DIRS} )
210288
289+ # generate `faiss` library for x86
211290if (__X86_64)
212- list (REMOVE_ITEM FAISS_SRCS ${FAISS_AVX2_SRCS} )
213-
214- knowhere_file_glob (GLOB FAISS_NEON_SRCS
215- thirdparty/faiss/faiss/impl/*neon.cpp
216- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*neon.cpp
217- )
218- list (REMOVE_ITEM FAISS_SRCS ${FAISS_NEON_SRCS} )
219-
220- knowhere_file_glob (GLOB FAISS_RVV_SRCS
221- thirdparty/faiss/faiss/impl/*rvv.cpp
222- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*rvv.cpp
223- )
224- list (REMOVE_ITEM FAISS_SRCS ${FAISS_RVV_SRCS} )
225-
226291 add_library (faiss_avx2 OBJECT ${FAISS_AVX2_SRCS} )
227292 target_compile_options (faiss_avx2 PRIVATE $<$<COMPILE_LANGUAGE :CXX >: -msse4 .2
228293 -mavx2 -mfma -mf16c -mpopcnt >)
@@ -267,24 +332,11 @@ if(__X86_64)
267332 target_compile_definitions (faiss PRIVATE FINTEGER=int FAISS_ENABLE_DD COMPILE_SIMD_AVX2 COMPILE_SIMD_AVX512 )
268333endif ()
269334
335+ # generate `faiss` library for AARCH64
270336if (__AARCH64)
271- knowhere_file_glob (GLOB FAISS_AVX_SRCS
272- thirdparty/faiss/faiss/impl/*avx.cpp
273- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*avx.cpp
274- )
275- list (REMOVE_ITEM FAISS_SRCS ${FAISS_AVX_SRCS} )
276-
277- knowhere_file_glob (GLOB FAISS_RVV_SRCS
278- thirdparty/faiss/faiss/impl/*rvv.cpp
279- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*rvv.cpp
280- )
281- list (REMOVE_ITEM FAISS_SRCS ${FAISS_RVV_SRCS} )
282-
283337 add_library (faiss STATIC ${FAISS_SRCS} )
284338 target_include_directories (faiss PRIVATE ${Boost_INCLUDE_DIRS} )
285- target_sources (faiss PRIVATE
286- thirdparty/faiss/faiss/utils/simd_impl/distances_aarch64.cpp
287- )
339+ target_sources (faiss PRIVATE ${FAISS_NEON_SRCS} )
288340
289341 target_compile_options (
290342 faiss
@@ -296,27 +348,51 @@ if(__AARCH64)
296348 -Wno -unused -function
297349 -Wno -strict -aliasing >)
298350
351+ # SVE object library (compiled with SVE flags when available)
352+ set (SVE_AVAILABLE FALSE )
353+ if (HAS_ARMV9_SVE_BF16 OR HAS_ARMV8_SVE_BF16 OR HAS_ARMV9_SVE OR HAS_ARMV8_SVE)
354+ set (SVE_AVAILABLE TRUE )
355+ endif ()
356+
357+ if (SVE_AVAILABLE)
358+ add_library (faiss_sve OBJECT ${FAISS_SVE_SRCS} )
359+ target_include_directories (faiss_sve PRIVATE ${Boost_INCLUDE_DIRS} )
360+ target_compile_definitions (faiss_sve PRIVATE
361+ FINTEGER=int FAISS_ENABLE_DD COMPILE_SIMD_ARM_NEON COMPILE_SIMD_ARM_SVE )
362+ target_compile_options (
363+ faiss_sve
364+ PRIVATE $<$<COMPILE_LANGUAGE :CXX >:
365+ -Wno -sign -compare
366+ -Wno -unused -variable
367+ -Wno -reorder
368+ -Wno -unused -local -typedefs
369+ -Wno -unused -function
370+ -Wno -strict -aliasing >)
371+ if (HAS_ARMV9_SVE_BF16)
372+ target_compile_options (faiss_sve PRIVATE "-march=armv9-a+sve+bf16" )
373+ elseif (HAS_ARMV8_SVE_BF16)
374+ target_compile_options (faiss_sve PRIVATE "-march=armv8-a+sve+bf16" )
375+ elseif (HAS_ARMV9_SVE)
376+ target_compile_options (faiss_sve PRIVATE "-march=armv9-a+sve" )
377+ elseif (HAS_ARMV8_SVE)
378+ target_compile_options (faiss_sve PRIVATE "-march=armv8-a+sve" )
379+ endif ()
380+ endif ()
381+
299382 add_dependencies (faiss knowhere_utils )
300383 target_link_libraries (faiss PUBLIC OpenMP::OpenMP_CXX ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}
301384 knowhere_utils )
385+ if (SVE_AVAILABLE)
386+ target_link_libraries (faiss PUBLIC faiss_sve )
387+ endif ()
302388 target_compile_definitions (faiss PRIVATE FINTEGER=int FAISS_ENABLE_DD COMPILE_SIMD_ARM_NEON )
303389endif ()
304390
391+ # generate `faiss` library for RISCV64
305392if (__RISCV64)
306- knowhere_file_glob (GLOB FAISS_AVX_SRCS
307- thirdparty/faiss/faiss/impl/*avx.cpp
308- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*avx.cpp
309- )
310- list (REMOVE_ITEM FAISS_SRCS ${FAISS_AVX_SRCS} )
311-
312- knowhere_file_glob (GLOB FAISS_NEON_SRCS
313- thirdparty/faiss/faiss/impl/*neon.cpp
314- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*neon.cpp
315- )
316- list (REMOVE_ITEM FAISS_SRCS ${FAISS_NEON_SRCS} )
317-
318393 add_library (faiss STATIC ${FAISS_SRCS} )
319394 target_include_directories (faiss PRIVATE ${Boost_INCLUDE_DIRS} )
395+ target_sources (faiss PRIVATE ${FAISS_RVV_SRCS} )
320396
321397 target_compile_options (
322398 faiss
@@ -336,25 +412,8 @@ if(__RISCV64)
336412 target_compile_definitions (faiss PRIVATE FINTEGER=int )
337413endif ()
338414
415+ # generate `faiss` library for PPC64
339416if (__PPC64)
340- knowhere_file_glob (GLOB FAISS_AVX_SRCS
341- thirdparty/faiss/faiss/impl/*avx.cpp
342- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*avx.cpp
343- )
344- list (REMOVE_ITEM FAISS_SRCS ${FAISS_AVX_SRCS} )
345-
346- knowhere_file_glob (GLOB FAISS_NEON_SRCS
347- thirdparty/faiss/faiss/impl/*neon.cpp
348- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*neon.cpp
349- )
350- list (REMOVE_ITEM FAISS_SRCS ${FAISS_NEON_SRCS} )
351-
352- knowhere_file_glob (GLOB FAISS_RVV_SRCS
353- thirdparty/faiss/faiss/impl/*rvv.cpp
354- thirdparty/faiss/faiss/cppcontrib/knowhere/impl/*rvv.cpp
355- )
356- list (REMOVE_ITEM FAISS_SRCS ${FAISS_RVV_SRCS} )
357-
358417 add_library (faiss STATIC ${FAISS_SRCS} )
359418 target_include_directories (faiss PRIVATE ${Boost_INCLUDE_DIRS} )
360419
0 commit comments