Skip to content

Commit 4a0fba1

Browse files
algoriddlemeta-codesync[bot]
authored andcommitted
Add FastScanCodeScanner dispatch boundary with per-SIMD TUs (#4897)
Summary: Pull Request resolved: #4897 Add `FastScanCodeScanner`, a virtual base that bundles handler + kernel behind the SIMD dispatch boundary. In DD mode, `SINGLE_SIMD_LEVEL = NONE` so the existing fast scan code path uses emulated SIMD types. The new scanner provides per-SIMD translation units (AVX2, AVX512, ARM_NEON) compiled with the correct ISA flags, and a factory function (`make_fast_scan_knn_scanner`) that uses `DISPATCH_SIMDLevel` to select the right TU at runtime. This follows the proven `THE_LEVEL_TO_DISPATCH` pattern from the scalar quantizer per-SIMD TUs (`sq-dispatch.h`). Each per-SIMD TU includes `dispatching.h` which provides: - `ScannerMixIn<Handler>`: wraps a concrete handler and calls accumulation kernels (both search_1 multi-BB and QBS paths) - Factory specialization `make_fast_scan_scanner_impl<SL>()` with combinatorial dispatch over `is_max × with_id_map × handler_type` (SingleResultHandler for k=1, HeapHandler for k≤20, ReservoirHandler for k>20) New files: - `impl/fast_scan/dispatching.h` — dispatch template header - `impl/fast_scan/impl-avx2.cpp` — AVX2 per-SIMD TU - `impl/fast_scan/impl-avx512.cpp` — AVX512 per-SIMD TU - `impl/fast_scan/impl-neon.cpp` — ARM NEON TU (with ARM_SVE forwarding) Modified files: - `impl/fast_scan/pq4_fast_scan.h` — FastScanCodeScanner base + factory decl - `impl/fast_scan/pq4_fast_scan.cpp` — NONE specialization + dispatch wrapper - `xplat.bzl` / `CMakeLists.txt` — register SIMD files and header Note: RaBitQ handler is not wired through FastScanCodeScanner in this diff. That comes in later diffs when callers are switched. Reviewed By: mdouze Differential Revision: D95950483 fbshipit-source-id: 03841671f59c0d99de7d0c7408a64e7a8383a8e7
1 parent 5b83ec6 commit 4a0fba1

21 files changed

Lines changed: 590 additions & 76 deletions

faiss/CMakeLists.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,19 @@
99
# Architecture-specific: only include files for the current build architecture
1010
# =============================================================================
1111
set(FAISS_SIMD_AVX2_SRC
12+
impl/fast_scan/impl-avx2.cpp
1213
impl/pq_code_distance/pq_code_distance-avx2.cpp
1314
impl/scalar_quantizer/sq-avx2.cpp
1415
utils/simd_impl/distances_avx2.cpp
1516
)
1617
set(FAISS_SIMD_AVX512_SRC
18+
impl/fast_scan/impl-avx512.cpp
1719
impl/pq_code_distance/pq_code_distance-avx512.cpp
1820
impl/scalar_quantizer/sq-avx512.cpp
1921
utils/simd_impl/distances_avx512.cpp
2022
)
2123
set(FAISS_SIMD_NEON_SRC
24+
impl/fast_scan/impl-neon.cpp
2225
impl/scalar_quantizer/sq-neon.cpp
2326
utils/simd_impl/distances_aarch64.cpp
2427
)
@@ -117,7 +120,7 @@ set(FAISS_SRC
117120
impl/kmeans1d.cpp
118121
impl/lattice_Zn.cpp
119122
impl/mapped_io.cpp
120-
impl/fast_scan/pq4_fast_scan.cpp
123+
impl/fast_scan/fast_scan.cpp
121124
impl/fast_scan/pq4_fast_scan_search_1.cpp
122125
impl/fast_scan/pq4_fast_scan_search_qbs.cpp
123126
impl/residual_quantizer_encode_steps.cpp
@@ -262,7 +265,9 @@ set(FAISS_HEADERS
262265
impl/kmeans1d.h
263266
impl/lattice_Zn.h
264267
impl/platform_macros.h
265-
impl/fast_scan/pq4_fast_scan.h
268+
impl/fast_scan/accumulate_loops.h
269+
impl/fast_scan/dispatching.h
270+
impl/fast_scan/fast_scan.h
266271
impl/fast_scan/decompose_qbs.h
267272
impl/fast_scan/kernels_simd256.h
268273
impl/fast_scan/kernels_simd512.h

faiss/IndexAdditiveQuantizerFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <faiss/impl/LocalSearchQuantizer.h>
1515
#include <faiss/impl/ResidualQuantizer.h>
1616
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
17-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
17+
#include <faiss/impl/fast_scan/fast_scan.h>
1818
#include <faiss/utils/quantize_lut.h>
1919
#include <faiss/utils/utils.h>
2020

faiss/IndexFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include <faiss/impl/IDSelector.h>
1717
#include <faiss/impl/RaBitQUtils.h>
1818
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
19-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
19+
#include <faiss/impl/fast_scan/fast_scan.h>
2020
#include <faiss/impl/fast_scan/simd_result_handlers.h>
2121
#include <faiss/utils/hamming.h>
2222
#include <faiss/utils/quantize_lut.h>

faiss/IndexIVFAdditiveQuantizerFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include <faiss/impl/AuxIndexStructures.h>
1616
#include <faiss/impl/FaissAssert.h>
1717
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
18-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
18+
#include <faiss/impl/fast_scan/fast_scan.h>
1919
#include <faiss/impl/simd_dispatch.h>
2020
#include <faiss/invlists/BlockInvertedLists.h>
2121
#include <faiss/utils/distances.h>

faiss/IndexIVFFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include <faiss/impl/FaissAssert.h>
2020
#include <faiss/impl/RaBitQUtils.h>
2121
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
22-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
22+
#include <faiss/impl/fast_scan/fast_scan.h>
2323
#include <faiss/impl/fast_scan/simd_result_handlers.h>
2424
#include <faiss/invlists/BlockInvertedLists.h>
2525
#include <faiss/utils/hamming.h>

faiss/IndexIVFPQFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
#include <faiss/invlists/BlockInvertedLists.h>
2424

25-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
25+
#include <faiss/impl/fast_scan/fast_scan.h>
2626
#include <faiss/impl/fast_scan/simd_result_handlers.h>
2727

2828
namespace faiss {

faiss/IndexIVFRaBitQFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <faiss/impl/RaBitQUtils.h>
1818
#include <faiss/impl/RaBitQuantizerMultiBit.h>
1919
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
20-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
20+
#include <faiss/impl/fast_scan/fast_scan.h>
2121
#include <faiss/impl/fast_scan/simd_result_handlers.h>
2222
#include <faiss/invlists/BlockInvertedLists.h>
2323
#include <faiss/utils/distances.h>

faiss/IndexPQFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include <memory>
1111

1212
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
13-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
13+
#include <faiss/impl/fast_scan/fast_scan.h>
1414
#include <faiss/utils/utils.h>
1515

1616
namespace faiss {

faiss/IndexRaBitQFastScan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include <faiss/impl/RaBitQUtils.h>
1111
#include <faiss/impl/RaBitQuantizerMultiBit.h>
1212
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
13-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
13+
#include <faiss/impl/fast_scan/fast_scan.h>
1414
#include <faiss/utils/utils.h>
1515
#include <algorithm>
1616
#include <cmath>

faiss/impl/CodePackerRaBitQ.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77

88
#include <faiss/impl/CodePackerRaBitQ.h>
9-
#include <faiss/impl/fast_scan/pq4_fast_scan.h>
9+
#include <faiss/impl/fast_scan/fast_scan.h>
1010

1111
#include <cstring>
1212

0 commit comments

Comments
 (0)