Skip to content

Commit 50b0552

Browse files
further update faiss and fix libfaiss.cmake
Signed-off-by: Alexandr Guzhva <alexanderguzhva@gmail.com>
1 parent 164d34e commit 50b0552

208 files changed

Lines changed: 5361 additions & 3723 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmake/libs/libfaiss.cmake

Lines changed: 130 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ include(CheckCXXCompilerFlag)
22

33
include_directories(thirdparty/faiss)
44

5+
# all .cpp files
56
knowhere_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
3142
list(APPEND FAISS_AVX512_SRCS ${FAISS_DD_AVX512_SRCS})
43+
# remove platform files from general files
44+
list(REMOVE_ITEM FAISS_SRCS ${FAISS_AVX512_SRCS})
3245

46+
47+
# AVX2 files
3348
knowhere_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
4762
knowhere_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
5572
list(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
60135
knowhere_file_glob(GLOB FAISS_RHNSW_SRCS thirdparty/faiss/faiss/impl/RHNSW.cpp)
61136
list(REMOVE_ITEM FAISS_SRCS ${FAISS_RHNSW_SRCS})
62137

138+
# generate `knowhere_utils` library for x86
63139
if(__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)
93169
endif()
94170

171+
# generate `knowhere_utils` library for AARCH64
95172
if(__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)
170246
endif()
171247

248+
# generate `knowhere_utils` library for RISCV64
172249
if(__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
)
181258
endif()
182259

260+
# generate `knowhere_utils` library for PPC64
183261
# ToDo: Add distances_vsx.cc for powerpc64 SIMD acceleration
184262
if(__PPC64)
185263
set(UTILS_SRC src/simd/hook.cc src/simd/distances_ref.cc src/simd/distances_powerpc.cc)
@@ -208,21 +286,8 @@ endif()
208286
find_package(xxHash REQUIRED)
209287
include_directories(${xxHash_INCLUDE_DIRS})
210288

289+
# generate `faiss` library for x86
211290
if(__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)
268333
endif()
269334

335+
# generate `faiss` library for AARCH64
270336
if(__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)
303389
endif()
304390

391+
# generate `faiss` library for RISCV64
305392
if(__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)
337413
endif()
338414

415+
# generate `faiss` library for PPC64
339416
if(__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

thirdparty/faiss/.github/actions/build_cmake/action.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ runs:
7171
:
7272
# regular CUDA for GPU builds
7373
elif [ "${{ inputs.gpu }}" = "ON" ] && [ "${{ inputs.cuvs }}" = "OFF" ]; then
74-
conda install -y -q cuda-toolkit=12.6 gxx_linux-64=12.4 -c "nvidia/label/cuda-12.6"
74+
conda install -y -q cuda-libraries-dev=12.6 cuda-nvcc=12.6 cuda-nvtx=12.6 cuda-cupti=12.6 cuda-cudart-dev=12.6 gxx_linux-64=12.4 -c "nvidia/label/cuda-12.6"
7575
# and CUDA from cuVS channel for cuVS builds
7676
elif [ "${{ inputs.cuvs }}" = "ON" ]; then
77-
conda install -y -q libcuvs=25.10 'cuda-version=12.6' cuda-toolkit=12.6 gxx_linux-64=13.4.0 -c rapidsai -c rapidsai-nightly -c conda-forge
77+
conda install -y -q libcuvs=26.02 'cuda-version=12.9' cuda-toolkit=12.9 sysroot_linux-64=2.34 -c rapidsai -c rapidsai-nightly -c conda-forge
7878
fi
7979
8080
# install SVS runtime for SVS builds
@@ -87,7 +87,7 @@ runs:
8787
: # skip torch install via conda, we need to install via pip to get
8888
# ROCm-enabled version until it's supported in conda by PyTorch
8989
elif [ "${{ inputs.gpu }}" = "ON" ]; then
90-
conda install -y -q "pytorch>=2.7" "pytorch-gpu>=2.7" -c pytorch -c "nvidia/label/12.6"
90+
conda install -y -q "pytorch>=2.7" "pytorch-gpu>=2.7" -c pytorch -c "nvidia/label/12.9"
9191
else
9292
# TestLowLevelIVF.IVFRQ hangs on pytorch>=2.7, so left it as <2.5 for now.
9393
conda install -y -q "pytorch<2.5" -c pytorch
@@ -135,6 +135,10 @@ runs:
135135
sudo ln -s /lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib64/libc_nonshared.a
136136
sudo ln -s /usr/lib/x86_64-linux-gnu/libpthread.so.0 /lib64/libpthread.so.0
137137
sudo ln -s $HOME/miniconda3/x86_64-conda-linux-gnu/sysroot/usr/lib64/libpthread_nonshared.a /usr/lib64/libpthread_nonshared.a
138+
- name: Print GPU info
139+
if: inputs.gpu == 'ON'
140+
shell: bash
141+
run: nvidia-smi
138142
- name: Build all targets
139143
shell: bash
140144
run: |

thirdparty/faiss/.github/actions/build_conda/action.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ runs:
5454
conda list --show-channel-urls
5555
conda install -y -q anaconda-client
5656
conda config --set anaconda_upload yes
57+
- name: Print GPU info
58+
if: inputs.cuda != ''
59+
shell: ${{ steps.choose_shell.outputs.shell }}
60+
run: nvidia-smi
5761
- name: Conda build (CPU)
5862
if: inputs.label == '' && inputs.cuda == ''
5963
shell: ${{ steps.choose_shell.outputs.shell }}

0 commit comments

Comments
 (0)